Ant:将compilerarg传递给javac

时间:2010-11-09 14:33:08

标签: java memory ant heap javac

我有编写的ant脚本:

            <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使用的内存?

3 个答案:

答案 0 :(得分:50)

默认情况下,<javac>在Ant中运行。 JVM进程启动后,您无法调整JVM进程“XmsXmx,这是Java的一般限制。因此,您看到的错误消息是软件拒绝您违反此原则的尝试(使用无用的,不友好的错误消息。)

但是,如果您在fork="true"标记上指定了属性<javac>,则 将能够指定新的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属性用于传递单个参数。)


Ant将等待分叉<javac>退出,这发生在javac进程完成其工作(即编译)之后。然后,Ant继续在其自己的原始JVM进程中运行构建脚本。 Ant将检查分叉javac是否失败或成功,并根据此信息采取常规操作。


<强>性能

而不是 fork javac通常更有效,而只是简单地调整整个初始Ant JVM的相关内存设置。这通常(但不总是)是最佳选择,因为启动单独的JVM通常比简单地允许javac在进程中运行更慢并且占用更多内存。

如果您使用Ant提供的ant.batant.sh来启动Ant,则调整Ant的XmsXmx的简单方法是定义环境变量ANT_OPTS包含你想要的参数。有很多方法可以设置环境变量,但您只需编辑ant.bat

set ANT_OPTS=-Xms128m -Xmx512m

答案 1 :(得分:6)

您是否在Java任务下尝试过<jvmarg value="-Xmx512m" />?对于默认值,您可以使用ANT_OPTS环境变量。我发现这个example,不是很有用,但有一个build.xml。

为了增加Javac堆空间,我在google搜索时发现了这一点。

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

它是从link复制的。将fork设置为true很重要。

答案 2 :(得分:2)

我不认为这个问题与蚂蚁有关。如果您直接尝试javac -Xms128m -Xmx512m,则会看到相同的消息。

您需要使用-J选项将标志直接传递给运行时系统。 e.g。

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

javac -X用于将非标准选项传递给编译器。如果您运行命令javac -X,它将显示合法选项列表,其中包括您使用的-Xlint。内存选项是底层JVM的设置,因此需要使用-J

<强>替代

memoryInitialSize任务有-Xms(相当于memoryMaximumSiz)和-Xmx e(相当于javac)选项,请尝试使用这些选项而不是使用compilerargs例如

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