2010-11-09 88 views
25

我已經編譯ant腳本:螞蟻:通過compilerarg到javac中

  <javac srcdir="${test.src.dir}" destdir="${test.dist.dir}"> 
       ... 
       <compilerarg value="-Xlint:unchecked" /> 
      </javac> 

我需要增加編譯器的堆內存,所以我把下面的參數爲compileargs

<compilerarg value="-Xlint:unchecked -Xms128m -Xmx512m" /> 

但我在控制檯中出現錯誤:

[javac] javac: invalid flag: -Xms128m 
[javac] Usage: javac <options> <source files> 

爲什麼會發生?如何增加javac使用的內存?

+0

是它的複製/粘貼錯誤的錯誤消息說,不同的價值比一個提供(32米/ 128M)? – 2010-11-09 14:37:03

+1

也許你需要將每個參數傳遞到單獨的元素中? – ZeissS 2010-11-09 15:02:56

+0

@ZeissS:單獨的''元素會導致相同的錯誤,不幸的是 – 2010-11-09 15:14:17

回答

47

默認情況下,<javac>與Ant在進程中運行。一旦JVM進程啓動,您就無法調整JVM進程「Xms」和「Xmx」,這是Java的一般限制。所以,你所看到的錯誤消息是軟件拒絕你試圖違反這個原則(使用無益的,不友好的錯誤信息。)

但是,如果你在<javac>標籤指定屬性fork="true"能夠指定新的XmsXms。這是因爲fork指示Ant啓動運行javac的新JVM子進程。由於JVM過程是新的,因此它爲Ant提供了一個可接受的機會來爲其指定XmsXmx


你可以嘗試這樣的事情:

<project name="project" default="all" basedir="[yourvalue]"> 
    <target name="all"> 
     <javac srcdir="[yourvalue]" destdir="[yourvalue]" fork="true"> 
      <!-- javac requires that -Xmx and -Xms be prefixed with -J --> 
      <compilerarg line="-J-Xms128m -J-Xmx512m" /> 
     </javac> 
    </target> 
</project> 

(請注意,我用的compilerarg line=""而不是compilerarg value=""line屬性可以指定多個空格分隔的參數的value屬性是傳遞。單參數)


螞蟻會等分叉<javac>退出,這是在javac過程完成其工作之後發生的。編譯)。然後,Ant繼續在其原有的JVM進程中運行構建腳本。 Ant會檢查分叉javac是否失敗或成功,並根據此信息採取常規操作。


性能

它通常是更好的性能,以javac,而是簡單地調整總體初始螞蟻JVM相關的內存設置。這通常是(但並非總是)最好的選擇,因爲啓動單獨的JVM通常速度較慢,並且需要的內存比簡單地允許javac在進程中運行更多。

如果您使用的是螞蟻提供的ant.batant.sh推出螞蟻,一個簡單的方法來調整Ant的XmsXmx是定義環境變量ANT_OPTS來包含你需要的參數。有許多方法來設置環境變量,但你可能只是編輯ant.bat

set ANT_OPTS=-Xms128m -Xmx512m 
6

您是否在Java任務下嘗試過<jvmarg value="-Xmx512m" />?對於默認的你可以使用ANT_OPTS環境變量。我發現這example,不是很有用,但有一個build.xml。

爲了增加Javac堆空間,我發現這一點,同時谷歌搜索。

<javac fork="true" 
     srcdir="${basedir}/src" 
     destdir="${basedir}/build/classes" 
     classpath="${project.classpath}" 
     memoryinitialsize="256m" 
     memorymaximumsize="256m"> 
</javac> 

它從這link複製。將fork設置爲true很重要。

+0

對不起,但'jvmarg'在'javac'任務中無效:'javac不支持嵌套的「jvmarg」元素。 ' – 2010-11-09 15:00:28

2

我不認爲這個問題真的與螞蟻有關。如果您直接嘗試javac -Xms128m -Xmx512m,則會看到相同的消息。

您需要使用-J選項將標誌直接傳遞到運行系統。例如

-J-Xms128m -J-Xmx512m而不是您的compilerarg中的-Xms128m -Xmx512m

javac -X用於將非標準選項傳遞給編譯器。如果您運行命令javac -X,它將顯示包含您使用的-Xlint的合法選項列表。內存選項是底層JVM的設置,因此需要使用-J

替代

memoryInitialSize(相當於-Xms)和memoryMaximumSiz E(相當於-Xmx)爲javac任務選項,以便嘗試那些,而不是使用例如compilerargs

<javac srcdir="${test.src.dir}" destdir="${test.dist.dir}" 
    memoryInitialSize="128m" 
    memoryMaximumSize="512m"> 
+0

'-J-'前綴產生相同的結果:'[javac] javac:invalid flag:-J-Xms32m' – 2010-11-09 14:52:06

+0

請嘗試我已經添加到上面的答案的替代解決方案。 – mikej 2010-11-09 15:18:16

+0

+1 - 另一種方法奏效,但我仍想弄清楚爲什麼'-Xms32m'既不是'-J-Xms32m'也不起作用 – 2010-11-09 15:27:44