Eu tenho algum código que usa classes de API JAXB que foram fornecidas como parte do JDK em Java 6/7/8. Quando executo o mesmo código com o Java 9, em tempo de execução, recebo erros indicando que não foi possível encontrar as classes JAXB.
As classes JAXB são fornecidas como parte do JDK desde o Java 6, então por que o Java 9 não pode mais encontrar essas classes?
Respostas:
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, ojava.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:
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:JDK_JAVA_OPTIONS
variável de ambiente Essa variável de ambiente é lida automaticamente pelojava
iniciador para Java 9+.-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 Ojava.se.ee
módulo é um módulo agregado que incluijava.se.ee
, além dos módulos da API Java EE acima. Observe que isso não funciona no Java 11 porquejava.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:
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:fonte
javax.xml.bind
e outras classes JavaEE estão agendadas para remoção no Java 11, por JEP-320 .java.se.ee
módulo foi removido, para que a--add-modules
solução não funcione mais. Use a solução recomendada: adicione JAXB como uma dependência separada.No meu caso (jarra de gordura para botas de primavera), basta adicionar o seguinte ao pom.xml.
fonte
testCompile('javax.xml.bind:jaxb-api')
funcionou para mim.<scope>runtime</scope>
para tal casoNenhuma dessas soluções funcionou bem para mim no recente JDK 9.0.1.
Eu descobri que essa lista de dependências é suficiente para um funcionamento adequado, portanto você não precisa especificar explicitamente
--add-module
(embora seja especificada nos poms dessas dependências). O único que você precisa é especificar esta lista de dependências:fonte
pom.xml
arquivo da configuração do Maven. Se você não sabe o que é isso, então é melhor começar do beggining<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>
como última dependência.Isso funcionou para mim:
Atualizar
Como o @Jasper sugeriu, para evitar a dependência de toda a biblioteca EclipseLink, você também pode depender apenas do EclipseLink MOXy:
Maven
Gradle
Como dependências para meu aplicativo Java 8, que produz um * .jar que pode ser executado pelo JRE 8 ou JRE 9 sem argumentos adicionais.
Além disso, isso precisa ser executado em algum lugar antes que a API JAXB seja usada:
Funciona muito bem até agora, como uma solução alternativa. Não parece uma solução perfeita ...
fonte
org.eclipse.persistence:eclipselink
apenas para obter APIs JAXB é uma dependência muito pesada, a menos que você já esteja usando o eclipselink?-XX:+IgnoreUnrecognizedVMOptions
opção de linha de comando (atualizei a minha resposta com detalhes)org.eclipse.persistence
, artifactIdorg.eclipse.persistence.moxy
.solução limpa para todos os JDKs> = 9
Você precisa adicionar duas dependências à sua compilação
Como uma implementação, eu escolhi usar a implementação de referência do glassfish para se livrar das antigas classes / bibliotecas com.sun. Então, como resultado, adicionei no meu maven build
Observe que a partir da versão 2.3.1, você não precisa adicionar mais o javax.activation. (consulte https://github.com/eclipse-ee4j/jaxb-ri/issues/1222 )
fonte
é porque a versão java, se você estiver usando o jdk 9 ou uma versão posterior, basta adicionar isso ao seu pom
fonte
Para resolver isso, importei alguns arquivos JAR no meu projeto:
http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar
http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar
http://search.maven.org/remotecontent?filepath=com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar
fonte
com.sun.xml.bind
artefatos são antigos e fornecidos apenas para compatibilidade com versões anteriores. Você deve usar osorg.glassfish.jaxb
artefatos equivalentes , como mencionado em algumas das outras respostas.No momento da compilação, bem como no tempo de execução, adicione a opção
--add-modules java.xml.bind
Uma boa introdução dos
JDK 9
módulos também pode ser encontrada em: https://www.youtube.com/watch?v=KZfbRuvv5qcfonte
Isso funcionou para mim. Adicionar apenas jaxb-api não foi suficiente.
fonte
com.sun.xml.bind
artefatos são antigos e fornecidos apenas para compatibilidade com versões anteriores. Você deve usar osorg.glassfish.jaxb
artefatos equivalentes , como mencionado em algumas das outras respostas.Acesse Your Build.gradle e inclua dependências abaixo para Java 9 ou Java 10.
fonte
É possível usar a
--add-modules=java.xml.bind
opção JVM para incluir o módulo de ligação xml no ambiente de tempo de execução da JVM.Por exemplo:
java --add-modules=java.xml.bind XmlTestClass
fonte
Atualização em abril de 2019
O Changelong para lançamentos JAXB está em https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html
trechos:
O link oficial está em https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts
O org.glassfish.jaxb: jaxb-runtime: jar: 2.3.2 puxa:
Resposta original
A seguir Quais artefatos devo usar para o JAXB RI no meu projeto Maven? no Maven, você pode usar um perfil como:
A árvore de dependência mostra:
Para usar isso no Eclipse, diga Oxygen.3a Release (4.7.3a) ou posterior, Ctrl-Alt-P, ou clique com o botão direito do mouse no projeto Maven e selecione o perfil.
fonte
javax.xml.bind
>jaxb-api
que eu já vi em outros lugares é realmente redundante. A dependência do glassfish o puxa. Eu apenas tentei isso, e realmente funciona.Para a execução do Java Web Start, podemos usar a sugestão de Andy Guibert assim:
Observe o "=" extra nos --add-modules. Consulte este tíquete OpenJDK ou a última nota em "Noções básicas sobre avisos de acesso em tempo de execução" do Guia de Migração do Oracle JDK 9 da Java Platform, Standard Edition .
fonte
adicione dependência javax.xml.bind no pom.xml
fonte
Como o JavaEE agora é governado por https://jakarta.ee/ , as novas coordenadas do Maven a partir do 2.3.2 são:
https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts
O primeiro jaxb.version lançado é o 2.3.2.
fonte
Eu segui este URL e as configurações abaixo realmente me ajudaram. Eu uso o Java 10 com STS IDE no Macbook Pro. Ele funciona como um encanto.
fonte
Isso resolveu meus problemas com dependências executando o Apache Camel 2.24.1 no Java 12:
fonte
Encontrei o mesmo problema usando o Spring Boot
2.0.5.RELEASE
no Java 11.Adicionar
javax.xml.bind:jaxb-api:2.3.0
sozinho não resolveu o problema. Também tive que atualizar o Spring Boot para o Milestone mais recente2.1.0.M2
, portanto, presumo que isso será corrigido no próximo lançamento oficial.fonte
Você precisa adicionar dependências JAX-B ao usar o JDK 9+. Para o usuário Android Studio, você precisa adicionar este à sua
build.gradle
'sdependencies {}
bloco:fonte
Também tropecei no ClassNotFoundException: javax.xml.bind.DatatypeConverter usando Java 11 e
Tentei todas essas coisas adicionando javax.xml.bind: jaxb-api ou boot de primavera jakarta.xml.bind-api .. Encontrei uma dica para correções no jjwt versão 0.10.0 .. mas o mais importante é que o pacote jjwt é agora divida!
Portanto, verifique esta referência: https://github.com/jwtk/jjwt/issues/510
Simplesmente, se você usar
ir para
jjwt versão 0.11.x, mas use os pacotes divididos: https://github.com/jwtk/jjwt#install
Você não encontrará uma versão superior para a dependência do jjwt, pois eles dividem os pacotes.
Felicidades.
fonte
Não é uma resposta, mas um adendo: recebi porque a execução
groovysh
(Groovy 2.4.13) se JAVA_HOME aponta para uma instalação do Java 9 (java version "9.0.1"
para ser mais preciso) falha abismalmente:A solução foi:
Vá para o projeto JAXB em github.io ( "JAXB é licenciado sob uma licença dupla - CDDL 1.1 e GPL 2.0 com exceção de caminho de classe" )
Baixar
jaxb-ri-2.3.0.zip
Descompacte o arquivo onde quer que você coloque seus arquivos de infraestrutura Java (no meu caso
/usr/local/java/jaxb-ri/
). Pode haver outra solução (talvez via SDKMAN, não sei)Verifique se os jars no subdiretório lib estão no
CLASSPATH
. Eu faço isso através de um script iniciado na inicialização do bash, chamado/etc/profile.d/java.sh
, onde adicionei (entre muitas outras linhas) o seguinte loop:Embalado em uma função ...
E funciona!
fonte
Você só precisa de 1 dependência:
fonte
OK, estou tendo o mesmo tipo de problema, mas estava usando o Java 8 e continuava recebendo esse erro, tentei a maioria das soluções. mas acontece que meu maven ainda estava apontando para o java 9, apesar de eu ter definido a versão global do Java para 8, assim que resolvi que tudo funcionava.
Para qualquer pessoa que possa ter esse tipo de problema, consulte Como corrigir o Maven para usar o Java padrão
fonte
Resposta antiga "Problema resolvido com a mudança para o amazoncorretto" Resposta de notícias: Usei o corretto mais recente, mas é semelhante ao jdk 1.8. mesmo assim, precisamos adicionar dependências manualmente
fonte
amazoncorretto:latest
atualmente dá JDK 8, e não 11. Muitas imagens Docker ainda são baseadas em JDK 8, precisamente por causa dos problemas de compatibilidade causados pela remoção API entre JDK 8 -> 11As versões de dependência que eu precisava usar ao compilar para o destino Java 8. Aplicativo testado em Java 8, 11 e 12 JREs.
fonte
Para mim no Java 11 e gradle, foi o que funcionou:
fonte
Você precisa adicionar dependências jaxb ao maven. A versão 2.3.2 da implementação do glassfish é perfeitamente compatível com a nova versão 2.3.2 da jakarta EE jaxb api.
fonte
Eu tive problemas semelhantes depois de atualizar meu projeto para java 11, então o que o corrigiu foi atualizar para o spring boot 2.1.1 que aparentemente tem suporte para java 11, isso ajudou
fonte
Eu sei que estou atrasado para a festa, mas meu erro acabou precisando de uma solução diferente ... super simples também
Inicialmente, depoloyed para o Tomcat 9 e percebi que precisava de 7 ... esqueci de mapear meu caminho de classe de volta à versão 7 no build.xml
Espero que isso resolva o erro de alguém no futuro, que consegue ignorar esse problema simples como eu fiz!
fonte
Se você estiver chamando serviços da web SOAP (por exemplo, usando
jaxws-maven-plugin
) apenas adicionando essa dependência, todos os erros JAXB desaparecerão:Testado com Java 13
fonte