Estou usando Hibernate no meu aplicativo Java e simplesmente não consigo me livrar dessa ClassNotFoundException com JAXB. Eu literalmente tentei de tudo, mas não consigo consertar.
Estou usando Java 21.
Aqui está o erro que recebo:
Caused by: jakarta.xml.bind.JAXBException: Implementation of Jakarta XML Binding-API has not been found on module path or classpath.
at jakarta.xml.bind.ContextFinder.newInstance(ContextFinder.java:252) ~[?:?]
at jakarta.xml.bind.ContextFinder.newInstance(ContextFinder.java:240) ~[?:?]
at jakarta.xml.bind.ContextFinder.find(ContextFinder.java:381) ~[?:?]
at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:605) ~[?:?]
at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:546) ~[?:?]
at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:121) ~[?:?]
... 25 more
Caused by: java.lang.ClassNotFoundException: org.glassfish.jaxb.runtime.v2.ContextFactory
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) ~[?:?]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593) ~[?:?]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?]
at jakarta.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:113) ~[?:?]
at jakarta.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:146) ~[?:?]
at jakarta.xml.bind.ContextFinder.newInstance(ContextFinder.java:250) ~[?:?]
at jakarta.xml.bind.ContextFinder.newInstance(ContextFinder.java:240) ~[?:?]
at jakarta.xml.bind.ContextFinder.find(ContextFinder.java:381) ~[?:?]
at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:605) ~[?:?]
at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:546) ~[?:?]
at org.hibernate.boot.cfgxml.internal.JaxbCfgProcessor.unmarshal(JaxbCfgProcessor.java:121) ~[?:?]
... 25 more
E aqui está meu arquivo POM completo:
<groupId>org.test.project</groupId>
<artifactId>project-core</artifactId>
<version>1.0-SNAPSHOT</version>
<name>project-core</name>
<description>test project</description>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>minecraft-repo</id>
<url>https://libraries.minecraft.net/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.21.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-core -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.6.12.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.2.0</version>
</dependency>
</dependencies>
<build>
<defaultGoal>clean install</defaultGoal>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<!-- Maven Compiler Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
<!-- Maven Shade Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Observe que removi as dependências JAXB neste arquivo POM, mas já tentei adicionar a API JAXB e a implementação de tempo de execução e ele continuou me dando esse erro. Como eu disse antes, descompilei meu arquivo JAR e org.glassfish.jaxb.runtime.v2.ContextFactory foi compilado corretamente, pois faz parte da dependência do Hibernate.
Estas são as dependências que tentei adicionar antes:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<!-- JAXB Reference Implementation -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>4.0.0</version>
<scope>runtime</scope>
</dependency>
Também tentei várias versões dessas dependências. E tentei as dependências sun que também não funcionaram.
Tentei incluir classpaths no arquivo MANIFEST.mf - isso não resolveu o problema. E tentei usar a dependência Moxy do Eclipse em vez de JAXB (e incluí jaxb.properties), isso também não resolveu o problema.
Além disso, tentei adicionar as dependências do jaxb e excluí-las da dependência do Hibernate para garantir que não fossem conflitantes, mas isso também não resolveu o problema.
Tentei executá-lo em várias versões do Java e, como você pode imaginar, também não obtive sucesso.
Eu tentei todas as coisas possíveis para me livrar do java.lang.ClassNotFoundException: org.glassfish.jaxb.runtime.v2.ContextFactory e fazer o Hibernate funcionar, mas eu simplesmente não consigo consertá-lo. O que mais eu posso tentar? Ajuda é muito apreciada!