在執行中的 (Apache Ant) JVM 內執行 Java 類別,或是在指定的狀況下分岔另一個 JVM。
如果在執行此任務時發生異常狀況,請設定 fork=true
以使用新的 JVM。如果由該任務啟動的類別或該類別所使用的任何函式庫呼叫 API,例如 java.lang.System.exit()
或 java.lang.Runtime.exit()
,則必須設定 fork=true
。
自 Ant 1.6.3 起,您可以與分岔的 JVM 互動,並透過 input 和 inputstring 屬性傳送輸入給它。
如果您以背景程序執行 Ant(例如 ant &),並使用 spawn 設為 false
和 fork 設為 true
的 <java>
任務,您必須提供明確的輸入給分岔的程序,否則 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,則會被忽略。 |
逾時 | 如果命令未在指定時間內完成(以毫秒為單位),則停止該命令。強烈建議僅在 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 Redirector。一般來說,重新導向器的屬性與任務層級中可用的對應屬性行為相同。最顯著的特殊性來自於保留 <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 檔案的完整路徑。
根據 Oracle 規範,使用 jar 屬性時,所有 classpath 設定都會被忽略。
在這個 JVM 中執行一個類別,並在 classpath 中加入一個新的 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,使用 manifest 提供的進入點,進行分岔(視需要),並將最大記憶體設為 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>
使用目前的 classpath 執行一個給定的類別。
<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。
執行在 modulepath lib/:dist/test.jar 中解析的模組 TestModule,並將最大記憶體設為 128 MB。任何非零回傳碼都會中斷建置。
<java fork="true" failonerror="true" maxmemory="128m" module="TestModule" modulepath="lib:dist/test.jar"/>
執行在 modulepath lib/:dist/test.jar 中解析的模組 TestModule 中的類別 Main,並將最大記憶體設為 128 MB。任何非零回傳碼都會中斷建置。
<java fork="true" failonerror="true" maxmemory="128m" module="TestModule" classname="Main"> <modulepath> <pathelement location="lib"/> <pathelement location="dist/test.jar"/> </modulepath> </java>