Gradle, “sourceCompatibility” ve “targetCompatibility”?


130

Arasındaki ilişki / fark nedir sourceCompatibilityve targetCompatibility? Farklı değerlere ayarlandıklarında ne olur?

Gradle belgelerine göre :

sourceCompatibility"Java kaynağını derlerken kullanılacak Java sürümü uyumluluğu" dır. targetCompatibility"Sınıfların oluşturulacağı Java sürümü."

Anladığım kadarıyla, targetCompatibilityJava'nın belirli bir sürümüyle uyumlu java bayt kodu üretecek, bu, işlevinin bir alt kümesi sourceCompatibilitymi?

Yanıtlar:



63

Bunları kullanırken dikkatli olun; varsayımlar yapan insanlar tarafından ısırıldık.

1.5 olan sourceCompability (veya targetCompatibility) kullanmanız, kodunuzu her zaman JDK 1.6 ile derleyebileceğiniz ve JDK 1.5 altında çalışmasını bekleyebileceğiniz anlamına gelmez. Sorun, mevcut kütüphanelerdir.

Kodunuz yalnızca JDK 1.6'da kullanılabilen bir yöntemi çağırırsa, yine de hedef VM için çeşitli Uyumluluk seçenekleriyle derlenir. Ancak çalıştırdığınızda, sorun teşkil eden yöntem mevcut olmadığından başarısız olur (bir MethodNotFoundException veya ClassNotFoundException alırsınız).

Bu nedenle, Uyumluluk ayarını her zaman altında oluşturduğum gerçek Java sürümüyle karşılaştırırım. Eğer eşleşmezlerse, yapıda başarısız olurum.


4
Bu ince ama çok önemli bir gözlem.
Natix

Onları nasıl karşılaştırırsınız?
zero01alpha

Yapıda neden başarısız oluyorsunuz? "Bootstrap sınıf yolu" seçeneği sadece bu sorunu azaltmak için verilmiştir. Her zaman uygun önyüklemeyi kullanabilirsiniz ve iyi çalışmalıdır.
Codebender

6
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())Build.gradle dosyasının hemen başında bu sorunu bu şekilde çözüyorum.
Xerus

2
Java 9'dan beri , yalnızca belirtilen Java sürümünde bulunan API kullanımına izin vererek, bu sorunu javacçözmeyi --releaseamaçlayan yeni bir seçenek vardır . Bununla ilgili daha fazla bilgi için stackoverflow.com/a/43103038/4653517
James Mudd

35

sourceCompatibility = Java programlama dili sürümünün .java dosyalarını derlemek için kullanılacağını belirtir . Örneğin, sourceCompatibility 1.6 = Java programlama dilinin 1.6 sürümünün .java dosyalarını derlemek için kullanılacağını belirtir .

Varsayılan olarak sourceCompatibility = "kullanımdaki mevcut JVM sürümü" ve targetCompatibility = sourceCompatibility

targetCompatibility = Bu seçenek, oluşturulan sınıf dosyalarının targetCompatibility tarafından belirtilen VM'lerle uyumlu olmasını sağlar. Çoğu durumda, -target seçeneğinin değerinin -source seçeneğinin değeri olduğunu unutmayın; bu durumda -target seçeneğini atlayabilirsiniz.

Sınıf dosyaları targetCompatibility tarafından belirtilen hedefte ve sonraki sürümlerde çalışacak, ancak VM'nin önceki sürümlerinde çalışmayacaktır.


projemizin hangilerini kullandığını nasıl anlarız?
isJulian00

0

Bana göre "sourceCompatibility", kaynak kodunuzda hangi özelliği kullanabileceğiniz anlamına gelir. Örneğin, sourceCompatibility'yi 1.7 olarak ayarlarsanız, jdk sürümünüz olsa bile java 8'de yeni bir özellik olan lambda ifadesini kullanamazsınız. 1.8.
“TargetCompatibility” gelince, oluşturulan sınıf dosyasının hangi jre sürümünde çalıştırılabileceği anlamına gelir, eğer 1.8'e ayarlarsanız, jdk 1.7'de başarılı bir şekilde çalışmayabilir, ancak genellikle jdk'nin daha yüksek sürümünde çalışabilir.


0

Bunlar javac komutunun işaretleridir.

javac [options] [sourcefiles]

Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...

Başka bir deyişle: bir sourcesürümde bir kod yazarsınız ve sınıflarınızı targetVM sürümüne derlersiniz . Örneğin daha eski java sürümüne sahip başka bir iş istasyonunda çalıştırmak için.

Göre: https://docs.oracle.com/en/java/javase/11/tools/javac.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.