Ameisenwarnung: "'includeeantruntime' wurde nicht eingestellt"

397

Ich erhalte folgende Warnung:

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

Was bedeutet das?

user496949
quelle

Antworten:

388

Ameisen-Laufzeit

Einfach einstellen includeantruntime="false":

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

Wenn Sie die javac-task mehrmals verwenden müssen, sollten Sie in Betracht ziehen PreSetDef, Ihre eigene javac-task zu definieren , die immer festgelegt wird includeantruntime="false".

Zusätzliche Details

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

Dies ist auf eine in Ant 1.8 eingeführte Fehlfunktion zurückzuführen. Fügen Sie der Javac-Aufgabe einfach ein Attribut dieses Namens hinzu, setzen Sie es auf false und vergessen Sie, dass es jemals passiert ist.

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

Gibt an, ob die Ant-Laufzeitbibliotheken in den Klassenpfad aufgenommen werden sollen. Der Standardwert ist yes, es sei denn, build.sysclasspath ist festgelegt. Es ist normalerweise am besten, dies auf false zu setzen, damit das Verhalten des Skripts nicht von der Umgebung abhängt, in der es ausgeführt wird.

Daniel Kutik
quelle
Apache Ant (TM) Version 1.8.2 kompiliert am 20. Dezember 2010
user496949
Wenn Sie also die ant-Laufzeit im Klassenpfad benötigen, setzen Sie sie auf yes / true, andernfalls auf no / false. Ich denke du brauchst es nicht.
Daniel Kutik
5
+1, gute Antwort. Ich wünschte nur, ich könnte das einmal irgendwo in der Build-Datei festlegen, anstatt jeden Javac-Anruf damit zu
verunreinigen
1
Was bedeutet es auf jeden Fall, dass es auf True gesetzt ist?
Lorenzo Lerate
"Gibt an, ob die Ant-Laufzeitbibliotheken in den Klassenpfad aufgenommen werden sollen. Der Standardwert ist yes, sofern nicht build.sysclasspath festgelegt ist. In der Regel ist es am besten, diesen Wert auf false zu setzen, damit das Verhalten des Skripts nicht von der Umgebung abhängt, in der es ausgeführt wird. ""
Daniel Kutik
72

Wie @ Daniel Kutik erwähnte, presetdefist dies eine gute Option. Insbesondere, wenn man an einem Projekt mit vielen build.xmlDateien arbeitet, die man nicht bearbeiten kann oder möchte (z. B. solche von Drittanbietern).

Fügen Sie zur Verwendung presetdefdie folgenden Zeilen in Ihre build.xmlDatei der obersten Ebene ein :

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

Jetzt werden alle nachfolgenden javacAufgaben im Wesentlichen erben includeantruntime="false". Wenn Ihre Projekte tatsächlich Ant-Laufzeitbibliotheken benötigen, können Sie diese entweder explizit zu Ihren Build-Dateien hinzufügen oder festlegenincludeantruntime="true" . Letzteres wird auch Warnungen entfernen.

Nachfolgende javacAufgaben können dies bei Bedarf noch explizit ändern, zum Beispiel:

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

Ich würde gegen die Verwendung empfehlen ANT_OPTS. Es funktioniert, aber es macht den Zweck der Warnung zunichte. Die Warnung weist darauf hin, dass sich der Build auf einem anderen System möglicherweise anders verhält. Die Verwendung ANT_OPTSmacht dies noch wahrscheinlicher, da jetzt jedes System auf ANT_OPTSdie gleiche Weise verwendet werden muss. Außerdem ANT_OPTSgelten global, Warnungen nolens volens in allen Ihren Projekten zu unterdrücken

jwfearn
quelle
1
Funktioniert hervorragend zum Nachrüsten einer vorhandenen Ant-Build-Datei mit mehreren Javac-Aufgaben. Das presetdef-Element befindet sich direkt im Projektelement.
Saxman
@jwfearn: Kann ein ähnlicher presetdefTrick für nicht integrierte Ant-Aufgaben verwendet werden? Ich habe dies mit versucht scalac, aber da niedrigere build.xmlDateien die scalacAufgabe manuell definieren müssen , überschreiben sie alles, was ich auf der obersten Ebene festgelegt habe.
Stuart Golodetz
2
Ein Hinweis, dass die Verwendung von presetdef eine Ameisenwarnung auslöst, dass die Javac-Aufgabe neu definiert wurde. Addind includeeantruntime zu jeder Javac-Aufgabe vermeidet dies. Ich bin mir der Nachteile der Warnung nicht bewusst. Dies kann jedoch für Personen nützlich sein, die saubere Builds benötigen.
Mikijov
Ja, das Presetdef gibt "Versuch, die alte Definition von Task Javac zu überschreiben"
Mike Jones
62

Chet Hosey schrieb eine schöne Erklärung hier :

In der Vergangenheit hat Ant immer eine eigene Laufzeit in den Klassenpfad aufgenommen, der der Javac-Task zur Verfügung gestellt wird. Alle in Ant enthaltenen Bibliotheken und alle für ant verfügbaren Bibliotheken befinden sich automatisch im Klassenpfad Ihres Builds, unabhängig davon, ob Sie es mögen oder nicht.

Es wurde entschieden, dass dies wahrscheinlich nicht das war, was die meisten Leute wollten. Jetzt gibt es eine Option dafür.

Wenn Sie "true" (für die Laufzeit) auswählen, wissen Sie zumindest, dass Ihr Build-Klassenpfad die Ant-Laufzeit enthält. Wenn Sie "false" wählen, akzeptieren Sie die Tatsache, dass sich das Build-Verhalten zwischen älteren Versionen und 1.8+ ändert.

So genervt Sie auch über diese Warnung sind, Sie wären noch weniger glücklich, wenn Ihre Builds vollständig kaputt gehen würden. Wenn Sie dieses Standardverhalten beibehalten, können unveränderte Build-Dateien zwischen Ant-Versionen konsistent funktionieren.

kgiannakakis
quelle
3
Ich dachte immer, dies sei das albernste Feature / die albernste Nachricht überhaupt. Wer möchte "wiederholbare Builds" in seinem Konfigurationsmanagement-Tool? ;)
Karmakaze
1
Diese Antwort scheint die einzige zu sein, die uns sagt, was die Warnung tatsächlich bedeutet.
ty
26

Die Antwort von Daniel funktioniert einfach perfekt. Hier ist ein Beispiel-Snippet, das ich meiner build.xml hinzugefügt habe:

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

Wenn Sie möchten, dass ich über die Befehlszeile arbeite, wird die schnelle Antwort ausgeführt

export ANT_OPTS=-Dbuild.sysclasspath=ignore

Führen Sie dann Ihr Ameisenskript erneut aus.

Slott
quelle
Das hilft mir sehr . Ich benutze set ANT_OPTS=-Xms40M -Xmx512M -Dbuild.sysclasspath=ignore.
Paul Vargas
5

Verwenden Sie <property name="build.sysclasspath" value="last"/>in Ihrer build.xml-Datei

Für weitere Details suchen Sie includeAntRuntimein Ant javac

Weitere mögliche Werte finden Sie hier

Ahmad Nadeem
quelle
-3

Ich stand vor dem gleichen, ich checke in Programm und Funktion ein. Es wurde ein Update für jdk1.8 installiert, das nicht mit meiner alten Einstellung (jdk1.6.0) für ant in eclipse kompatibel ist. Ich installiere das Update. Im Moment ist mein Ameisenprojekt der Erfolg.

Probieren Sie es aus, hoffe, dies wird hilfreich sein.

Garun Kumar Mishra
quelle