Java 9 derleyicisindeki --release bayrağı nedir?


89

Java 9'un javacyeni bir bayrağı var --release:

> javac --help
...

--release <release>
    Compile for a specific VM version. Supported targets: 6, 7, 8, 9

-sourceVe -targetbayraklardan farkı nedir? Bu sadece bir kısayol -source X -target Xmu?


Yanıtlar:


113

Tam olarak değil.

JEP 247: Eski Platform Sürümleri için Derleme , bu yeni komut satırı seçeneğini tanımlar--release:

--releaseDerleyiciyi, verilen platform sürümünün bir uygulamasına bağlanacak sınıf dosyalarını üretecek şekilde otomatik olarak yapılandıran yeni bir komut satırı seçeneği tanımladık . Platformlar içinde önceden tanımlanmış için javac, --release Neşdeğerdir-source N -target N -bootclasspath <bootclasspath-from-N> . (vurgu benim)

Yani hayır, eşdeğer değil -source N -target N. Bu eklemenin nedeni "Motivasyon" bölümünde belirtilmiştir:

javaciki komut satırı seçeneği sağlar -sourceve -targetbunlar, sırasıyla derleyici tarafından kabul edilen Java dilinin sürümünü ve ürettiği sınıf dosyalarının sürümünü seçmek için kullanılabilir. Ancak varsayılan javacolarak platform API'lerinin en son sürümüne göre derler. Derlenen program bu nedenle yanlışlıkla yalnızca platformun mevcut sürümünde bulunan API'leri kullanabilir. Bu tür programlar, -sourceve 'ye iletilen değerlerden bağımsız olarak platformun eski sürümlerinde çalışamaz -target. seçenekler. Bu, uzun vadeli bir kullanılabilirlik sorunudur, çünkü kullanıcılar bu seçenekleri kullanarak, belirtilen platform sürümünde çalışabilen sınıf dosyalarını elde edeceklerini umarlar.

Kısaca kaynak ve hedef seçeneklerinin belirtilmesi çapraz derleme için yeterli değildir. Çünkü javac, varsayılan olarak, platform API'leri en son karşı derler, onlar eski sürümlerinde çalışacak şekilde garanti edilemez. Ayrıca, -bootclasspathdoğru şekilde çapraz derlemek için eski sürüme karşılık gelen seçeneği de belirtmeniz gerekir . Bu, eski sürümle derlenecek ve çalıştırılmasına izin verecek doğru API sürümünü içerir. Sıklıkla unutulduğu için, doğru bir şekilde çapraz derleme yapmak için gerekli tüm şeyleri yapan bir komut satırı seçeneği eklemeye karar verildi.

Posta listesi ve Oracle Belgelerinde daha fazla bilgi edinin . Orijinal hata burada dosyalandı . Bu seçeneğin entegrasyonundan bu yana, JDK yapılarının "Riskler ve Varsayımlar" bölümünde bahsedilen eski sürümlerin platform API'lerinin açıklamalarıyla birlikte geldiğini unutmayın. Bu, çapraz derlemenin çalışması için makinenizde kurulu olan eski sürüme ihtiyacınız olmadığı anlamına gelir.


bir şüphe, kodda jdk 9-11'in özelliklerini kullanmak mümkün olabilir mi ve yine de java runtime 8 üzerinde çalışıyor mu?
Cristiano

Hayır, jre 8 ikili dosyasında olmayacaklardı
Rogue

"Platform API" ile ne yapıyorsunuz? Bayt kodu düzeyinde bir şey var mı? veya temeldeki x86 platformu veya işletim sistemi API'leri ile ilgili bir şey?
Jose Cifuentes

2
@JoseCifuentes, burada "Platform API" olmadan, JDK API onun versiyonunu verilir --releaseJDK JDK genellikle farklıdır Eğer kullanarak hedefleme derleme için kullanılan gelen bayrak, çıkarılabilir olur -sourceve -target. Asla JDK'da değil, hedeflediğiniz sınıflarda tanıtılan sınıfları / yöntemleri kullanmanız durumunda bu sizi ısırabilir. Bu, derleyicinin önceki sürümden daha sonraki sürümde eklenmiş olan bir yöntem aşırı yüklemesini seçmesi ve böylece sessizce ikili uyumluluğu bozması durumunda daha incedir.
Oliver Gondža

30

--release Xdaha adil bir kısayol daha -source X -target Xçünkü -sourceve -targetgüvenle eski sürüme derlemek için yeterli değildir. Ayrıca -bootclasspath, eski sürüme uygun olması gereken bir bayrak ayarlamanız gerekir (ve bu bayrak genellikle unutulur). Yani, Java 9'da tek bir yapılan --releaseüç bayrakları yerine geçer bayrak: -source, -targetve -bootclasspath.

Bu, Java 1.7'ye derlemenin bir örneğidir:

javac --release 7 <source files>

Bilgisayarınızda JDK 7'nin kurulu olmasına bile gerek olmadığını unutmayın. JDK 9, yanlışlıkla JDK 7'de bulunmayan simgelere bağlanmanızı önlemek için gerekli bilgileri zaten içermektedir.

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.