Java Ant任务使用错误的解释器(java.exe而不是javaw.exe)

时间:2012-06-05 08:29:43

标签: java ant

我想将我的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

2 个答案:

答案 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终止。我采用上述技术来解决这个问题。