`
thomas0988
  • 浏览: 472741 次
  • 性别: Icon_minigender_1
  • 来自: 南阳
社区版块
存档分类
最新评论

java生成exe

阅读更多
  这个是borland不公开的使用技巧,能够通过jbuilder来制作exe文件来启动java文件。jbuilder并不支持本地编译机制。但是有一个隐藏的技巧可以让你从可执行文件来启动java程序,可以出现或者不出现console窗口。想做到这些,需要jbuilder的bin目录下的这些文件: 

  jbuilder.exe 
  jbuilderw.exe (可选) 
  jbuilder.config 
  jdk.config 
  javalauncher.dll    

  “jbuilder.exe”是一个通用的可执行外壳文件,用以启动java程序,”jbuilderw.exe“好像是javaw.exe一样,它把”jbuilder.exe”包装起来,但是运行时候不显示那个console的窗口。使用这些文件的关键是文件名。“jbuilder.exe”查找一个文件叫”jbuilder.config”的配置文件,里面包含了运行java程序的必须信息。同样的”jbuilderw.exe”查找”jbuilder.exe”来启动不带console窗口的java程序。如果把jbuilder.exe重命名为”foo.exe”,那”foo.exe”将去寻找”foo.config”配置文件,同样”jbuilderw.exe”被重命名为”foow.exe”,它会去寻找”foo.exe”文件。 

  说到这里,聪明的读者应该猜到怎样利用jbuilder.exe来启动应用程序了。只要把jbuilder.exe,jbuilerw.exe,jbuilder.config改名成相应的文件名,在jbuilder.config里面指定主类和类路径,就能够通过执行jbuilder.exe(或者被改名后的exe文件)来启动java应用程序了。下面是用本机为例。 

   borland jbuilder 5被安装在e:\jbuilder5\目录下,在e:\jbuilder5\bin\下建立一个temp目录,然后把jbuilder.exe,jbuilder.config,javalauncher.dll,jdk.config四个文件拷贝到:\jbuilder5\bin\temp\目录下,然后在这个目录下建立一个hello目录,在这个目录下生成一个hello.java文件,即e:\jbuilder5\bin\temp\hello\hello.java文件,file://hello.java/package hello; 

  public class hello{ 
  public static void main(string s[]){ 
  system.out.println("hello, exe file!"); 
  } 
  }   

  然后打开jbuilder.config文件,作相应的修改: 
  在jbuilder.config里面找到下面两行 

  # start jbuilder using the its main class 
  mainclass com.borland.jbuilder.jbuilder   

  修改为 

  # start jbuilder using the its main class 
  mainclass hello.hello 
  addpath e:/jbuilder5/bin/temp/    

 addpath命令是把目录加入类路径中,这个命令和其它config里面可以识别的命令可以在jbuilder/bin目录下的config_readme.txt里面找到详细说明。 

  然后将jdk.config里面的javapath修改成相对的路径,例如原来是 

  javapath ../jdk1.3/bin/java 

  修改成 

  javapath ../../jdk1.3/bin/java    

  最后 

  将jbuilder.exe,jbuilder.config修改成所需要的文件名,例如foo.exe和foo.config文件 。   

  现在执行foo.exe文件     

  至此,通过修改jbuilder来使用exe文件启动自己的java应用程序已经完成了。   

  但是好玩的地方并不在这个地方,下面的小技巧可能更有趣,将jar文件打包进入exe文件!   

  假设利用上面的文件,生成hello.jar包,执行过程. 

  jar cvf hello.jar hello\*.class    

  将类文件打包成exe文件   

  然后将jar包附加到jbuilder.exe后面去. 

  copy /b ..\jbuilder.exe+hello.jar foo.exe    

  将jar文件转化成exe文件   

  在foo.config(jbuilder.config)文件里面把前面加入的类路径去掉,并加入下面的路径: 

  addpath e:/jbuilder5/bin/temp/foo.exe 

  然后执行. 
   
  看到了么?一个含jar包的exe文件被执行了! 

  这个过程的大致原理是:exe文件的重要信息都在文件头部,所以把乱七八糟的东西放exe文件尾部是不要紧的;而jar/zip文件的重要信息是在文件尾部的,这样它们两不相干,能够容 易的被执行。

 

 

1.先生成.jar包,再生成.exe文件
编写manifest.mf文件
manifest.mf中的内容:
Manifest-Version: 1.0
Main-Class:test.Application1
Created-By:snowpine
只有Main-Class是有用的,“Created-By: snowpine”是指这个.jar文件的作者

比如你有个Application1.class文件,在d:\test下,那么把manifest.mf放在d:\就可以了。
然后在d:\运行,jar cvfm test.jar manifest.mf test,就可以在d:\下生成test.jar

然后利用exe4j可以生成.exe的可执行文件 注: .exe必须在装有jdk机器才能运行

2.jbuider编辑器生成.exe文件

执行wizards—native executable builder—全部next,完成后,在编译一次,就自动生成了.exe文件

3.在jbuilder中用wizards—archive builder生成.jar包(自动生成manifest.mf文件),然后在用exe4j生成.exe文件.

注:exe4j中有个main class,要填写manifest.mf中main-class后的名字

 

 

 

几种java转exe的工具,进行一下比较,谈谈自己的看法:

1. 从www.towerj.com获得一个TowerJ编译器,该编译器可以将你的CLASS文件编译成EXE文件。
注:现在已经找不到,不提供了,被人家收购了。

2. 利用微软的SDK-Java 4.0所提供的jexegen.exe创建EXE文件,这个软件可以从微软的网站免费下载地址如下:
http://www.microsoft.com/java/download/dl_sdk40.htm    

jexegen的语法如下:

jexegen /OUT:exe_file_name
/MAIN:main_class_name main_class_file_name.class
[and other classes]

注:没有试过

3. Visual Cafe提供了一个能够创建EXE文件的本地编译器。你需要安装该光盘上提供的EXE组件。
注:没有试过

4. 使用InstallAnywhere创建安装盘。
注:很不错的工具。
但就是要>8M(带jre),还有一种是>1M的(不带jre)。
但是它可以编译成各种平台上可以使用的exe程序。

5. 使用IBM AlphaWorks提供的一个高性能Java编译器,该编译器可以从下面的地址获得:
http://www.alphaworks.ibm.com/tech/hpc    

注:没有试过

6. JET是一个优秀的Java语言本地编译器。该编译器可以从这个网站获得一个测试版本:
http://www.excelsior-usa.com/jet.html    

注:不喜欢。
编译好的程序还是jre的,听说正版的可以不能jre。安装好还要编译,我用了30分钟。

7. Instantiations公司的JOVE
http://www.instantiations.com/jove/...ejovesystem.htm    
JOVE公司合并了以前的SuperCede,一个优秀的本地编译器,现在SuperCede已经不复存在了。

注:太烦了,老是出来一个对话框
用过,会出来一个对话框,表示这是jove公司的产品

8. JToEXE
Bravo Zulu Consulting, Inc开发的一款本地编译器,本来可以从该公司的网页上免费下载的,不过目前在该公司的主页上找不到了。
公司主页:http://www.bravozulu.com/    
下面这个FTP上曾经有过这个软件,不知道现在是不是还在:
ftp://race.dlut.edu.cn/pub/java/tools/jet

注:很烦了,老是出来一个对话框,但是没有想到我找到了crack,在google上找到。
现在去掉了那个对话框后,我很喜欢这个工具,虽然它需要jre,但是文件只有100多K,很好哦。

9.Exe4j
很不错

10.jbuilder
这个工具不用多讲了,在jbuilder6.0以前的(包括6.0),是不能生成exe文件的,所以可以用如下的方法实现。这可以人家高手想出来的,我只是帮着宣传一下。
还有jbuilder7.0开始都可以生成exe文件。

这个是Borland不公开的使用技巧,能够通过JBuilder来制作exe文件来启动Java文件。
JBuilder并不支持本地编译机制。但是有一个隐藏的技巧可以让你从可执行文件来启动Java程序,可以出现或者不出现console窗口。想做到这些,需要JBuilder的bin目录下的这些文件:
JBuilder.exe
JBuilderW.exe (可选)
JBuilder.config
jdk.config
JavaLauncher.dll
“JBuilder.exe”是一个通用的可执行外壳文件,用以启动Java程序,”JBuilderW.exe“好像是javaw.exe一样,它把”JBuilder.exe”包装起来,但是运行时候不显示那个console的窗口。使用这些文件的关键是文件名。“JBuilder.exe”查找一个文件叫”JBuilder.config”的配置文件,里面包含了运行Java程序的必须信息。同样的”JBuilderW.exe”查找”JBuilder.exe”来启动不带Console窗口的Java程序。如果把JBuilder.exe重命名为”foo
.exe”,那”foo.exe”将去寻找”foo.config”配置文件,同样”JBuilderW.exe”被重命名为”fooW.exe”,它会去寻找”foo.exe”文件。
说到这里,聪明的读者应该猜到怎样利用JBuilder.exe来启动应用程序了。只要把JBuilder.exe,JBuilerW.exe,JBuilder.config改名成相应的文件名,在JBuilder.config里面指定主类和类路径,就能够通过执行JBuilder.exe(或者被改名后的exe文件)来启动Java应用程序了。下面是用本机为例。
Borland JBuilder 5被安装在E:\jbuilder5\目录下,在E:\jbuilder5\bin\下建立一个temp目录,然后把JBuilder.exe,JBuilder.config,JavaLauncher.dll,jdk.config四个文件拷贝到E:\jbuilder5\bin\temp\目录下,然后在这个目录下建立一个hello目录,在这个目录下生成一个hello.java文件,即E:\jbuilder5\bin\temp\hello\hello.java文件,
//hello.java/
package hello;
public class hello{
public static void main(String s[]){
   System.out.println("Hello, Exe file!");
}
}
编译成class文件,然后打开Jbuilder.config文件,作相应的修改:
在JBuilder.config里面找到下面两行
# Start JBuilder using the its main class
mainclass com.borland.jbuilder.JBuilder
修改为
# Start JBuilder using the its main class
mainclass hello.hello
addpath E:/jbuilder5/bin/temp/
addpath命令是把目录加入类路径中,这个命令和其它config里面可以识别的命令可以在JBuilder/bin目录下的config_readme.txt里面找到详细说明。
然后将jdk.config里面的javapath修改成相对的路径,例如原来是
javapath ../jdk1.3/bin/java
修改成
javapath ../../jdk1.3/bin/java
最后
将JBuilder.exe,JBuilder.config修改成所需要的文件名,例如foo.exe和foo.config文件。
现在执行foo.exe文件
至此,通过修改JBuilder来使用exe文件启动自己的Java应用程序已经完成了。
但是好玩的地方并不在这个地方,下面的小技巧可能更有趣,将Jar文件打包进入exe文件!
假设利用上面的文件,生成hello.jar包,
jar cvf hello.jar hello\*.class
然后将jar包附加到JBuilder.exe后面去,
copy /b ..\JBuilder.exe+hello.jar foo.exe
在foo.config(JBuilder.config)文件里面把前面加入的类路径去掉,并加入下面的路径:
addpath E:/jbuilder5/bin/temp/foo.exe
然后执行,foo.exe
看到了么?一个含jar包的exe文件被执行了!
这个过程的大致原理是:exe文件的重要信息都在文件头部,所以把乱七八糟的东西放exe文件尾部是不要紧的;而jar/zip文件的重要信息是在文件尾部的,这样它们两不相干,能够容易的被执行。
请注意:读者如果使用这个功能,得自己承担可能带来的风险,因为Borland对这个功能不提供官方的支持! 

 

 

一般来说使用JSmooth可以把纯Java程序封装成windows的可执行文件。

如果你做的是SWT应用程序,那得需要写个Lancher来加载一些本地文件然后启动程序,下面是我在具体<nobr>项目</nobr>中写的样例<nobr>代码</nobr>,你可以参考一下:
Copy code

public class Lanucher {

public static void main(String[] args) {
  Runtime runtime = Runtime.getRuntime();
  String homePath = null;
  if (args.length > 0) {
    homePath = args[0];
  }

  if (homePath == null) {
    homePath = System.getProperty("user.dir");
  }

  if (homePath == null) {
    //如果主目录信息不存在, 则抛出错误, 然后关闭程序.
    System.err.println("错误:系统没有指定主目录路径, 请<nobr>联系</nobr>系统管理员.");
    execute(runtime, "pause");
  } else {

    System.out.println("1.使用主目录:" + homePath);

    //启动应用程序.
    String libPath = homePath + "/lib";
    File libFile = new File(libPath);
    File[] jarFiles = libFile.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
      return name.endsWith(".jar") || name.endsWith(".JAR");
    }
    });
    String classpath = libPath;
    if (jarFiles != null) {
    for (int i = 0; i < jarFiles.length; i++) {
      String jarFilePath = jarFiles[i].getPath();
      System.out.println("2.添加库文件:" + jarFilePath);
      classpath += ";" + jarFilePath;
    }
    }
    String execute = ("\"" +
              homePath + "/jre/bin/java\" -classpath \"" +
              classpath + "\" -Djava.library.path=\"" +
              libPath + "\" com.yipsilon.lifestyle.Application " +
              homePath).replace('\\', '/');

    System.out.println("3.执行程序:" + execute);

    execute(runtime, execute);
  }
}

private static void execute(Runtime runtime, String command) {
  try {
    runtime.exec(command);
  } catch (IOException ioe) {
    //如果主目录信息不存在, 则抛出错误, 然后关闭程序.
    System.err.println("错误:执行主程序时出现错误.\n\n" + ioe.getMessage());
    try {
    runtime.exec("pause");
    } catch (IOException ignore) {
    }
  }
}
}

 

 

 

 

关键字:   java生成exe    

exe4j.exe下载地址: http://download.ej-technologies.com/exe4j/exe4j_windows_4_0_1.exe

第一次安装时会出现下面的对话框:


它要求系统有1.5版本以上的JDK,点Download在线下载,如果你的机器上有JDK,点Locate找到你机器上已安装的JDK目录下/bin/java.exe就可以进行安装了。
下面就安装过程详细说明一下:
第1步,默认即可。
第2步,如果已经有制作好的jar文件,则下面一个"JAR in EXE"。
对于打包jar文件,在eclipse中右击项目选导出即可,不会制作jar文件可以给我留言


第3步,上面是项目名称,可随便填写,下面一个写出你想要将打包后的exe文件输出的目录:


第4步,由于我的演示程序是图形的,所以选第一个,如果你的程序是控制台的,则选择第二个,Executable name写你将要生成的exe文件的名字,Icon File可以选择生成文件的图标


第5步,首先,单击绿色的"+"号,在弹出的窗口中点Archive,然后找到起初已经做好的jar文件,"OK"后返回,在下面的Class Path里就出现jar文件路径后,再在上面Main Class栏内点击找到main所在的类,这一步即算完成:


第6步,你系统的JRE版本,上面填个1.3,下面填1.6:


当然,这样配置的程序只能在安装有JRE的机器上执行,发布时总要考虑的问题就是用户是否有能力在自己机器上安装JRE,总不能发布一个程序还要用户自己安装个JRE吧,下面我就介绍如何将JDK环境变量动态打包到exe中,在这里单击advanced options,选择search sequence。如图:


首先把JRE复制到exe文件输出的目录里,我用的是c:\xaocker\,在弹出的窗口中,删除列表中所有项,然后单击绿+,选择directory并选择JRE的根目录(注意是拷贝后的目录)即可,如图:


单击ok后,再从图中单击advanced options,并选择preferred VM,在弹出的窗口中选择client hostspot VM,单击next按钮继续:


第7、8步是一些基本配置,默认即可,第9步编译,第10步你就可以点这个看到效果了:


exe4j未注册的版本会出现下面的对话框:


点击确定之后就可以看到你程序的运行结果了!

java.exe依照一套逻辑来寻找可以用的JRE,首先查找自己所在的目录下有没有JRE,其次查找自己的父目录下有没有JRE;最后才是查询Windows的注册表。

现在我们的程序可以在任意的计算机上执行了,可是缺点是致命的,比方说我的程序才160K,可是不论走到哪里都要背着70多M的JRE,未免有点小题大做吧,其实作为我们的私有的JRE,好多内容都是可以抛弃的。Jre目录下的license都可以不要,bin下的执行文件只需要保留java.exe或者javaw.exe,lib下只要保留rt,jsse,jce,charsets几个库就可以了。除了i386和zi两个子目录外,其余的子目录都可以不要。Zi下只需要保留自己地区的子目录和其下的一些文件就可以。Lib下除了库之外的属性文件等等都要保留。这样清理一番,JRE仍然有接近50MB。还可以继续清理几个库文件里面不需要的内容,这需要仔细的整理,会很费功夫。最好能写出一个自动工具帮助我们整理它们。从Sun公司上下到的JMF里面附带的用Java写的媒体播放器就自带了JRE,只有几个MB。
清理过后需要运行几遍我们的应用程序,以确保我们的JRE不缺少东西。

OK,仔细清理之后,文件变小了不少,可以发布了……

分享到:
评论
1 楼 56553655 2010-09-09  
博主,我看你说得太复杂了,看看这篇:
将JAVA打成EXE文件,同时将JRE打包,可以没有JRE的电脑上运行
http://56553655.iteye.com/blog/759694

相关推荐

Global site tag (gtag.js) - Google Analytics