Java

描述

在运行的 (Apache Ant) JVM 中执行 Java 类,或者如果指定,则派生另一个 JVM。

如果在运行此任务时出现奇怪的问题,请将 fork 设置为 true 以使用新的 JVM。如果此任务启动的类或该类使用的任何库调用了诸如 java.lang.System.exit()java.lang.Runtime.exit() 之类的 API,则必须将 fork 设置为 true

自 Ant 1.6.3 起,您可以与派生的 JVM 交互,以及通过 inputinputstring 属性向其发送输入。

在 Unix(类 Unix)系统上将 Ant 作为后台进程运行

如果您将 Ant 作为后台进程运行(如 ant &)并将 <java> 任务的 spawn 设置为 false,并将 fork 设置为 true,则必须向派生的进程提供显式输入,否则 Ant 将被挂起,因为它尝试从标准输入读取。

参数

属性 描述 必需
classname 要执行的 Java 类。 四个选项中必须选择一个
jar 要执行的 jar 文件的位置(必须在清单中具有 Main-Class 条目)。如果选择此选项,则必须将 fork 设置为 true。有关更多详细信息,请参阅下面的 说明
module 要解析的初始模块或主模块(必须在清单中具有 Main-Class 条目)。如果选择此选项,则必须将 fork 设置为 true自 Ant 1.9.7 起
sourcefile “.java” 文件或包含 Java 源代码的 shebang 的文件的位置。设置此属性以运行 Java 单文件源程序,这是 Java 11 中引入的功能。如果选择此选项,则必须将 fork 设置为 true自 Ant 1.10.5 起
args 要执行的类的参数。已弃用,请改用嵌套的 <arg> 元素。
classpath 要使用的类路径。
classpathref 要使用的类路径,作为对在其他地方定义的 Path引用 给出。
modulepath 指定在何处查找应用程序模块。模块目录、模块文件或展开模块的列表。自 Ant 1.9.7 起
modulepathref 要使用的模块路径,作为对在其他地方定义的 Path引用 给出。自 Ant 1.9.7 起
fork 如果启用,则会在另一个 JVM 中触发类执行。 否;默认值为 false
spawn 如果启用,则允许启动一个将比 Ant 持续时间更长的进程。
要求 forktrue,并且与 timeoutinputoutputerrorresult 属性不兼容
否;默认值为 false
jvm 用于调用 JVM 的命令。该命令由 java.lang.Runtime.exec() 解析。如果 forkfalse,则忽略该命令。 否,默认值为 java
jvmargs 要传递给派生 JVM 的参数,如果 fork 被禁用,则忽略这些参数。已弃用,请改用嵌套的 <jvmarg> 元素。
maxmemory 要分配给派生 JVM 的最大内存量,如果 forkfalse,则忽略该内存量
failonerror 如果命令以非 0 的返回代码退出,则停止构建过程。 否;默认值为 false(请参阅 说明
resultproperty 应将命令的返回代码存储在其中的属性的名称。仅当 failonerrorfalseforktrue 时才感兴趣。
dir 在其中调用 JVM 的目录,如果 forkfalse,则忽略该目录。
output 要将输出写入其中的文件的名称。如果错误流也没有重定向到文件或属性,则它将出现在此输出中。
error 应将命令的标准错误重定向到的文件。
logError 当您希望在 Ant 的日志中看到错误输出并且将输出重定向到文件/属性时,使用此属性。错误输出将不会包含在输出文件/属性中。如果您使用 errorerrorProperty 属性重定向错误,则此属性将不起作用。
append 输出和错误文件是否应追加到或覆盖。 否;默认值为 false
outputproperty 应将命令的输出存储在其中的属性的名称。除非错误流重定向到单独的文件或流,否则此属性将包含错误输出。
errorproperty 应将命令的标准错误存储在其中的属性的名称。
input 从其中获取执行的命令的标准输入的文件。此属性与 inputstring 属性互斥 否;默认情况下,从控制台获取标准输入,除非 spawntrue
inputstring 用作执行的命令的输入流的字符串。此属性与 input 属性互斥。 否;默认情况下,从控制台获取标准输入,除非 spawntrue
newenvironment 当指定新的环境变量时,不要传播旧环境。 否;默认值为 false,如果 forkfalse,则忽略该值
timeout 如果命令在指定时间(以毫秒为单位)内未完成,则停止该命令。强烈建议仅当 forktrue 时才使用此功能。
clonevm 如果设置为 true,则派生 JVM 的所有系统属性和 bootclasspath 将与运行 Ant 的 JVM 相同。自 Ant 1.7 起 否;默认值为 false,如果 forkfalse,则忽略该值
discardOutput 是否应完全丢弃输出。此设置与将输出重定向到文件或属性的任何设置不兼容。
如果将此设置为 true,则错误输出也将被丢弃,除非您将错误输出重定向到文件、属性或启用 logError自 Ant 1.10.10 起
否;默认值为 false
discardError 是否应完全丢弃错误输出。此设置与将错误输出重定向到文件或属性的任何设置以及 logError 不兼容。自 Ant 1.10.10 起 否;默认值为 false

作为嵌套元素指定的参数

arg 和 jvmarg

使用嵌套的 <arg><jvmarg> 元素分别为 Java 类和派生的 JVM 指定参数。请参阅 命令行参数

sysproperty

使用嵌套的 <sysproperty> 元素指定类所需的系统属性。这些属性将在执行类时(在 Ant 的 JVM 或派生的 JVM 中)提供给 JVM。此元素的属性与 环境变量 的属性相同。

syspropertyset

自 Ant 1.6 起.

您可以使用 syspropertyset 指定一组用作系统属性的属性。

classpath

Javaclasspath 属性是 路径状结构,也可以通过嵌套的 classpath 元素设置。

bootclasspath

自 Ant 1.6 起.

可以使用此 路径状结构 指定引导类文件的位置——如果 fork 不为 true 或目标 JVM 不支持它(即 Java 1.1),则将被忽略。

env

可以通过嵌套的 env 元素指定要传递给派生 JVM 的环境变量。请参阅有关 exec 的部分中的描述。

如果 forkfalse,则设置将被忽略。

permissions

自 Ant 1.6 起.

说明:
在 Java 18 及更高版本上运行时,不再支持此元素。有关详细信息,请参阅 permissions

可以通过嵌套的 permissions 元素在执行类期间撤销和授予安全权限。有关更多信息,请参阅 permissions

当未授予(或已撤销)RuntimePermission exitVM 权限时,System.exit() 调用将被拦截并按 failonerror 中指示的方式处理。

说明:
在 Java 运行时版本低于 18 的情况下,如果您未指定权限,则会将一组默认权限添加到您的 Java 调用中,以确保 Ant 运行按 failonerror 指示的方式继续或终止。所有未默认授予的权限将由已存在的任何安全管理器检查。exitVM 将被禁止。

如果 forktrue,则设置将被忽略。

assertions

自 Ant 1.6 起.

您可以使用 <assertions> 子元素控制 Java 1.4 断言的启用。

断言语句目前在非派生模式下被忽略。

redirector

自 Ant 1.6.2 起

可以指定嵌套的 I/O 重定向器。通常,重定向器的属性的行为与任务级别可用的相应属性相同。最显着的特殊性源于出于向后兼容性而保留的 <java> 属性。任何文件映射都是使用 null 源文件完成的;因此,并非所有 Mapper 类型都将返回结果。当没有返回结果时,重定向规范将回退到任务级别属性。在实践中,这意味着可以为 inputoutputerror 输出文件指定默认值。

错误和返回代码

默认情况下,<java> 的返回代码被忽略。或者,您可以将 resultproperty 设置为属性的名称,并将其分配给结果代码(当然,前提是不存在不可变性)。当您将 failonerror 设置为 true 时,resultproperty 的唯一可能值为 0。任何非零响应都被视为错误,这意味着构建将退出。

类似地,如果 failonerrorfalseforkfalse,则 <java> 必须 返回 0,否则构建将退出,因为该类是由构建 JVM 运行的。

modulepath

自 Ant 1.9.7 起

Javamodulepath 属性是 路径状结构,也可以通过嵌套的 modulepath 元素设置。

upgrademodulepath

自 Ant 1.9.7 起

可以使用此 路径状结构 指定替换运行时映像中可升级模块的模块的位置。

JAR 文件执行

jar 属性的参数是 File 类型;也就是说,该参数解析为相对于项目基本目录的绝对文件,而不是运行 Java 任务的目录。如果您需要找到相对于运行任务的目录的 JAR 文件,则需要显式创建 JAR 文件的完整路径。

使用 jar 属性时,所有类路径设置都将根据 Oracle 的规范 被忽略。

示例

在当前 JVM 中运行一个类,并在类路径中使用一个新的 jar 文件

<java classname="test.Main">
  <arg value="-h"/>
  <classpath>
    <pathelement location="dist/test.jar"/>
    <pathelement path="${java.class.path}"/>
  </classpath>
</java>

运行此项目 dist/lib 目录中的 JAR 文件 test.jar,使用清单提供的入口点,派生(如果需要),并且最大内存为 128 MB。任何非零返回代码都会中断构建。

<java jar="dist/test.jar"
      fork="true"
      failonerror="true"
      maxmemory="128m">
  <arg value="-h"/>
  <classpath>
    <pathelement location="dist/test.jar"/>
    <pathelement path="${java.class.path}"/>
  </classpath>
</java>

运行相对于目录 ${exec.dir} 的 JAR 文件 dist/test.jar,该目录与 JVM 启动的目录相同。

<java dir="${exec.dir}"
      jar="${exec.dir}/dist/test.jar"
      fork="true"
      failonerror="true"
      maxmemory="128m">
  <arg value="-h"/>
  <classpath>
    <pathelement location="dist/test.jar"/>
    <pathelement path="${java.class.path}"/>
  </classpath>
</java>

使用当前类路径运行给定的类。

<java classname="test.Main"/>

将系统属性和 JVM 属性添加到 JVM 中,例如:java -Xrunhprof:cpu=samples,file=log.txt,depth=3 -DDEBUG=true test.Main

<java classname="test.Main"
      fork="yes" >
  <sysproperty key="DEBUG" value="true"/>
  <arg value="-h"/>
  <jvmarg value="-Xrunhprof:cpu=samples,file=log.txt,depth=3"/>
</java>

使用给定的 Java 实现(不同于 Ant 当前使用的实现)来运行类。为了在日志中进行文档记录,使用 taskname[java] 日志前缀更改为 [java1.4]

<java classname="ShowJavaVersion" classpath="."
      jvm="path-to-java14-home/bin/java" fork="true"
      taskname="java1.4"/>

注意:您不能将(高度不推荐使用的)MS JVM,jview.exe,指定为 jvm,因为它接受的参数与其他 JVM 不同。如果需要,可以从 <exec> 启动该 JVM。

运行模块 TestModule,该模块在模块路径 lib/:dist/test.jar 上解析,最大内存为 128 MB。任何非零返回值都会导致构建失败。

<java fork="true"
      failonerror="true"
      maxmemory="128m"
      module="TestModule"
      modulepath="lib:dist/test.jar"/>

运行模块 TestModule 中的类 Main,该模块在模块路径 lib/:dist/test.jar 上解析,最大内存为 128 MB。任何非零返回值都会导致构建失败。

<java fork="true"
      failonerror="true"
      maxmemory="128m"
      module="TestModule"
      classname="Main">
  <modulepath>
    <pathelement location="lib"/>
    <pathelement location="dist/test.jar"/>
  </modulepath>
</java>