O Java 9 javac
tem um novo sinalizador --release
:
> javac --help
...
--release <release>
Compile for a specific VM version. Supported targets: 6, 7, 8, 9
Como é diferente de -source
e -target
sinalizadores? É apenas um atalho para -source X -target X
?
Respostas:
Não exatamente.
JEP 247: Compile for Older Platform Versions define esta nova opção de linha de comando
--release
:Então não, não é equivalente a
-source N -target N
. O motivo desta adição é declarado na seção "Motivação":Resumindo, especificar as opções de origem e destino não são suficientes para compilação cruzada. Como
javac
, por padrão, compila com base nas APIs mais recentes da plataforma, não é possível garantir que sejam executados em versões mais antigas. Você também precisa especificar a-bootclasspath
opção correspondente à versão mais antiga para fazer a compilação cruzada corretamente. Isso incluiria a versão correta da API para compilar e permitir a execução na versão mais antiga. Como era esquecido com frequência, foi decidido adicionar uma opção de linha de comando que fazia todas as coisas necessárias para uma compilação cruzada correta.Leituras adicionais na lista de discussão e Oracle Docs . O bug original foi arquivado aqui . Observe que, desde a integração desta opção, as compilações JDK vêm agrupadas com descrições das APIs da plataforma de versões mais antigas, mencionadas na seção "Riscos e suposições". Isso significa que você não precisa da versão mais antiga instalada em sua máquina para que a compilação cruzada funcione.
fonte
--release
sinalizador, seria inferida do JDK usado para compilar, que geralmente difere do JDK que você usa-source
e-target
. Isso pode incomodá-lo no caso de você usar classes / métodos introduzidos no JDK, nunca naquele que você almeja. Isso é muito sutil no caso de o compilador escolher uma sobrecarga de método que foi adicionada em uma versão posterior sobre a anterior que você pretendia, quebrando silenciosamente a compatibilidade binária.--release X
é mais do que apenas um atalho para-source X -target X
porque-source
e-target
não são suficientes para compilar com segurança para uma versão mais antiga. Você também precisa definir um-bootclasspath
sinalizador que deve corresponder à versão mais antiga (e esse sinalizador é frequentemente esquecido). Assim, em Java 9 eles fizeram uma única--release
bandeira que é um substituto para três bandeiras:-source
,-target
e-bootclasspath
.Portanto, este é um exemplo de compilação para Java 1.7:
javac --release 7 <source files>
Observe que você nem precisa ter o JDK 7 instalado em seu computador. O JDK 9 já contém as informações necessárias para evitar que você se vincule acidentalmente a símbolos que não existiam no JDK 7.
fonte