Avertissement de la fourmi: «'Incleantruntime' n'a pas été défini»

397

Je reçois l'avertissement suivant:

[javac] build.xml:9: warning: 'includeantruntime' was not set, 
defaulting to build.sysclasspath=last; set to false for repeatable builds

Qu'est-ce que ça veut dire?

user496949
la source

Réponses:

388

Ant Runtime

Réglez simplement includeantruntime="false":

<javac includeantruntime="false" ...>...</javac>

Si vous devez utiliser la javac-tâche plusieurs fois, vous pourriez envisager d'utiliser PreSetDefpour définir votre propre javac-tâche qui est toujours définie includeantruntime="false".

Détails supplémentaires

Sur http://www.coderanch.com/t/503097/tools/warning-includeantruntime-was-not-set :

Cela est dû à une erreur introduite dans Ant 1.8. Ajoutez simplement un attribut de ce nom à la tâche javac, définissez-le sur false et oubliez que cela ne s'est jamais produit.

De http://ant.apache.org/manual/Tasks/javac.html :

Indique s'il faut inclure les bibliothèques d'exécution Ant dans le chemin de classe; par défaut à yes, sauf si build.sysclasspath est défini. Il est généralement préférable de définir ce paramètre sur false afin que le comportement du script ne soit pas sensible à l'environnement dans lequel il est exécuté.

Daniel Kutik
la source
Apache Ant (TM) version 1.8.2 compilée le 20 décembre 2010
user496949
donc si vous avez besoin du runtime ant dans le classpath, réglez-le sur yes / true sinon sur no / false. je suppose que vous n'en avez pas besoin.
Daniel Kutik
5
+1, excellente réponse. Je souhaite juste pouvoir le définir une fois quelque part dans le buildfile au lieu de joncher chaque appel javac avec lui ...
Jonik
1
Que signifie-t-il dans le cas où il est défini sur True?
Lorenzo Lerate
"Indique s'il faut inclure les bibliothèques d'exécution Ant dans le chemin de classe; la valeur par défaut est yes, sauf si build.sysclasspath est défini. Il est généralement préférable de définir cette valeur sur false afin que le comportement du script ne soit pas sensible à l'environnement dans lequel il est exécuté." "
Daniel Kutik
72

Comme l'a mentionné @Daniel Kutik, presetdefc'est une bonne option. Surtout si l'on travaille sur un projet avec de nombreuxbuild.xml fichiers que l'on ne peut pas, ou préfère ne pas éditer (par exemple, ceux de tiers.)

Pour l'utiliser presetdef, ajoutez ces lignes dans votre build.xmlfichier de niveau supérieur :

  <presetdef name="javac">
    <javac includeantruntime="false" />
  </presetdef>

Désormais, toutes les javactâches suivantes hériteront essentiellement includeantruntime="false". Si vos projets ont réellement besoin de bibliothèques d'exécution ant, vous pouvez soit les ajouter explicitement à vos fichiers de construction OU définirincludeantruntime="true" . Ce dernier supprimera également les avertissements.

Les javactâches suivantes peuvent toujours changer cela explicitement si vous le souhaitez, par exemple:

<javac destdir="out" includeantruntime="true">
  <src path="foo.java" />
  <src path="bar.java" />
</javac>

Je recommanderais de ne pas l'utiliser ANT_OPTS. Cela fonctionne, mais cela va à l'encontre du but de l'avertissement. L'avertissement indique à quelqu'un que sa version peut se comporter différemment sur un autre système. L'utilisation ANT_OPTSrend cela encore plus probable car maintenant chaque système doit être utilisé ANT_OPTSde la même manière. S'appliquera également à l' ANT_OPTSéchelle mondiale, supprimant les avertissements au gré de tous vos projets

jwfearn
la source
1
Fonctionne très bien pour moderniser un fichier de génération Ant existant avec plusieurs tâches javac. L'élément presetdef va juste à l'intérieur de l'élément project.
saxman
@jwfearn: Une presetdefastuce similaire peut-elle être faite pour fonctionner pour les tâches Ant non intégrées? J'ai essayé cela avec scalac, mais parce que les build.xmlfichiers inférieurs doivent définir manuellement la scalactâche, ils remplacent tout ce que j'ai défini au niveau supérieur.
Stuart Golodetz
2
Une note, que l'utilisation de presetdef provoquera un avertissement de fourmi que la tâche javac a été redéfinie. L'ajout d'individualtruntime à chaque tâche javac évite cela. Je ne connais pas les inconvénients de l'avertissement. Mais cela pourrait être utile pour les personnes qui ont besoin de versions propres.
mikijov
Oui, le presetdef donne "Essayer de remplacer l'ancienne définition de la tâche javac"
mike jones
62

Chet Hosey a écrit une belle explication ici :

Historiquement, Ant a toujours inclus son propre runtime dans le chemin de classe mis à la disposition de la tâche javac. Ainsi, toutes les bibliothèques incluses avec Ant, et toutes les bibliothèques disponibles pour ant, sont automatiquement dans le chemin de classe de votre build, que cela vous plaise ou non.

Il a été décidé que ce n'était probablement pas ce que la plupart des gens voulaient. Alors maintenant, il y a une option pour cela.

Si vous choisissez "true" (pour includeeantruntime), alors vous savez au moins que votre chemin de classe de construction inclura le runtime Ant. Si vous choisissez "false", vous acceptez le fait que le comportement de génération changera entre les anciennes versions et 1.8+.

Aussi ennuyé que vous soyez de voir cet avertissement, vous seriez encore moins heureux si vos versions se cassaient complètement. Conserver ce comportement par défaut permet aux fichiers de construction non modifiés de fonctionner de manière cohérente entre les versions d'Ant.

kgiannakakis
la source
3
J'ai toujours pensé que c'était la fonctionnalité / le message le plus stupide de tous les temps. Qui veut des «builds reproductibles» dans son outil de gestion de configuration? ;)
karmakaze
1
Cette réponse semble être la seule à nous dire ce que signifie réellement l'avertissement.
ty
26

La réponse de Daniel fonctionne parfaitement. Voici un exemple d'extrait que j'ai ajouté à mon build.xml:

<target name="compile">
    <mkdir dir="${classes.dir}"/>
    <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false">
                                                 <!--   ^^^^^^^^^^^^^^^^^^^^^^^^^  -->
        <classpath>
            <path id="application" location="${jar.dir}/${ant.project.name}.jar"/>
            <path id="junit" location="${lib.dir}/junit-4.9b2.jar"/>
        </classpath>
    </javac>
</target>
Krishnam Raju
la source
5

Si vous aimez que je travaille à partir de la ligne de commande, la réponse rapide est l'exécution

export ANT_OPTS=-Dbuild.sysclasspath=ignore

Et puis réexécutez votre script ant.

slott
la source
Cela m'aide beaucoup . J'utilise set ANT_OPTS=-Xms40M -Xmx512M -Dbuild.sysclasspath=ignore.
Paul Vargas
5

Utiliser <property name="build.sysclasspath" value="last"/>dans votre fichier build.xml

Pour plus de détails recherche includeAntRuntimedans Ant javac

D'autres valeurs possibles peuvent être trouvées ici

Ahmad Nadeem
la source
-3

j'ai fait face à la même chose, je m'enregistre dans le programme et la fonctionnalité. il y avait une mise à jour a installer pour jdk1.8 qui n'est pas compatible avec mon ancien paramètre (jdk1.6.0) pour ant dans eclipse. J'installe cette mise à jour. en ce moment, mon projet de fourmi est de réussir.

Essayez-le, j'espère que cela vous sera utile.

Garun Kumar Mishra
la source