我想将我的 Ant 构建切换为使用 javaw.exe 而不是 java.exe。我设法通过设置 _JAVACMD 环境变量来做到这一点。
但是,当使用 fork = "true" 调用 java 任务时,无论如何都会启动 java.exe(我已经检查过 - 我的构建文件中没有明确的规范)。
我已经尝试将 ant.bat 替换为 java.exe 更新为 javaw.exe,但这也无济于事。
Java 1.7.0.4 x64 Windows 7 x64
您可以使用jvm
Java ant 任务的属性来指定要使用的 JVM。
<java jvm="javaw.exe" fork="true" ... >
...
</java>
这建立在@Teetoo 提供的答案之上:我认为最好jvm
将任务的属性java
设置为可执行文件的完整路径名,主要是与运行 Ant 的 Java 版本相关联的可执行文件。如果您的系统上安装了多个 Java 版本,则可能会使用您不希望的版本,具体取决于系统搜索路径的设置方式。
此外,如果您希望脚本在非 Windows 操作系统上工作,您不希望对使用进行硬编码,javaw.exe
因为它仅在 Windows 平台上可用。
以下 Ant 目标将相应地设置 javaw.exe 属性:
<!-- Utility target to set javaw.exe property to pathname of JVM
binary that can execute with no associated console -->
<target name="set-javaw-exe">
<condition property="javaw.exe.basename"
value="javaw.exe"
else="java.exe">
<os family="windows"/>
</condition>
<property name="javaw.exe.candidate"
location="${java.home}/bin/${javaw.exe.basename}"/>
<!-- If full pathname does not exist, fallback to just basename and hope it works -->
<condition property="javaw.exe"
value="${javaw.exe.candidate}"
else="javaw.exe.basename">
<resourceexists>
<file file="${javaw.exe.candidate}"/>
</resourceexists>
</condition>
</target>
您可以将目标添加到需要使用该属性的任何目标的依赖列表中,或者您可以将属性设置代码放置在项目级别的目标之外,以便始终设置该属性。
使用属性集,您可以执行以下操作:
<java jvm="${javaw.exe}" ...>
我知道该解决方案不能解决您必须更改java
构建脚本中任务的所有用途的担忧,但我认为这是不可避免的,除非您修改 Ant 源代码本身。即使您决定创建一个自定义 Ant 任务,可能是 Antjava
任务实现的子类,您仍然必须修改所有调用以使用您的自定义任务。
IMO,Ant 的 java 任务应该默认使用,但如果操作系统是 Windows 并且属性为 true javaw.exe
,则限制使用它。spawn
我最近发现,即使在spawn
设置为之后true
的 JRE 版本中,生成的进程也不会完全与控制台分离。我有一个脚本,它通过直接调用 Tomcat 的引导类来启动 Tomcat,但是如果我关闭控制台窗口,它会导致 Tomcat 终止。我采用了上面的技术来解决这个问题。