用Java 开发程序,发布时总要考虑的问题就是怎么在使用者的机器上装好JRE。要考虑的问题很多:使用者有没有能力独自安装JRE,使用者已有的JRE和我们需要 的版本是不是一致,会不会出现版本问题,等等。使用.NET要考虑的问题就少些。现在.NET CLR似乎已经很普及了,看好多D版的Win XP都会自己安装最新的.NET CLR,而且似乎它的安装界面也比JRE友好些。彻底解决安装JRE的问题的方案,就是让我们的应用程序自己背着JRE!这样,我们的程序就像传统的 Win32应用程序一样,双击就可以执行,不用管所在的机器上是否有JRE,是什么版本的JRE,无论怎样,我有我自己的!要做到这一点,其实非常容易。
王 森在他的《Java深度历险》(强力推荐这本书,内容少而精)的第一章就解释了JDK,JRE,JVM之间的关系。解释了我们执行java.exe时发生 的事情。其中提到,java.exe依照一套逻辑来寻找可以用的JRE,首先查找自己所在的目录下有没有JRE(据王森讲这样说不确切,我没有JDK全部 的源代码,在此无从考证);其次查找自己的父目录下有没有JRE;最后才是查询Windows的注册表。
通常我们在安装好了JRE的机器上的任何 一个目录下都可以执行java.exe。因为它在安装时被复制到了windows的system32目录下,而后者无论如何都会在path环境变量中。这 个java.exe最终必然会访问注册表来确定真正的JRE的所在地。若我们要求每一个应用程序都自带JRE,必然不能走这条路。但,逻辑的第二条讲, java.exe会在它的父目录下查找JRE,解决方案就在这一条中。
假设我们的应用程序打好了包,叫做MyApp.jar,放在MyApp的目 录下。我们在MyApp目录下,可以执行java –jar MyApp.jar来运行我们的程序。我们安装的是JRE 1.5,在C:\Program Files\Java\jre1.5.0下。现在,我们只需要简单的将jre1.5.0目录搬到MyApp目录下,顺便改个容易写的名字比如叫jre。现 在,我们的应用程序就象这样:
MyApp
MyApp.jar
Jre
Jre1.5.0目录下的全部内容
Java.exe 就在jre目录下的bin目录中。根据第二条逻辑,java.exe会在它的父目录中查找jre,实验证实,它会查找lib目录,而lib就在jre目录 下。因此,这样java.exe就会确定jre的所在然后正常执行java程序,不会去管我们是否安装了JRE,注册表中是否有注册项这些杂事了。
试一下,在命令行下进入MyApp的目录下,假设它在C盘,将path指向MyApp下的JRE:
set path=c:\MyApp\jre\bin
然后运行:
java –verbose –jar MyApp.jar
加上verbose参数以确定我们确实用了这一套被搬出了家的JRE。
程序可以运行,并且在命令行输出的前几行,可以看到:
[Opened C:\MyApp\jre\lib\rt.jar]
[Opened C:\MyApp\jre\lib\jsse.jar]
[Opened C:\MyApp\jre\lib\jce.jar]
[Opened C:\MyApp\jre\lib\charsets.jar]
因此程序读取的确实是它的私有的JRE。
至 此,我们似乎完成了任务。但是现在我们的私有JRE仍不完美,缺点是太大。JRE 1.5有接近70MB,作为我们的私有的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不缺少东西。
如果我们希望能有一个程序直接启动我们的应用程序,那就还要费些功夫。最简单的方法是弄出一个快捷方式来,但是快捷方式的路径不能是相对的,不方便我们安装。我想到的方案就是用Win32程序包装一下。在VS.NET下写一个Win32小程序:
int PASCAL WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( "jre\\bin\\javaw.exe",//执行的程序名
"jre\\bin\\javaw.exe -jar MyApp.jar", // 带参数的执行程序
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
ErrorExit( "CreateProcess failed." );
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
基本上是按照MSDN文档中的例子照搬的。将它编译成一个EXE文件,我们的任务才全部完成。双击这个EXE文件,我们的程序启动了,看起来和传统的Win32程序没有两样,JRE完全被隐藏在底层。
补充几条:
一、exe4j。
说明:exe4j可以将Jar文件制作成exe文件,但需jre支持,也可将Jar文件放在外面。
软件性质:共享软件
下载地址:http://www.ej-technologies.com/products/exe4j/overview.html
二、JBuilder。
说明:新版本的JBuilder可以直接把工程制作成各系统的可执行文件,包括Windows系统。
软件性质:商业软件
下载地址:略。我是从eMule下载的。
三、NativeJ。
说明:与exe4j功能类似。
软件性质:共享软件
下载地址:http://www.dobysoft.com/products/nativej/download.html
四、ExcelsiorJET。
说明:可以直接将Java类文件制作成exe文件,除AWT和Swing及第三方图形接口外可不需jre支持(Java5.0不行)。
软件性质:共享软件
下载地址:http://excelsior-usa.com/home.html
五、jshrink。
说明:可将Jar文件打包进exe文件。同时具有混淆功能(这才是它的主要功能)。
软件性质:共享软件
下载地址:http://www.e-t.com/jshrink.html
六、InstallAnywhere。
说明:打包工具,对Java打包最好用。可打包成各操作系统运行包。包括Windows系统。
软件性质:商业软件。
下载地址:http://www.zerog.com/
七、InstallShieldX。
说明:与InstallAnywhere类似,但比InstallAnywhere功能强大。相对的,比较复杂,不易上手,我现在还没学会。
软件性质:商业软件。
下载地址:http://www.installshield.com/
下面两篇也值得借鉴:
http://wallimn.iteye.com/blog/417508
http://piscesky.iteye.com/blog/281973
分享到:
相关推荐
这里我们将深入探讨两种常用的工具:exe4j和NSIS(Nullsoft Scriptable Install System),它们都可以帮助我们将Java的.jar文件打包成.exe格式。 **1. exe4j打包工具** exe4j是一款专为Java开发者设计的工具,它...
在IT行业中,有时候我们需要将Java编写的程序打包成可被非Java环境运行的exe可执行文件,以便在没有安装Java运行环境的计算机上也能顺利执行。`jar`文件是Java程序的标准打包格式,而`exe`文件则是Windows操作系统下...
能够将java生成的jar文件变成可执行的exe文件,操作方便
标题中的“jar转换成exe工具”指的是将Java的.jar(Java Archive)文件转换为.exe(Windows可执行文件)的过程。这种转换通常是出于方便在没有Java运行环境的Windows系统上运行Java程序的目的。以下是对这个主题的...
#### 四、将JAR文件转换为EXE可执行文件 为了使程序更加易于分发和运行,可以考虑将JAR文件转换为EXE格式。 1. **下载EXE4J**:访问[EXE4J](http://www.ej-technologies.com/download/exe4j/files.html)下载页面,...
将Java的JAR文件转换为可执行的EXE文件,并创建安装程序,是将Java应用程序分发给非Java开发人员或普通用户时的常见需求。这个过程可以通过使用特定的工具来实现,例如exe4j和Setup Factory 9。以下是详细的步骤: ...
为了解决这个问题,可以将JAR文件转换为更易于使用的Windows可执行文件(EXE)。这里我们将探讨如何使用小工具将JAR转换为EXE,以及背后的原理和过程。 1. JAR与EXE的区别: - JAR文件是Java字节码的容器,它包含...
在软件开发过程中,尤其是Java应用开发,我们经常需要将编译后的JAR文件转换为Windows操作系统下的可执行文件(EXE)。launch4j就是这样一个强大的工具,它允许开发者将Java应用程序封装为一个独立的、自包含的...
总的来说,将Java文件做成EXE主要是为了方便非Java开发者的使用,通过EXE4J这一工具,我们可以实现这个目标。不过,需要注意的是,虽然转换成EXE可以简化运行步骤,但Java的跨平台特性可能因此受到限制,因为生成的...
将springboot打包成的jar文件做成windows服务,解决java程序自启动问题,适合现场部署后无人看管情况,断电后服务器启动后不用管理springboot服务,不用打开cmd,也不担心现场人员误操作关闭cmd窗口。
在Java编程环境中,将一个.jar(Java Archive)文件转换为可执行文件,通常是将它封装成Windows下的.exe可执行程序,以便非Java开发者也能轻松运行。这个过程涉及到几个关键步骤和工具,以下是一个详细的教程: 1. ...
要将.jar文件转换为.exe文件,通常需要使用特定的工具,这些工具会创建一个Windows可执行文件,其中包含了运行Java程序所需的所有依赖和配置。下面是一些常用的转换工具: 1. **Launch4j**:这是一个免费且开源的...
- 将第三方库放在JRE的`lib/ext`目录下,虽然方便了本地运行,但会导致jar文件无法在其他机器上运行,除非那些机器也有相同的库。 - 使用Fat Jar或类似工具打包,能确保所有依赖都在jar中,便于跨平台分发。 - 转换...
在 Java 开发过程中,经常需要将开发完成的应用程序打包成可执行的 jar 文件,以便于部署、分发及运行。Eclipse 是一款非常流行的 Java 集成开发环境(IDE),它提供了方便的工具帮助开发者将项目打包成 jar 文件。...
标题中的“jar文件变成dll”指的是将Java编写的类库转换为.NET平台可使用的动态链接库(DLL)文件。在.NET框架中,DLL是共享代码的主要形式,可以在多个应用程序之间重用。Java的jar文件则包含了编译后的字节码,...
为了方便用户,开发者有时会将`.jar`文件打包成`.exe`(Windows可执行文件),使得用户只需双击即可运行程序,无需关心是否安装了Java环境。 打包Java应用到`.exe`文件的过程主要涉及到以下知识点: 1. **Java可...
本文详细介绍了如何使用fatJar插件将Eclipse Java项目打包成JAR文件,以及利用exe4j工具进一步将JAR文件转换为Windows平台上的EXE文件。这一系列操作不仅简化了Java应用的部署流程,也提高了应用程序的可用性和安全...
要将Java程序打包成可执行的jar文件,首先需要有Java开发环境,比如Eclipse。在Eclipse中,可以通过"File" -> "Export" -> "Runnable JAR file"来打包。在这个过程中,需要指定程序的入口点(引导类),选择输出路径...
Java程序打成Jar包做成EXE安装程序是将Java程序打包成可执行的EXE文件,以便在Windows操作系统中可以直接双击运行程序。下面将一步一步地实现该过程。 首先,需要完成Java GUI程序。在Eclipse下,程序能够正常运行...
在Java开发中,我们经常将项目打包成JAR文件,这是一种可执行的Java档案,它包含了一组类、资源和元数据。然而,有时我们希望将这些Java应用程序转换为更通用的可执行文件(.exe),以便在不安装Java运行环境的...