Подтвердить что ты не робот

Ant: передача компилятора в javac

У меня есть ant script, который компилирует:

            <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?

4b9b3361

Ответ 1

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

Если, однако, вы указываете атрибут fork="true" в теге <javac>, вы сможете указать новые 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 будет ждать выхода forked <javac>, что происходит после завершения процесса javac его работы (т.е. компиляции). Ant затем продолжает выполнение сборки script внутри своего собственного исходного процесса JVM. Ant проверяет, не удалось или не удалось разбить forked javac, и принять обычные действия на основе этой информации.


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

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

Если вы используете Ant -provided ant.bat или ant.sh для запуска Ant, простой способ настроить Ant Xms и Xmx - это определить переменную среды ANT_OPTS, которая должна содержать аргументы, которые вы хотите. Там много способов установить переменные среды, но вы можете просто изменить ant.bat:

set ANT_OPTS=-Xms128m -Xmx512m

Ответ 2

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

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

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

Он скопировал ссылку . Значение fork для true важно.

Ответ 3

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

Вам нужно использовать параметр -J для передачи флагов непосредственно в систему выполнения. например.

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

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

Alternative

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

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