最近刚刚做了一个小游戏,想打包给同学玩一下,后来又发现没有JRE的电脑无法运行jar包,所以上网找了一下办法,想生成exe可执行程序并且可以打包发布。
java代码如何打包成jar文件并且装换成可执行的exe文件
这是别的大神的链接,但是按照这样的方法生成的EXE却无法运行,可能是我的exe4j的版本不一致导致,我尝试了几次,EXE可以本机运行,但还是无法在别的电脑上运行
打包生成jar包
首先是将代码打包成jar包
右击项目,点击Export
然后选择JAR file,点击next
.classpath和.project不要勾选,系统默认的是勾选
下面是选择导出的路径,自己根据情况选择一个路径,点next
一切默认,点next
这里用自己的MANIFEST.MF文件,至于这个文件怎么建,自己去百度,然后点finish
出现警告,不必理会,点击OK,然后在自己对应的文件夹就会生成一个jar包,在本机以及装有JRE的电脑双击这个jar包均可正常运行,没有运行环境的无法运行
生成exe可执行程序
jar包已经打包完成,下面就是要生成exe可执行程序
工具使用的是exe4j,下载安装可以到网上找
打开exe4j
出现如下界面,点击next
选择JAR in EXE mode,点击next
在short name of your application给你的应用起个名字
在Output Directory填上你要生成EXE的路径,一般就是生成jar包的位置,然后next
第一个框为要生成的EXE取个名字,第二个框给EXE选择一个ico文件,没有直接可以默认不填,下面的打圈√如果不想一台电脑上运行多个此程序可以勾上,然后next
点击绿色的加号,设置程序执行的classpath
填上你要选择的可执行jar包,OK
点击红框位置
exe4j会自动搜索所有的main方法,点击选择,然后点OK
出现下图
点击next
填写运行最低JDK版本号,点击next
点击绿色加号添加捆绑JRE的位置,点击OK
如图,点next
生成EXE
完成,点击Exit退出
保存配置信息
这样在相应的位置下就会生成EXE文件,双击可以运行
一开始生成的这个EXE运行时会提示 no JVM 错误
并且提示需要32位JDK,这个应该是跟exe4j的版本有所联系,于是我又安装了32位JDK,将eclipse中的JDK换成了新安装的JDK,重新编译了程序,并且再次打包成jar包,在生成EXE是绑定的也是这个32位的JDK,并且配置了EXE4J-JAVA-HOME变量,然后再次生成EXE,此时EXE可以再本机运行了,但是依然无法在别的电脑运行,我想可能是生成EXE是捆绑的JRE的路径有问题,但是检查了几次,上网找资料,发现有人说了这么一段话:生成.exe文件只是套了一个外壳而已,不能生成可执行文件exe
java文件依靠java虚拟机运行,没有jre(java runtime environment)的电脑永远都无法运行。
exe是依靠微软的运行库运行。
这两个平台完全不一样。
综上所述,写好的java代码无法弄成可执行exe文件。就算按照楼主所说的方法生成了exe,也无法在没有jre环境的电脑上运行.
先不说这段话是对是错,是不是过于主观,但是隐隐约约觉得问题肯定就是出在了JRE上,关键是怎么把这么运行环境也打包到没有JRE的电脑上
生成安装包
经过了之前的摸索,但是还是不能在别的电脑运行,浪费了不少时间,但是放弃又心有不甘,干脆一不做二不休,把JDK和EXE打包成一个安装包,然后再在别的电脑上进行安装,试试能不能运行
工具:Inno Setup
生成脚本程序
下载安装好,然后就可以开始了,点击运行
出现这个界面可以直接关掉自己编辑脚本程序,但是如果不熟悉写法,可以按照下面的教程使用。
使用教程
自己按照步骤配置好,接下来编译脚本程序,此脚本程序是根据上面教程你的选择操作所生成,大概查看一下
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{F21ED7F6-6A12-4499-837A-9C0E8333D90E}
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
AppPublisher=Quan
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName=F:\Myshootsetup\My Program
DisableProgramGroupPage=yes
OutputDir=F:\Myshootsetup
OutputBaseFilename=Myshootsetup
Compression=lzma
SolidCompression=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "F:\Myshoot2\MyshootWith31JDK.jar"; DestDir: "{app}"; Flags: ignoreversion
Source: "F:\Myshoot2\jdk32bit\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "F:\Myshoot2\lib\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{commonprograms}\My Program"; Filename: "{app}\Myshoot.exe"
Name: "{commondesktop}\My Program"; Filename: "{app}\Myshoot.exe"; Tasks: desktopicon
[Run]
Filename: "{app}\Myshoot.exe"; Description: "{cm:LaunchProgram,My Program}"; Flags: nowait postinstall skipifsilent
有些解释一下:
[Setup这个段包含用于安装程序和卸载程序的全局设置。
AppName(要安装的)程序名称
AppVersion程序版本号
DefaultDirName安装时默认的文件夹
DefaultGroupName快捷菜单或开始菜单的默认文件夹
OutputDir安装程序的输出路径
[Files]这是定义安装程序安装文件到用户系统中的可选文件段。
Source资源文件
DestDir文件安装到用户系统中的目录。
[Icons]这个可选段定义所有创建在开始菜单和/或其它位置 (比如桌面)的快捷方式。
Name要创建的快捷方式的名字和位置。
Filename捷方式的命令行文件名,通常用一个目录常量开头。
编译
脚本程序编辑好了,点击run编译
编译完成
这时候就会在你选中的路径中生成一个EXE安装程序,但是由于没有精简JRE,所以程序会显得十分臃肿,而且很不合理
然后就生成了一个可供安装的安装程序,似乎是大功告成了,兴高采烈地拿到别的电脑安装,发现还是运行不了,此时虽然心里情绪剧烈翻腾,但还是要告诉自己,冷静冷静,别砸电脑,留得青山在不愁没柴烧
这个坑以后有时间我再来踩踩,现在时机还不成熟