Ant: passage de compilerarg dans javac

J'ai un script ant qui compile:

            <javac srcdir="${test.src.dir}" destdir="${test.dist.dir}">
               ...  
               <compilerarg value="-Xlint:unchecked" />
            </javac>

J'ai besoin d'augmenter la mémoire de tas du compilateur, donc j'ai mis les arguments suivants dans compileargs:

<compilerarg value="-Xlint:unchecked -Xms128m -Xmx512m" />

, Mais je reçois une erreur dans la console:

[javac] javac: invalid flag: -Xms128m
[javac] Usage: javac <options> <source files>

Pourquoi cela arrive-t-il? Comment puis-je augmenter la mémoire utilisée par javac?

25
demandé sur MrSmith42 2010-11-09 17:33:07

3 réponses

Par défaut, <javac> s'exécute en cours de traitement avec Ant. C'est une limitation générale de Java que vous ne pouvez pas ajuster un processus JVM' Xms et Xmx Une fois que ce processus JVM a été lancé. Ainsi, le message d'erreur que vous voyez est le logiciel rejetant votre tentative de violer ce principe (en utilisant un message d'erreur inutile et hostile.)

Si, toutefois, vous spécifiez l'attribut fork="true" sur <javac> balise sera être en mesure de spécifier un nouveau Xms et Xms. C'est parce que fork indique à Ant de lancer un nouveau sous-processus JVM dans lequel exécuter javac. Parce que le processus JVM est nouveau, il donne à Ant une opportunité acceptable de spécifier Xms et Xmx pour cela.


Vous pourriez essayer quelque chose comme ceci:

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

(notez que j'utilise compilerarg line="" plutôt que compilerarg value="". L'attribut line vous permet de spécifier plusieurs arguments séparés par des espaces. L'attribut value sert à passer un seul argument.)


Ant attendra la sortie de la fourche <javac>, qui se produit après que le processus javac ait terminé son travail (c'est-à-dire la compilation). Ant continue ensuite à exécuter le script de construction dans son propre processus JVM d'origine. Ant vérifiera si le forked javac a échoué ou réussi, et prendra les mesures habituelles en fonction de ces informations.


Les Performances

Il est généralement plus performant dePas fork javac, et à la place il suffit de régler les paramètres de mémoire pertinents pour la JVM Ant initiale globale. C'est souvent (mais pas toujours) le meilleur choix car lancer une JVM séparée est généralement plus lent et prend plus de mémoire que simplement permettre à javac de s'exécuter en cours de processus.

Si vous utilisez les ant.bat ou ant.sh fournis par Ant pour lancer Ant, un moyen facile de régler les Xms et Xmx de Ant est de définir la variable D'environnement ANT_OPTS pour contenir les arguments que vous voulez. Il existe de nombreuses façons de définir des variables d'environnement, mais vous pouvez simplement modifier ant.bat:

set ANT_OPTS=-Xms128m -Xmx512m
47
répondu Mike Clark 2011-09-16 17:47:03

Avez-vous essayé <jvmarg value="-Xmx512m" /> sous tâche Java? Pour ceux par défaut, vous pouvez utiliser la variable D'environnement ANT_OPTS. J'ai trouvé cet exemple , pas très utile mais a une construction.XML.

Pour augmenter L'espace de tas Javac, j'ai trouvé cela en googlant.

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

Il est copié à partir de ce lien . Définir fork sur true est important.

6
répondu CoolBeans 2010-11-09 15:09:54

Je ne pense pas que ce problème soit vraiment lié à ant. Vous verriez le même message si vous essayiez javac -Xms128m -Xmx512m directement.

Vous devez utiliser l'option -J pour passer des drapeaux directement au système d'exécution. par exemple

-J-Xms128m -J-Xmx512m au lieu de simplement -Xms128m -Xmx512m votre compilerarg.

javac -X est pour passer des options non standard au compilateur. Si vous exécutez la commande javac -X, elle affichera une liste d'options légales qui incluent le -Xlint que vous avez utilisé. Les options de mémoire sont des paramètres pour la JVM sous-jacente, d'où la nécessité d'utiliser -J.

Alternative

Il y a des options memoryInitialSize (équivalentes à -Xms) et memoryMaximumSize (équivalentes à -Xmx) pour la tâche javac alors essayez celles-ci au lieu d'utiliser compilerargs par exemple

<javac srcdir="${test.src.dir}" destdir="${test.dist.dir}"
  memoryInitialSize="128m"
  memoryMaximumSize="512m">
2
répondu mikej 2010-11-09 15:16:32