Pertanyaan Gradle, "sourceCompatibility" vs "targetCompatibility"?


Apa hubungan / perbedaan antara sourceCompatibility dan targetCompatibility? Apa yang terjadi ketika mereka diatur ke nilai yang berbeda?

Menurut Dokumentasi Gradle:

sourceCompatibility adalah "kompatibilitas versi Java untuk digunakan saat menyusun sumber Java." targetCompatibility adalah "versi Java untuk menghasilkan kelas untuk."

Pemahaman saya adalah itu targetCompatibility akan menghasilkan java bytecode yang kompatibel dengan versi Java tertentu, apakah ini bagian dari fungsionalitas sourceCompatibility?


75
2018-05-20 17:31


asal


Jawaban:


ini memetakan sampai ke javac - lihat bagian kompilasi lintas - source pada dasarnya adalah level bahasa sumber dan target adalah level bytecode yang dihasilkan.


53
2018-05-21 09:07



Hati-hati saat Anda menggunakan ini; kita sudah digigit oleh orang yang membuat asumsi.

Hanya karena Anda menggunakan sourceCompability (atau targetCompatibility) 1,5 tidak berarti Anda selalu dapat mengkompilasi kode Anda dengan JDK 1.6 dan mengharapkannya bekerja di bawah JDK 1.5. Masalahnya adalah pustaka yang tersedia.

Jika kode Anda terjadi untuk memanggil beberapa metode yang hanya tersedia di JDK 1.6 itu masih akan mengkompilasi dengan berbagai opsi Kompatibilitas untuk VM target. Tetapi ketika Anda menjalankannya, itu akan gagal karena metode menyinggung tidak hadir (Anda akan mendapatkan MethodNotFoundException atau ClassNotFoundException).

Untuk alasan ini, saya selalu bandingkan pengaturan Kompatibilitas dengan versi Java sebenarnya yang sedang saya bangun. Jika mereka tidak cocok, saya gagal membangunnya.


37
2018-03-11 13:22



sourceCompatibility = menentukan bahwa bahasa pemrograman Java digunakan untuk mengkompilasi .Jawa file. misalnya sourceCompatibility 1.6 = menetapkan bahwa versi 1.6 dari bahasa pemrograman Java digunakan untuk mengkompilasi .Jawa file.

Secara default sourceCompatibility = "versi JVM saat ini digunakan" dan targetCompatibility = sourceCompatibility 

targetCompatibility = Opsi memastikan bahwa file kelas yang dihasilkan akan kompatibel dengan VM yang ditentukan oleh targetCompatibility. Perhatikan bahwa dalam banyak kasus, nilai opsi -target adalah nilai opsi -source; dalam hal ini, Anda dapat menghilangkan opsi -target.

File kelas akan berjalan pada target yang ditentukan oleh targetCompatibility dan pada versi yang lebih baru, tetapi tidak pada versi VM yang lebih lama


22
2018-04-08 15:33