Муравей: передача compilerarg в javac - PullRequest
27 голосов
/ 09 ноября 2010

У меня есть 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 ]

50 голосов
/ 09 ноября 2010

По умолчанию <javac> работает внутри Ant.Общим ограничением Java является то, что вы не можете настраивать процесс JVM 'Xms и Xmx после запуска этого процесса JVM.Итак, сообщение об ошибке, которое вы видите, является программным обеспечением, отклоняющим вашу попытку нарушить этот принцип (используя бесполезное, недружественное сообщение об ошибке.)

Если, однако, вы задаете атрибут fork="true" в <javac> tag you сможет указать новые Xms и Xms.Это связано с тем, что fork указывает Ant запустить новый подпроцесс JVM для запуска javac.Поскольку процесс JVM является новым, он дает Ant приемлемую возможность указать для него Xms и Xmx.


Вы можете попробовать что-то вроде этого:

<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.Муравей проверит, не удалось или не удалось разветвленный javac, и предпримет обычные действия, основываясь на этой информации.


Производительность

Обычно это более производительно для не fork javac, а вместо этого просто настройте соответствующие параметры памяти для начальной общей Ant JVM.Это часто (но не всегда) лучший выбор, потому что запуск отдельной JVM обычно медленнее и требует больше памяти, чем просто javac для запуска в процессе.

Если вы используете предоставленный Ant ant.bat или ant.sh для запуска Ant. Простой способ настройки Ant Xms и Xmx состоит в том, чтобы определить переменную окружения ANT_OPTS, содержащую нужные аргументы.Существует множество способов установить переменные среды, но вы можете просто отредактировать ant.bat:

set ANT_OPTS=-Xms128m -Xmx512m
6 голосов
/ 09 ноября 2010

Вы пробовали <jvmarg value="-Xmx512m" /> под задачей Java? Для значений по умолчанию вы можете использовать переменную окружения ANT_OPTS. Я нашел этот пример , не очень полезный, но с build.xml.

Чтобы увеличить пространство кучи Javac, я нашел это во время поиска в Google.

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

Скопировано из этой ссылки . Важное значение имеет настройка fork на true.

2 голосов
/ 09 ноября 2010

Я не думаю, что эта проблема действительно связана с муравьем.Вы бы увидели то же самое сообщение, если бы вы попробовали javac -Xms128m -Xmx512m напрямую.

Вам необходимо использовать опцию -J для передачи флагов непосредственно системе выполнения.Например,

-J-Xms128m -J-Xmx512m вместо просто -Xms128m -Xmx512m в вашем compilerarg.

javac -X - для передачи нестандартных опций компилятору.Если вы выполните команду javac -X, она отобразит список допустимых опций, которые включают -Xlint, который вы использовали.Параметры памяти являются настройками для базовой JVM, поэтому необходимо использовать -J.

Альтернатива

Есть memoryInitialSize (эквивалент -XmsmemoryMaximumSiz e (эквивалент -Xmx) параметров для задачи javac, поэтому попробуйте их вместо использования compilerargs например

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