JAVA技巧(手编写启动JAVA程序的EXE文件)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

有⼤多的Java⼈,在四处寻找能将jar打包成exe的⼯具,另我⼗分不解的是为什么要打包呢,其实⽬的⽆⾮是想⽤exe启动⽽已,其实打包真的没什么好处,⼀个5m的程序打包成exe还可以,如果⼀个100m的程序呢?如果这个100m的程序同时还要集成jre呢.打包后启动速度应该不⽤我多说,⽽且⽬前⼏乎所有打包程序都不是很完美,之所以这些打包程序还可以使⽤,是因为他们失效的情况,只在很特别的场景下才能遇到,这些⼯具我也⽤过⼀些,感觉不尽如⼈意.
其实我们平时使⽤的90%的程序都不是⼀个exe就能搞定的,⽽是很多个⽂件,我们只是⽤⼀个exe⽂件启动程序⽽已,本这这个思想,我⼀直想写个java 的exe启动器,因为我还略懂点c++和delphi,当然只是⽪⽑了,好在完成这件事只⽤⽪⽑的知识应该⾜以.虽说做起来也遇到很多困难,不过最后还是完成了.
所以这次考试⼤写了个Delphi版的
在放代码前,先介绍下这个⼯具,暂时我给它起的名字也叫javalauncher
使⽤⽅法:
⽂件存放结构
Test.jar
javalauncher.ini
javalauncher.exe
jre
test.jar是要启动的java程序,这个有点像废话
jre是jre,还是废话,不过这个jre可以选择精简版的,我选择的这个精简版只有15M
如果test.jar依赖了其他的jar包,可以放置在\jre\lib\ext⾥⾯或者
修改test.jar中的META-INF\MANIFEST.MF⽂件
添加如下⾏
Class-Path: swt.jar
稍后我提供的demo是将swt.jar放置在了jre\lib\ext中.因为我的demo是⽤swt写的,因为⽤swt写的话可以把jre中swing相关的类都删掉.节省不少空间呢.
让我们看看javalauncher.ini配置⽂件是如何编写的吧
[/sunyujia]
command=./jre/bin/javaw.exe
options= -jar Test.jar
command是指明javaw所在位置,可以⽤相对路径,如果是使⽤系统中已经安装的jre直接写javaw.exe即可
options是javaw的参数
⾮常遗憾的是,考试⼤发现我们⽇常平时使⽤的命令java 包.类,这种写法并不⽀持,也就是说想⽤这个⼯具启动必须使⽤-jar 我⽬前尚未找到原因,初步分析,通过delphi的ShellExecute给javaw.exe传递参数时,javaw.exe只能识别-开头的参数
好在javaw的所有参数都是-开头的,只有上⾯说的那种情况不是.
我已经将⼯具和例⼦上传到 /source/743727
这个例⼦只有10m可在没有安装jre的机器上执⾏,例⼦是基于swt的写的.
启动这个例⼦的⽅法只要运⾏javalauncher.exe即可.想要给这个exe换图标的话,⼤家可以使⽤ResHacker这个⼯具
⼤家以后可以通过例⼦中的javalauncher.exe来启动java程序了,多么美好的事情,^_^
告诉⼤家个秘密,这个exe的⽂件名是可以更改的,⽐如改成abc.exe,相映的修改javalauncher.ini为abc.ini即可
考试⼤相信此⽂的更多读者希望看到的是java源码,对delphi⼀定是不感冒了,所以我还是先放这次⽤于测试的java例⼦的源码吧.
package com.syj;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import yout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class HelloSWT {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(450, 100);
shell.setText("所⽤JRE是:" + System.getProperty("java.home"));
shell.setLayout(new FillLayout());
final Button button = new Button(shell, SWT.FLAT);
button.setText("/".concat("sunyujia"));
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
try {
Runtime.getRuntime().exec(
"rundll32 url.dll,FileProtocolHandler http://"
+ button.getText());
} catch (Exception e) {
e.printStackTrace();
}
}
});
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
}
}
下⾯是delphi源码
unit Unit5;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, shellapi ,inifiles;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
JvmConfig:TInifile;
command,options,ConfigFileName: String;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
application.ShowMainForm:=false;//隐藏窗体
ConfigFileName:=ExtractFileName(Application.ExeName);//获取当前程序⽂件名
ConfigFileName:=Copy(ConfigFileName,1,Length(ConfigFileName)-Length(ExtractFileExt(ConfigFileName)));//获取去掉扩展名
ConfigFileName:=GetCurrentDir+'\'+ConfigFileName+'.ini';//拼凑成与同当前exe⽂件同名的ini⽂件
//showmessage(ConfigFileName);//use debug
JvmConfig:=TIniFile.Create(ConfigFileName); //读取ini⽂件
command:=JvmConfig.ReadString('/sunyujia','command','');
options:=JvmConfig.ReadString('/sunyujia','options','');
//showmessage(command); //use debug command
//showmessage(options); //use debug options
JvmConfig.Free;
ShellExecute(Application.Handle, 'open', pchar(command), pchar(options),pchar(GetCurrentDir) , 1);
application.Terminate;
end;
end.。

相关文档
最新文档