2

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

4

2 回答 2

3

您可以使用jvmJava ant 任务的属性来指定要使用的 JVM。

<java jvm="javaw.exe" fork="true" ... >
    ...
</java>
于 2012-06-05T08:38:39.293 回答
1

这建立在@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 终止。我采用了上面的技术来解决这个问题。

于 2014-08-15T05:07:38.263 回答