Qual è il flag --release nel compilatore Java 9?


Risposte:


113

Non esattamente.

JEP 247: Compile for Old Platform Versions definisce questa nuova opzione della riga di comando--release:

Abbiamo definito una nuova opzione della riga di comando --release, che configura automaticamente il compilatore per produrre file di classe che si collegheranno a un'implementazione della versione della piattaforma data. Per le piattaforme predefinite in javac, --release Nè equivalente a-source N -target N -bootclasspath <bootclasspath-from-N> . (enfasi mia)

Quindi no, non è equivalente a -source N -target N. Il motivo di questa aggiunta è indicato nella sezione "Motivazione":

javacfornisce due opzioni della riga di comando -sourcee -target, che possono essere utilizzate per selezionare la versione del linguaggio Java accettata dal compilatore e la versione dei file di classe che produce, rispettivamente. Per impostazione predefinita, tuttavia, viene javaccompilato con la versione più recente delle API della piattaforma. Il programma compilato può quindi utilizzare accidentalmente API disponibili solo nella versione corrente della piattaforma. Tali programmi non possono essere eseguiti su versioni precedenti della piattaforma, indipendentemente dai valori passati a -sourcee -target. opzioni. Questo è un punto dolente per l'usabilità a lungo termine, poiché gli utenti si aspettano che utilizzando queste opzioni otterranno file di classe che possono essere eseguiti sulla versione della piattaforma specificata.

In breve, specificare le opzioni di origine e destinazione non è sufficiente per la compilazione incrociata. Poiché javac, per impostazione predefinita, viene compilato con le API della piattaforma più recenti, non è possibile garantirne l'esecuzione su versioni precedenti. È inoltre necessario specificare l' -bootclasspathopzione corrispondente alla versione precedente per eseguire correttamente la compilazione incrociata. Ciò includerebbe la versione API corretta per la compilazione e consentire l'esecuzione sulla versione precedente. Poiché molto spesso è stato dimenticato, è stato deciso di aggiungere un'opzione della riga di comando che ha fatto tutte le cose necessarie per eseguire correttamente la compilazione incrociata.

Ulteriori letture nella mailing list e Oracle Docs . Il bug originale è stato archiviato qui . Si noti che dall'integrazione di questa opzione, le build JDK sono state fornite in bundle con le descrizioni delle API della piattaforma delle versioni precedenti, menzionate nella sezione "Rischi e presupposti". Ciò significa che non è necessaria la versione precedente installata sulla macchina affinché la compilazione incrociata funzioni.


un dubbio, sarebbe possibile utilizzare le funzionalità di jdk 9-11 nel codice e funziona ancora su java runtime 8?
Cristiano

No, non sarebbero presenti nel binario jre 8
Rogue

Cosa fate voi uomini per "Platform API"? C'è qualcosa a livello di codice byte? o qualcosa relativo alla piattaforma x86 sottostante o alle API del sistema operativo?
Jose Cifuentes

2
@JoseCifuentes, "API della piattaforma" qui viene fornita l'API JDK, la sua versione, senza il --releaseflag, verrebbe dedotta da JDK utilizzato per la compilazione, che generalmente differisce dal JDK target utilizzando -sourcee -target. Questo può morderti nel caso in cui ti capiti di utilizzare classi / metodi introdotti mai in JDK rispetto a quello a cui ti rivolgi. Questo è molto sottile nel caso in cui il compilatore scelga un sovraccarico del metodo che è stato aggiunto nella versione successiva rispetto a quello precedente che si intendeva interrompendo silenziosamente la compatibilità binaria.
Oliver Gondža

30

--release Xè più di una semplice scorciatoia per -source X -target Xperché -sourcee -targetnon sono sufficienti per compilare in sicurezza una versione precedente. È inoltre necessario impostare un -bootclasspathflag che deve corrispondere alla versione precedente (e questo flag viene spesso dimenticato). Così, in Java 9 hanno fatto una sola --releasebandiera che è un sostituto per tre bandiere: -source, -targete -bootclasspath.

Quindi, questo è un esempio di compilazione in Java 1.7:

javac --release 7 <source files>

Nota che non hai nemmeno bisogno di avere JDK 7 installato sul tuo computer. JDK 9 contiene già le informazioni necessarie per impedire il collegamento accidentale a simboli che non esistevano in JDK 7.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.