Java

說明

在執行中的 (Apache Ant) JVM 內執行 Java 類別,或是在指定的狀況下分岔另一個 JVM。

如果在執行此任務時發生異常狀況,請設定 fork=true 以使用新的 JVM。如果由該任務啟動的類別或該類別所使用的任何函式庫呼叫 API,例如 java.lang.System.exit()java.lang.Runtime.exit(),則必須設定 fork=true

自 Ant 1.6.3 起,您可以與分岔的 JVM 互動,並透過 inputinputstring 屬性傳送輸入給它。

在類 Unix 系統上以背景程序執行 Ant

如果您以背景程序執行 Ant(例如 ant &),並使用 spawn 設為 falsefork 設為 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 存活更久的程序。
需要 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,則會被忽略。
逾時 如果命令未在指定時間內完成(以毫秒為單位),則停止該命令。強烈建議僅在 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 Redirector。一般來說,重新導向器的屬性與任務層級中可用的對應屬性行為相同。最顯著的特殊性來自於保留 <java> 屬性以維持向後相容性。任何檔案對應都使用 null 來源檔案來完成;因此,並非所有 Mapper 類型都會傳回結果。當沒有傳回結果時,重新導向規格會退回任務層級屬性。實際上,這表示可以為 inputoutputerror 輸出檔案指定預設值。

錯誤和傳回碼

預設情況下,會忽略 <java> 的傳回碼。或者,您可以將 resultproperty 設定為屬性的名稱,並將其指定給傳回碼 (當然,除非不可變更)。當您將 failonerror=true 設定時,resultproperty 唯一可能的值為 0。任何非零回應都會視為錯誤,並表示組建已結束。

類似地,如果 failonerror=falsefork=false,則 <java> 必須傳回 0,否則建置會結束,因為類別是由建置 JVM 執行的。

modulepath

自 Ant 1.9.7 起

Javamodulepath 屬性是 類似路徑的結構,也可以透過巢狀的 modulepath 元素設定。

upgrademodulepath

自 Ant 1.9.7 起

可以透過這個 類似路徑的結構,指定取代執行時間映像中可升級模組的模組位置。

JAR 檔案執行

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>