2010-11-09 41 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