|
JarToExe 转换向导技术支持页
工具:将 Jar 文件转换为 Exe 可执行文件。
1. 可执行文件的运行环境
生成的可执行文件,运行时需要 JRE 环境。
可执行文件能够从 "注册表"、"环境变量"、"配置文件" 获得 JRE 环境的存放位置。默认情况下,以 "配置文件" 优先:
- 配置文件
在配置文件中使用 "jvmdll" 项,可指定所使用用的 JRE 环境。[详情参见:配置文件]
- 注册表
正常安装 JRE,注册表中会记录相应配置。可执行文件可自动获得当前安装的 JRE 环境。
- 环境变量
使用环境变量 JAVA_HOME 或者 JRE_HOME 指向 JDK 或 JRE 根目录,可执行文件能够自动获得所指向的 JRE 环境。
- JRE 优先顺序
配置文件中使用 "jre_order" 项,可以调整查找 JRE 的优先顺序。[详情参见:配置文件]
2. 配置所需的其他 jar 库
可执行文件在执行时,如果还需要其他 jar 库,可以通过环境变量或者配置文件进行追加:
- 环境变量
使用环境变量 CLASSPATH 或者 CLASS_PATH 指定多个 jar 文件。
- 配置文件
在配置文件中使用 "classpath" 项,可指定所需的其他 jar 文件。[详情参见:配置文件]
- 将依赖的 jar 一起打包到生成的 exe 文件中
生成工具可以不将 jar 文件解压,即可将依赖的 jar 一起打包到 exe 文件中。
3. 设定 JVM 参数
更多 JVM 参数可通过配置文件进行设置:
- 配置文件
在配置文件中使用 "option" 项,可配置 JVM 参数。[详情参见:配置文件]
- 配置 property
配置文件中使用 "property" 项,可配置系统 property。
比如:"property a=1" 相当于 "option -Da=1"
- 引用系统环境变量
option 或 property 中可使用 %name% 格式引用系统环境变量。
4. 可执行文件全路径的获取
可执行文件运行时,可通过 System.getProperty 获取 exe 可执文件全路径:
String exepath = System.getProperty("j2e.app.path"); |
获取 exe 文件所在目录:
String exedir = System.getProperty("application.home"); |
5. 关于配置文件
5.1 配置文件名的命名规则
配置文件名:与可执行文件文件名相同。
扩展名:为 ".cfg" 或者 ".config" 。
举例:test.exe 相应的配置文件为 "test.cfg" 或者 "test.config" 。如果两个配置文件同时存在,则只有 ".cfg" 会被使用。
5.2 使用 "jvmdll" 项指定 JRE 环境
在可执行文件相应的配置文件中,使用 "jvmdll" 项指定文件 jvm.dll 的位置,可使可执行文件使用指定的 JRE 环境。
如果所指定的 jvm.dll 路径以 "/" 或者 "盘符" 开头,则认为该路径为绝对路径。如果所指定的路径以目录名开头,则认为该路径为相对于可执行文件的相对路径。
比如,对于 test.cfg,如果以绝对路径指定 JRE 环境:
jvmdll C:\j2sdk1.4.2\jre\bin\server\jvm.dll |
如果把 jre1.5.0 目录复制到可执行文件所在目录,可采用相对路径指定 JRE 环境:
jvmdll jre1.5.0\bin\client\jvm.dll |
使用相对路径指定 JRE 环境的这种办法,常用于软件发行时,将 jre 目录与可执行文件一起打包。在软件执行时,可以不要求所在计算机上安装 JRE。
5.3 使用 "classpath" 项配置所需的其他 jar 文件
可执行文件在运行时,如果需要其他的 jar 文件,可使用 "classpath" 项进行追加。使用分号 ";" 对多个 jar 文件进行分隔。
举例:
classpath E:\proj\classes;.;D:\lib1.jar;D:\lib2.jar |
5.4 使用 "option" 项配置其他 JVM 参数
在配置文件中,使用 "option" 项可配置更多 JVM 参数 "-X"、"-D" 。
比如,定义一个 System Property:(不要在 "=" 前后和 "-D" 之后添加空格)
option -Dmyprog.settings=C:\thefile.ini |
则在 Java 代码中,通过以下代码,可获得配置的内容:
String where = System.getProperty("myprog.settings"); |
5.5 使用 "jre_order" 改变 JRE 优先顺序
生成的 exe 可以从:
c - 配置文件(configuration)
e - 环境变量(environments)
s - 注册表(SUN jre registry)
i - 注册表(IBM jre registry)
获取 JRE 运行环境。
默认的优先顺序为: jre_order=csie ,配置文件中改变字母顺序可以改变 JRE 优先顺序。
6. 关于 javac 参数 -target
使用 JDK 所带的 javac.exe 命令对 java 文件进行编译时,使用“-target”参数可指定所生成的 class 文件的目标 JRE 版本。在较低版本的 JRE 环境下不能运行“-target”较高的 class 文件。
为使生成的 class 文件以及最终生成的 Exe 文件有更好的兼容性,编译时应指定尽可能底的目标版本。但如果我们使用了某个 JDK 版本中的新特性或者使用了某个 JDK 版本提供的类,那么指定更低的 JRE 版本为“-target”就没有意义。
一般情况下,我们使用:
D:\>javac -target 1.2 test/Hello.java |
对于 JDK 1.5,我们应使用:
D:\>javac -source 1.3 -target 1.2 test/Hello.java |
7. 关于 Windows NT 服务
7.1 服务的运行和停止
用 Java 编写的普通控制台程序,即可作为 Windows NT 服务运行。当服务的任务完成后,也就是说 main 方法返回后,或者中途调用 System.exit() 后,服务则停止。
长时间运行的程序,比如使用了 sleep() 或者 accept() 等方法,服务则一直保持“运行中”状态。通过 Windows 服务管理器,或者“net stop”命令可使服务停止运行。
7.2 服务的暂停和继续
如果根据需要,要求服务能暂停和继续,可实现 ServiceStatusHandler 接口,并且使 canPause() 方法返回 true:
import com.regexlab.j2e.*;
public class MyHandler implements ServiceStatusHandler
{
public boolean canPause()
{
return true;
}
} |
然后创建 MyHandler 实例,传递给 ServiceStatusManager 类的静态方法:
ServiceStatusManager.setServiceStatusHandler(new MyHandler()); |
这样,服务状态就可以被 Windows 服务管理器暂停或者被“net pause”命令暂停,也可以被 Java 程序主动地设置为暂停状态:
ServiceStatusManager.setServiceStatus(ServiceStatusManager.STATUS_PAUSED); |
这两个类的代码可在本页底下载。[更多详情参见:ServiceStatusHandler]
7.3 服务的安装和卸载
生成的 Windows NT 服务类型的可执行文件中,自带安装和卸载服务功能。安装办法是:使用 /install 参数运行可执行文件。以 [演示三] 为例:
如果需要安装成开机自动运行,则使用 /install auto,举例:
D:\>service.exe /install auto |
使用 /uninstall 参数可卸载服务:
D:\>service.exe /uninstall |
7.4 服务程序的测试运行
为检验运行环境和配置文件是否正常,可使用 /test 参数测试运行 Windows NT 服务程序。使用 /test 参数可将 Windows NT 服务程序作为一个 Console 程序运行:
7.5 类 ServiceStatusManager.java
本页底端可下载 Java 与 Windows 服务管理器交互的接口代码包。其中一个类是:
public class ServiceStatusManager; |
这个类主要用于从 Java 中主动设置服务状态,方法为:
public static void setServiceStatus(int status); |
7.6 接口 ServiceStatusHandler.java
另外一个类为接口:
public interface ServiceStatusHandler; |
这个接口主要用于:当服务被 Windows 服务管理或者“net stop”命令改变状态后,通过这个接口获取事件。
package com.regexlab.j2e;
public interface ServiceStatusHandler
{
/**
* Tell the service manager whether PAUSE/CONTINUE is supported.
* @return true means this service can be paused
*/
public boolean canPause();
/**
* Pause/continue event handle methods
* @return must return true if pause successfully
*/
public boolean onPause();
/**
* Pause/continue event handle methods
* @return must return true if continue successfully
*/
public boolean onContinue();
/**
* Stop service event handle method
* @return no use
*/
public boolean onStop();
} |
使用方法为:实现该类,然后将实例传递给 ServiceStatusManager 的静态方法:
ServiceStatusManager.setServiceStatusHandler(new MyHandler()); |
支持“暂停/继续”的 Windows NT 服务示例,请参阅“演示四”。
7.7 代码下载和文档
接口代码下载:[接口代码下载] - 4kb
接口代码文档:[javadoc]
|
|
|