Eu tenho algum código que usa classes API JAXB que foram fornecidas como parte do JDK em Java 6/7/8. Quando eu executo o mesmo código com Java 9, em tempo de execução recebo erros indicando que as classes JAXB não podem ser encontradas.
As classes JAXB têm sido fornecidas como parte do JDK desde o Java 6, então por que o Java 9 não pode mais encontrar essas classes?
As APIs JAXB são consideradas APIs Java EE, e portanto não estão mais contidas no caminho padrão da classe no Java SE 9. No Java 11 elas são completamente removidas do JDK.
Java 9 introduz os conceitos de módulos, e por padrão o módulo agregado java.se' está disponível no caminho da classe (ou melhor, no caminho do módulo). Como o nome implica, o módulo agregado
java.se' inclui não as APIs Java EE que têm sido tradicionalmente empacotadas com Java 6/7/8.
Felizmente, essas APIs Java EE que foram fornecidas no JDK 6/7/8 ainda estão no JDK, mas por padrão não estão no caminho da classe. As APIs extra Java EE são fornecidas nos seguintes módulos:
java.activation
java.corba
java.transaction
java.xml.bind << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation
Solução rápida e suja: (apenas JDK 9/10)>br>
Para tornar as APIs JAXB disponíveis em tempo de execução, especifique a seguinte opção de linha de comando:
--add-modules java.xml.bind
Mas ainda preciso disto para trabalhar com o Java 8!!!! br> Se você tentar especificar `--add-modules' com um JDK mais antigo, ele irá explodir porque é uma opção não reconhecida. Eu sugiro uma de duas opções:
JDK_JAVA_OPTIONS'. Esta variável de ambiente é [automaticamente lida][1] pelo lançador
java` para Java 9+.Alternar solução rápida: (apenas JDK 9/10)>br>
Note que você pode tornar todos os módulos Java EE acima disponíveis em tempo de execução especificando a opção --add-modules java.se.ee'. O módulo
java.se.eeé um módulo agregado que inclui o
java.se.ee, assim como os módulos API Java EE acima. Nota, este ** não funciona no Java 11** porque o
java.se.ee` foi removido no Java 11.
Proper solução a longo prazo: (JDK 9 e mais) br>
Os módulos API Java EE listados acima são todos marcados como @Deprecated(forRemoval=true)
, porque eles estão [agendados para remoção][2] em [Java 11][3]. Então a abordagem --add-module
não funcionará mais no Java 11 fora da caixa.
O que você precisará fazer no Java 11 e encaminhar é incluir sua própria cópia das APIs Java EE no caminho da classe ou no caminho do módulo. Por exemplo, você pode adicionar as APIs JAX-B como uma dependência maven como esta:
<!-- API, java.xml.bind module -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Runtime, com.sun.xml.bind module -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
Veja a página JAXB Reference Implementation page para mais detalhes sobre o JAXB.
Para detalhes completos sobre a modularidade Java, consulte [JEP 261: Module System][4].
Para o desenvolvedor Gradle ou Android Studio: (JDK 9 e posteriores)
Adicione as seguintes dependências ao seu arquivo build.gradle:
"Groovy dependências { // Dependências JAX-B para JDK 9+ implementação "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2 implementação "org.glassfish.jaxb:jaxb-runtime:2.3.2" }
[1]: https://www.oracle.com/technetwork/java/javase/9-new-features-3745613.html#JDK-8170832
[2]: http://openjdk.java.net/jeps/320
[3]: http://openjdk.java.net/projects/jdk/11/
[4]: http://openjdk.java.net/jeps/261
[5]: https://stackoverflow.com/a/46455026/3763032
Isto funcionou para mim:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.7.0</version>
</dependency>
Como @Jasper sugeriu, para evitar depender de toda a biblioteca do EclipseLink, você também pode depender apenas do EclipseLink MOXy:
**Maven***
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.7.3</version>
</dependency>
**Grade...
compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'
Como dependências para o meu aplicativo Java 8, que produz um *.jar que pode ser executado tanto pelo JRE 8 ou JRE 9 sem argumentos adicionais.
Além disso, isso precisa ser executado em algum lugar antes que o JAXB API seja utilizado:
System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");
Funciona muito bem até agora, como uma alternativa. Mas não parece ser uma solução perfeita...
No momento da compilação, bem como no tempo de execução, adicione a chave ``--add-modules java.xml.bind```.
javac --add-modules java.xml.bind <java file name>
java --add-modules java.xml.bind <class file>
Uma boa introdução dos módulos JDK 9
também pode ser encontrada em :