web-dev-qa-db-fra.com

Ant: passer 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, j'ai donc 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 augmenter la mémoire utilisée par javac?

28
Denis Kniazhev

Par défaut, <javac> S'exécute en cours avec Ant. Il s'agit d'une limitation générale de Java que vous ne pouvez pas ajuster un processus JVM 'Xms et Xmx une fois ce processus JVM lancé. Ainsi, l'erreur message 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 la balise <javac>, Vous pourrez spécifier un nouveau Xms et Xms. Cela est dû au fait que fork demande à Ant de lancer un nouveau sous-processus JVM dans lequel exécuter javac. Étant donné que le processus JVM est nouveau, il donne à Ant une opportunité acceptable de spécifier Xms et Xmx pour lui.


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>

(Remarquez 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 que le <javac> Se termine, ce qui se produit une fois que le processus javac a terminé son travail (c'est-à-dire la compilation). Ant continue ensuite d'exécuter le script de génération dans son propre processus JVM d'origine. Ant vérifiera si la fourche javac a échoué ou réussi, et prendra les actions habituelles en fonction de ces informations.


Performance

Il est généralement plus performant de de ne pas bifurquer javac, et de régler simplement les paramètres de mémoire appropriés pour la JVM Ant globale dans son ensemble. C'est souvent (mais pas toujours) le meilleur choix car le lancement d'une JVM séparée est généralement plus lent et prend plus de mémoire que de simplement laisser javac s'exécuter en cours de processus.

Si vous utilisez ant.bat Ou ant.sh Fourni par Ant pour lancer Ant, un moyen simple de régler les Xms et Xmx d'Ant est de définir la variable d'environnement ANT_OPTS pour contenir les arguments souhaités. 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
53
Mike Clark

As-tu essayé <jvmarg value="-Xmx512m" /> under Java? Pour celles par défaut, vous pouvez utiliser la variable d'environnement ANT_OPTS. J'ai trouvé cette exemple , pas très utile mais avec un build.xml.

Pour augmenter l'espace de tas Javac, j'ai trouvé cela en cherchant sur Google.

<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 . La définition de fork sur true est importante.

6
CoolBeans

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

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

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

javac -X est pour passer des options non standard au compilateur. Si vous exécutez la commande javac -X il affichera une liste des 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 memoryInitialSize (équivalent à -Xms) et memoryMaximumSize (équivalent à -Xmx) pour la tâche javac, essayez donc celles-ci au lieu d'utiliser compilerargs par exemple.

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