Ant:将编译器arg传递到javac中

2022-09-01 10:25:07

我有蚂蚁脚本编译:

            <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


答案 1

缺省情况下, 使用 Ant 在进程内运行。Java的一般限制是,您无法调整JVM进程,并且一旦该JVM进程启动。因此,您看到的错误消息是软件拒绝您违反此原则的尝试(使用无益,不友好的错误消息)。<javac>XmsXmx

但是,如果在标记上指定属性,则可以指定新的 和 。这是因为指示 Ant 启动要在其中运行 的新 JVM 子进程。因为 JVM 进程是新的,所以它为 Ant 提供了一个可接受的机会来指定和指定它。fork="true"<javac>XmsXmsforkjavacXmsXmx


你可以尝试这样的事情:

<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=""linevalue


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


性能

通常,分叉的性能会更高,而是简单地调整初始 Ant JVM 的相关内存设置。这通常是(但并非总是)最佳选择,因为启动单独的JVM通常比简单地允许在进程内运行更慢并且占用更多内存。javacjavac

如果您使用的是 Ant 提供或启动 Ant,则调整 Ant 的一种简单方法是定义环境变量ANT_OPTS以包含所需的参数。有很多方法可以设置环境变量,但您可以直接编辑:ant.batant.shXmsXmxant.bat

set ANT_OPTS=-Xms128m -Xmx512m

答案 2

你有没有试过在Java任务下?对于默认的,您可以使用ANT_OPTS环境变量。我发现这个例子,不是很有用,但有一个构建.xml。<jvmarg value="-Xmx512m" />

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

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

它是从此链接复制的。将分叉设置为 true 很重要。


推荐