在运行的 (Apache Ant) JVM 中执行 Java 类,或者如果指定,则派生另一个 JVM。
如果在运行此任务时出现奇怪的问题,请将 fork 设置为 true
以使用新的 JVM。如果此任务启动的类或该类使用的任何库调用了诸如 java.lang.System.exit()
或 java.lang.Runtime.exit()
之类的 API,则必须将 fork 设置为 true
。
自 Ant 1.6.3 起,您可以与派生的 JVM 交互,以及通过 input 和 inputstring 属性向其发送输入。
如果您将 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 持续时间更长的进程。 要求 fork 为 true,并且与 timeout、input、output、error、result 属性不兼容 |
否;默认值为 false |
jvm | 用于调用 JVM 的命令。该命令由 java.lang.Runtime.exec() 解析。如果 fork 为 false,则忽略该命令。 |
否,默认值为 java |
jvmargs | 要传递给派生 JVM 的参数,如果 fork 被禁用,则忽略这些参数。已弃用,请改用嵌套的 <jvmarg> 元素。 |
否 |
maxmemory | 要分配给派生 JVM 的最大内存量,如果 fork 为 false,则忽略该内存量 |
否 |
failonerror | 如果命令以非 0的返回代码退出,则停止构建过程。 |
否;默认值为 false(请参阅 说明) |
resultproperty | 应将命令的返回代码存储在其中的属性的名称。仅当 failonerror 为 false且 fork 为 true时才感兴趣。 |
否 |
dir | 在其中调用 JVM 的目录,如果 fork 为 false,则忽略该目录。 |
否 |
output | 要将输出写入其中的文件的名称。如果错误流也没有重定向到文件或属性,则它将出现在此输出中。 | 否 |
error | 应将命令的标准错误重定向到的文件。 | 否 |
logError | 当您希望在 Ant 的日志中看到错误输出并且将输出重定向到文件/属性时,使用此属性。错误输出将不会包含在输出文件/属性中。如果您使用 error 或 errorProperty 属性重定向错误,则此属性将不起作用。 | 否 |
append | 输出和错误文件是否应追加到或覆盖。 | 否;默认值为 false |
outputproperty | 应将命令的输出存储在其中的属性的名称。除非错误流重定向到单独的文件或流,否则此属性将包含错误输出。 | 否 |
errorproperty | 应将命令的标准错误存储在其中的属性的名称。 | 否 |
input | 从其中获取执行的命令的标准输入的文件。此属性与 inputstring 属性互斥 | 否;默认情况下,从控制台获取标准输入,除非 spawn 为 true |
inputstring | 用作执行的命令的输入流的字符串。此属性与 input 属性互斥。 | 否;默认情况下,从控制台获取标准输入,除非 spawn 为 true) |
newenvironment | 当指定新的环境变量时,不要传播旧环境。 | 否;默认值为 false,如果 fork 为 false,则忽略该值 |
timeout | 如果命令在指定时间(以毫秒为单位)内未完成,则停止该命令。强烈建议仅当 fork 为 true时才使用此功能。 |
否 |
clonevm | 如果设置为 true,则派生 JVM 的所有系统属性和 bootclasspath 将与运行 Ant 的 JVM 相同。自 Ant 1.7 起 |
否;默认值为 false,如果 fork 为 false,则忽略该值 |
discardOutput | 是否应完全丢弃输出。此设置与将输出重定向到文件或属性的任何设置不兼容。 如果将此设置为 true,则错误输出也将被丢弃,除非您将错误输出重定向到文件、属性或启用 logError。自 Ant 1.10.10 起 |
否;默认值为 false |
discardError | 是否应完全丢弃错误输出。此设置与将错误输出重定向到文件或属性的任何设置以及 logError不兼容。自 Ant 1.10.10 起 |
否;默认值为 false |
使用嵌套的 <arg>
和 <jvmarg>
元素分别为 Java 类和派生的 JVM 指定参数。请参阅 命令行参数。
使用嵌套的 <sysproperty>
元素指定类所需的系统属性。这些属性将在执行类时(在 Ant 的 JVM 或派生的 JVM 中)提供给 JVM。此元素的属性与 环境变量 的属性相同。
自 Ant 1.6 起.
您可以使用 syspropertyset 指定一组用作系统属性的属性。
Java
的 classpath 属性是 路径状结构,也可以通过嵌套的 classpath
元素设置。
自 Ant 1.6 起.
可以使用此 路径状结构 指定引导类文件的位置——如果 fork 不为 true
或目标 JVM 不支持它(即 Java 1.1),则将被忽略。
可以通过嵌套的 env
元素指定要传递给派生 JVM 的环境变量。请参阅有关 exec 的部分中的描述。
如果 fork 为 false
,则设置将被忽略。
自 Ant 1.6 起.
说明:
在 Java 18 及更高版本上运行时,不再支持此元素。有关详细信息,请参阅 permissions
可以通过嵌套的 permissions
元素在执行类期间撤销和授予安全权限。有关更多信息,请参阅 permissions。
当未授予(或已撤销)RuntimePermission exitVM
权限时,System.exit()
调用将被拦截并按 failonerror 中指示的方式处理。
说明:
在 Java 运行时版本低于 18 的情况下,如果您未指定权限,则会将一组默认权限添加到您的 Java 调用中,以确保 Ant 运行按 failonerror 指示的方式继续或终止。所有未默认授予的权限将由已存在的任何安全管理器检查。exitVM
将被禁止。
如果 fork 为 true
,则设置将被忽略。
自 Ant 1.6 起.
您可以使用 <assertions>
子元素控制 Java 1.4 断言的启用。
断言语句目前在非派生模式下被忽略。
可以指定嵌套的 I/O 重定向器。通常,重定向器的属性的行为与任务级别可用的相应属性相同。最显着的特殊性源于出于向后兼容性而保留的 <java>
属性。任何文件映射都是使用 null
源文件完成的;因此,并非所有 Mapper 类型都将返回结果。当没有返回结果时,重定向规范将回退到任务级别属性。在实践中,这意味着可以为 input、output 和 error 输出文件指定默认值。
默认情况下,<java>
的返回代码被忽略。或者,您可以将 resultproperty 设置为属性的名称,并将其分配给结果代码(当然,前提是不存在不可变性)。当您将 failonerror 设置为 true
时,resultproperty 的唯一可能值为 0
。任何非零响应都被视为错误,这意味着构建将退出。
类似地,如果 failonerror 为 false
且 fork 为 false
,则 <java>
必须 返回 0
,否则构建将退出,因为该类是由构建 JVM 运行的。
Java
的 modulepath 属性是 路径状结构,也可以通过嵌套的 modulepath
元素设置。
可以使用此 路径状结构 指定替换运行时映像中可升级模块的模块的位置。
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>