教你打包Java程序,jar转exe随处可跑

简介:

  本文出自One Coder博客,转载请务必注明出处:http://www.coderli.com/archives/runnablejar-to-exe/

发现很多人问如何把Jar转成exe程序。可能是想双击运行和随处运行。其实这个并不难,我就简单总结几种方法,供大家参考,关键还是要知其所以然。

 
Java程序的运行不可能脱离JRE,不管你是Jar包还是exe程序。这点你必须了解。那么在没有JRE的机器上你的程序怎么跑?很简单,在你程序里带一份JRE就行了。
 
先介绍集中打包的方法:
 
Eclipse:

最简单直接的方法,选择你想打包的程序,右键export...

 

选择Runnable Jar file。(即可执行的Jar包)

 

选择你程序的主类,就是还有Main函数的类。点Finish即可。
 
在你的机器上,设置好Jar文件的打开方式(别默认用解压缩的工具打开就行),双击即可运行。

 

这个跟在命令行执行:
 
java -jar forfun.jar的效果是一样的。
 
其实一个Jar能运行,关键还是配置Jar内部的MANIFEST.MF文件。该文件存在于Jar包根目录的META-INF文件夹内。主要由于指定主类(Main)的位置:
 
Manifest-Version: 1.0
Main-Class: one.coder.jdk.JDKMain
 
版本可以自己指定,默认生成是1.0。主类位置需要指定。注意, Main-Class的冒号后,要跟一个空格。
如果你还有要依赖的Jar包,则可以配置Class-Path来指定。
 
Class-Path: ./ logback-core-0.9.29.jar junit-4.9.jar slf4j-api-1.
 6.1.jar logback-classic-0.9.29.jar hamcrest-core-1.1.jar
 
打开刚才生成的Jar文件,你可能发现多了一些Eclipse的东西,并且主类变成了
 
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
 
也就是通过Eclipse提供的这个主类来加载的你程序。如果你不喜欢这样,将其去掉。自己进行配置。笔者通过一个不依赖任何Jar包的小程序进行说明。

这是笔者打出Jar的内部截图,去掉所有跟我的程序不相关的东西。MANIFEST.MF的配置也很简单。
 
Manifest-Version: 1.0
Main-Class: one.coder.jdk.JDKMain
 
在有JRE的机器上,双击一样可以运行。
 
注:这里需要提一下,尽量不用用解压软件自带的编辑器进行编辑,如果你编辑后发现不能运行,提示打开jar错误等信息,很可能是由于你编辑的MANIFEST.MF文件的编码错误。导致无法解析。默认是采用ANSI编码格式的。不要改成UTF-8等。笔者被这个问题,困扰了近半个小时。
 
接下来说说在没有JRE的机器上怎么办?
 
最简单的手动的办法就是写一个bat脚本。并且带一份jre在你的程序里。

把图中的三个文件,放入同一个文件夹中。
start.bat内容如下:
 
.\jre7\bin\java -jar .\run.jar
 
说白了就似乎调用jre中的java命令,执行指定的jar程序。 双击start.bat,执行成功。
 
如果你非要打成exe程序,笔者推荐一个工具JSmooth。简单好用。同样这也肯定是需要JRE指定的。
关于JSmooth的教程,笔者找到了一个不错的教学贴: http://yisufuyou.iteye.com/blog/403556
 
按照里面的步骤,你一定可以成功。

说了这么多,如果还有什么不明白的,可以给我留言,一起讨论研究。
 
PS1:默认的JRE体积实在太大,你可以考虑精简JRE还节约空间,这部分内容,不在本文讨论。另外,如果你想把你的软件做成安装包的形势,可考虑InstallAnyWhere(http://www.flexerasoftware.com/products/installanywhere.htm)这个工具,会有
 
PS2:笔者研究的过程中,为了模拟没有JRE的环境,真是百般折腾,因为笔者把所有环境变量都删掉,还有可以运行。不知道是不是从JDK7开始,Java居然在我的System32路径下,也放置Java.exe等程序,也就是说,不用配置Path了。jre路径的指定,貌似也写入了注册表,不过这点,笔者没有亲自证实,只是在注册表中简单的搜索了一下,仅发现了JavaFX的配置和一些其他的Java配置,没有深入研究,不好定论。有兴趣可以研究下,也麻烦告诉我一声。
 
本文出自One Coder博客, 转载请务必注明出处: http://www.coderli.com/archives/runnablejar-to-exe/


     本文转自mushiqianmeng 51CTO博客,原文链接:http://blog.51cto.com/mushiqianmeng/900576,如需转载请自行联系原作者


相关文章
|
23天前
|
IDE Java Linux
Seata常见问题之重新打包以单独用jar来部署如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
99 1
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
1月前
|
SQL Oracle Java
sql文件批处理程序-java桌面应用
sql文件批处理程序-java桌面应用
25 0
|
1月前
|
存储 Java
Java:编写程序,计算两个数的和、差、积、商和余数。docx
Java:编写程序,计算两个数的和、差、积、商和余数。docx
|
6天前
|
Java Maven
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
【Java报错】显示错误“Error:java: 程序包org.springframework.boot不存在“
30 3
|
16天前
|
Java
java中jar启动设置内存大小java -jar 设置堆栈内存大小
java中jar启动设置内存大小java -jar 设置堆栈内存大小
11 1
|
21天前
|
Java
elasticsearch使用java程序添加删除修改
elasticsearch使用java程序添加删除修改
9 0
|
28天前
|
Java
java程序
re是java运行时的环境,包含jvm和运行时所需要的类库 jdk是java开的程序包,包含jre和开发人员使用的工具 jvm就是我们常说的java虚拟机,他是整个java实现跨平台的最核心 的部分,所有的java程序会首先被编译为.class的类文件,这种类文 件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统 相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释 给本地系统执行。 只有jvm还不能成class的执行,因为再解释class的时候jvm需要调用 解释所需要的类库lib,而jre包含lib类库。jvm屏蔽了与具体操作系 统平台相关的信息,使得java程
16 0
|
30天前
|
NoSQL Java 应用服务中间件
使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包
使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包
使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包
|
1月前
|
Oracle Java 关系型数据库
【问题】Cause: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
【问题】Cause: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK