As APIs JAXB são consideradas APIs Java EE e, portanto, não estão mais contidas no caminho de classe padrão no Java SE 9. No Java 11, elas são completamente removidas do JDK.
O Java 9 apresenta os conceitos de módulos e, por padrão, o java.se
módulo agregado está disponível no caminho de classe (ou melhor, caminho do módulo). Como o nome indica, o java.se
módulo agregado não inclui as APIs Java EE que foram tradicionalmente empacotadas com o Java 6/7/8.
Felizmente, essas APIs Java EE que foram fornecidas no JDK 6/7/8 ainda estão no JDK, mas elas simplesmente não estão no caminho de classe por padrão. As APIs Java EE extras 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)
Para disponibilizar as APIs JAXB em tempo de execução, especifique a seguinte opção da linha de comandos:
--add-modules java.xml.bind
Mas ainda preciso disso para trabalhar com o Java 8 !!!
Se você tentar especificar --add-modules
com um JDK mais antigo, ele explodirá porque é uma opção não reconhecida. Sugiro uma das duas opções:
- Você pode definir qualquer opção apenas para Java 9+ usando a
JDK_JAVA_OPTIONS
variável de ambiente Essa variável de ambiente é lida automaticamente pelo java
iniciador para Java 9+.
- Você pode adicionar o
-XX:+IgnoreUnrecognizedVMOptions
para fazer a JVM ignorar silenciosamente as opções não reconhecidas, em vez de explodir. Mas cuidado! Quaisquer outros argumentos da linha de comando que você usar não serão mais validados para você pela JVM. Esta opção funciona com Oracle / OpenJDK e IBM JDK (a partir do JDK 8sr4).
Solução rápida alternativa: (apenas JDK 9/10)
Observe que você pode disponibilizar todos os módulos Java EE acima em tempo de execução, especificando a --add-modules java.se.ee
opção O java.se.ee
módulo é um módulo agregado que inclui java.se.ee
, além dos módulos da API Java EE acima. Observe que isso não funciona no Java 11 porque java.se.ee
foi removido no Java 11.
Solução adequada a longo prazo: (JDK 9 e além)
Os módulos da API Java EE listados acima estão todos marcados @Deprecated(forRemoval=true)
porque estão agendados para remoção no Java 11 . Portanto, a --add-module
abordagem não funcionará mais no Java 11 imediatamente.
O que você precisará fazer no Java 11 e encaminhar é incluir sua própria cópia das APIs Java EE no caminho de classe ou no caminho do módulo. Por exemplo, você pode adicionar as APIs JAX-B como uma dependência do Maven assim:
<!-- 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>
Consulte a página Implementação de Referência JAXB para obter mais detalhes sobre JAXB.
Para obter detalhes completos sobre a modularidade Java, consulte JEP 261: Módulo Sistema
Para desenvolvedores Gradle ou Android Studio: (JDK 9 e posterior)
Adicione as seguintes dependências ao seu build.gradle
arquivo:
dependencies {
// JAX-B dependencies for JDK 9+
implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
implementation "org.glassfish.jaxb:jaxb-runtime:2.3.2"
}