我想将我的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
答案 0 :(得分:2)
您可以使用Java ant任务的jvm
属性来指定要使用的JVM。
<java jvm="javaw.exe" fork="true" ... >
...
</java>
答案 1 :(得分:0)
这建立在@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任务(可能是Ant的java
任务实现的子类),您仍然需要修改所有调用以使用您的自定义任务。
IMO,Ant的java任务默认情况下应该使用javaw.exe
,但如果操作系统是Windows并且spawn
属性为true,则限制使用它。我最近发现,在以后的JRE版本中,即使spawn
设置为true
,生成的进程也不会完全脱离控制台。我有一个脚本通过直接调用Tomcat的引导类来启动Tomcat,但是如果我关闭控制台窗口它会导致Tomcat终止。我采用上述技术来解决这个问题。