peringatan semut: "'tidak termasuk' tidak disetel"

397

Saya menerima peringatan berikut:

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

Apa artinya ini?

pengguna496949
sumber

Jawaban:

388

Semut Runtime

Cukup atur includeantruntime="false":

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

Jika Anda harus menggunakan javac-task beberapa kali, Anda mungkin ingin mempertimbangkan PreSetDefuntuk menggunakan javac-task sendiri yang selalu diset includeantruntime="false".

detil tambahan

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

Itu disebabkan oleh kesalahan pengenalan di Ant 1.8. Tambahkan saja atribut nama itu ke tugas javac, setel ke false, dan lupakan itu pernah terjadi.

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

Apakah akan menyertakan perpustakaan run-time Ant di classpath; default ke yes, kecuali build.sysclasspath diatur. Biasanya yang terbaik adalah mengatur ini menjadi false sehingga perilaku skrip tidak peka terhadap lingkungan tempat skrip dijalankan.

Daniel Kutik
sumber
Apache Ant (TM) versi 1.8.2 dikompilasi pada 20 Desember 2010
user496949
jadi jika Anda membutuhkan semut runtime di classpath atur ke yes / true jika tidak / false. Saya kira Anda tidak membutuhkannya.
Daniel Kutik
5
+1, Jawaban yang bagus. Saya hanya berharap saya bisa mengatur itu sekali di suatu tempat di buildfile daripada mengotori setiap panggilan javac dengan itu ...
Jonik
1
Apa bedanya itu disetel ke True?
Lorenzo Lerate
"Apakah akan menyertakan pustaka run-time Ant di classpath; default ke yes, kecuali build.sysclasspath diatur. Biasanya terbaik untuk mengatur ini menjadi false sehingga perilaku skrip tidak peka terhadap lingkungan di mana ia dijalankan. "
Daniel Kutik
72

Seperti yang disebutkan oleh @Daniel Kutik, presetdefadalah pilihan yang baik. Terutama jika seseorang mengerjakan proyek dengan banyak build.xmlfile yang tidak dapat, atau lebih suka tidak diedit (misalnya, dari pihak ketiga.)

Untuk menggunakan presetdef, tambahkan baris ini di build.xmlfile tingkat atas Anda :

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

Sekarang semua javactugas selanjutnya pada dasarnya akan mewarisi includeantruntime="false". Jika proyek Anda benar-benar membutuhkan pustaka runtime semut, Anda dapat menambahkannya secara eksplisit ke file build ATAU set includeantruntime="true". Yang terakhir juga akan menyingkirkan peringatan.

javacTugas selanjutnya masih dapat secara eksplisit mengubah ini jika diinginkan, misalnya:

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

Saya akan merekomendasikan untuk tidak menggunakan ANT_OPTS. Itu bekerja, tetapi itu mengalahkan tujuan dari peringatan itu. Peringatan itu memberi tahu seseorang bahwa build seseorang mungkin berperilaku berbeda pada sistem lain. Menggunakan ANT_OPTSmembuat ini lebih mungkin karena sekarang setiap sistem perlu menggunakan ANT_OPTSdengan cara yang sama. Juga, ANT_OPTSakan berlaku secara global, menekan peringatan mau tak mau di semua proyek Anda

jwfearn
sumber
1
Berfungsi bagus untuk me-retrofit file Ant build yang ada dengan beberapa tugas javac. Elemen presetdef masuk tepat di dalam elemen proyek.
Saksman
@ jwfearn: Dapatkah presetdeftrik serupa dibuat agar berfungsi untuk tugas Ant yang bukan bawaan? Saya sudah mencoba ini scalac, tetapi karena build.xmlfile yang lebih rendah harus secara manual mendefinisikan scalactugas, mereka menimpa apa pun yang saya atur di tingkat atas.
Stuart Golodetz
2
Catatan, bahwa menggunakan presetdef akan menyebabkan peringatan semut bahwa tugas javac telah didefinisikan ulang. Menambahkan includeantruntime ke setiap tugas javac menghindari ini. Saya tidak mengetahui kelemahan dari peringatan tersebut. Tapi ini mungkin berguna untuk orang yang 'membutuhkan' bangunan bersih.
mikijov
Ya, presetdef memberikan "Mencoba menimpa definisi lama dari tugas javac"
mike jones
62

Chet Hosey menulis penjelasan yang bagus di sini :

Secara historis, Ant selalu menyertakan runtime-nya sendiri di classpath yang disediakan untuk tugas javac. Jadi setiap pustaka yang disertakan dengan Semut, dan pustaka yang tersedia untuk semut, secara otomatis berada di classpath build Anda, suka atau tidak.

Diputuskan bahwa ini mungkin bukan yang diinginkan kebanyakan orang. Jadi sekarang ada opsi untuk itu.

Jika Anda memilih "true" (untuk includeantruntime), maka setidaknya Anda tahu bahwa build classpath Anda akan menyertakan runtime Ant. Jika Anda memilih "false" maka Anda menerima kenyataan bahwa perilaku build akan berubah antara versi yang lebih lama dan 1.8+.

Anda sebal karena melihat peringatan ini, Anda bahkan akan lebih tidak bahagia jika bangunan Anda hancur total. Menjaga perilaku default ini memungkinkan file build yang tidak dimodifikasi untuk bekerja secara konsisten antara versi Ant.

kgiannakakis
sumber
3
Saya selalu berpikir ini adalah fitur / pesan paling konyol yang pernah ada. Siapa yang mau 'bangunan berulang' di alat manajemen konfigurasi mereka? ;)
karmakaze
1
Jawaban ini tampaknya menjadi satu-satunya yang memberi tahu kita apa arti peringatan itu sebenarnya.
ty
26

Jawaban dari Daniel bekerja dengan sempurna. Berikut ini cuplikan sampel yang saya tambahkan ke build.xml saya:

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

Jika Anda suka saya bekerja dari commandline, jawaban cepatnya adalah mengeksekusi

export ANT_OPTS=-Dbuild.sysclasspath=ignore

Dan kemudian jalankan kembali script semut Anda.

slott
sumber
Ini membantu saya banyak . Saya menggunakan set ANT_OPTS=-Xms40M -Xmx512M -Dbuild.sysclasspath=ignore.
Paul Vargas
5

Gunakan <property name="build.sysclasspath" value="last"/>dalam file build.xml Anda

Untuk lebih jelasnya cari includeAntRuntimedi Ant javac

Nilai-nilai lain yang mungkin dapat ditemukan di sini

Ahmad Nadeem
sumber
-3

Saya menghadapi hal yang sama, saya check in di program dan fitur. ada pembaruan telah menginstal jdk1.8 yang tidak kompatibel dengan pengaturan lama saya (jdk1.6.0) untuk semut di gerhana. Saya menginstal pembaruan itu. sekarang, proyek semutku sedang membangun kesuksesan.

Cobalah, semoga ini membantu.

Garun Kumar Mishra
sumber