Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I have some code that uses JAXB API classes which have been provided as a part of the JDK in Java 6/7/8. When I run the same code with Java 9, at runtime I get errors indicating that JAXB classes can not be found.

The JAXB classes have been provided as a part of the JDK since Java 6, so why can Java 9 no longer find these classes?

building with Java 8 will get your code to compile yes, but when you try to run that compiled code on Java 9+ it will fail because JAX-B is not present. Andy Guibert Oct 24, 2018 at 12:07 For Java 11, this article's solution is up to date: crunchify.com/java-11-and-javax-xml-bind-jaxbcontext Eric Jan 11, 2019 at 9:33

The JAXB APIs are considered to be Java EE APIs and therefore are no longer contained on the default classpath in Java SE 9. In Java 11, they are completely removed from the JDK.

Java 9 introduces the concepts of modules, and by default, the java.se aggregate module is available on the classpath (or rather, module-path). As the name implies, the java.se aggregate module does not include the Java EE APIs that have been traditionally bundled with Java 6/7/8.

Fortunately, these Java EE APIs that were provided in JDK 6/7/8 are still in the JDK, but they just aren't on the classpath by default. The extra Java EE APIs are provided in the following modules:

java.activation
java.corba
java.transaction
java.xml.bind  << This one contains the JAXB APIs
java.xml.ws
java.xml.ws.annotation

Quick and dirty solution: (JDK 9/10 only)

To make the JAXB APIs available at runtime, specify the following command-line option:

--add-modules java.xml.bind

But I still need this to work with Java 8!!!

If you try specifying --add-modules with an older JDK, it will blow up because it's an unrecognized option. I suggest one of two options:

  • You can set any Java 9+ only options using the JDK_JAVA_OPTIONS environment variable. This environment variable is automatically read by the java launcher for Java 9+.
  • You can add the -XX:+IgnoreUnrecognizedVMOptions to make the JVM silently ignore unrecognized options, instead of blowing up. But beware! Any other command-line arguments you use will no longer be validated for you by the JVM. This option works with Oracle/OpenJDK as well as IBM JDK (as of JDK 8sr4).
  • Alternate quick solution: (JDK 9/10 only)

    Note that you can make all of the above Java EE modules available at run time by specifying the --add-modules java.se.ee option. The java.se.ee module is an aggregate module that includes java.se.ee as well as the above Java EE API modules. Note, this doesn't work on Java 11 because java.se.ee was removed in Java 11.

    Proper long-term solution: (JDK 9 and beyond)

    The Java EE API modules listed above are all marked @Deprecated(forRemoval=true) because they are scheduled for removal in Java 11. So the --add-module approach will no longer work in Java 11 out-of-the-box.

    What you will need to do in Java 11 and forward is include your own copy of the Java EE APIs on the classpath or module path. For example, you can add the JAX-B APIs as a Maven dependency like this:

    <!-- 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>
    

    See the JAXB Reference Implementation page for more details on JAXB.

    For full details on Java modularity, see JEP 261: Module System

    As of July 2022, the latest version of the bind-api and jaxb-runtime is 4.0.0. So you can also use

        <version>4.0.0</version>
    

    ...within those dependency clauses. But if you do so, the package names have changed from javax.xml.bind... to jakarta.xml.bind.... You will need to modify your source code to use these later versions of the JARs.

    For Gradle or Android Studio developer: (JDK 9 and beyond)

    Add the following dependencies to your build.gradle file:

    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"
                    So if the Java EE API modules are marked deprecated does that mean it is a possibility that in Java 10 JAXB will no longer be available at runtime in Java 10? That seems like a step backwards. We will have to go back to the pre-6 practice of including JAXB as a dependency.
    – Michael
                    Sep 22, 2017 at 17:35
                    Using --add-modules java.se.ee or --add-modules ALL-SYSTEM as a workaround is not recommended according to migration guide here docs.oracle.com/javase/9/migrate  under section Modules Shared with Java EE Not Resolved by Default --> point 1
    – justMe
                    Oct 20, 2017 at 14:32
                    With Java 10 officially released, we can confirm that the add-modules method will still work. The javax.xml.bind and other JavaEE classes are scheduled for removal in Java 11, per JEP-320.
    – Joep Weijers
                    Mar 21, 2018 at 11:02
                    And now Java 11 is released and the java.se.ee module has been removed, so the --add-modules solution does not work anymore. Use the recommended solution instead: add JAXB as a separate dependency.
    – Jesper
                    Sep 30, 2018 at 12:30
                    Like @pamcevoy mentioned, no need to specify the version of jaxb-api when using Spring Boot. Boot manages the version automatically.
    – Marcel Overdijk
                    Jul 12, 2018 at 13:32
                    @Tuno's link didn't work for me, fixed link is: github.com/spring-projects/spring-boot/wiki/…
    – Cisco
                    Dec 12, 2018 at 1:01
    
  • a jaxb implementation
  • As an implementation I chose to use the reference implementation by glassfish to get rid of old com.sun classes / libraries. So as a result I added in my maven build

    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.1</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jaxb</groupId>
      <artifactId>jaxb-runtime</artifactId>
      <version>2.3.1</version>
    </dependency>
    

    Note that from version 2.3.1 you don't need to add the javax.activation any longer. (see https://github.com/eclipse-ee4j/jaxb-ri/issues/1222)

    @k.liakos I am not sure. The jaxb-runtime jar and the api-jar do not share the same classes/packages. I guess it depends on your code. If your code does not use the classes from the package 'javax.xml.bind' then you probably don't need it. The topic of this thread is that 'javax/xml/bind/JAXBException' cannot be found; this class is only in the jaxb-api. – Sebastian Thees Nov 2, 2018 at 9:30 where is pom.xml file in project which is writable , in my project all pom.xml file only readbale, Is I need to create another one, if yes where i create this. @SebastianThees – Surajkaran Meghwanshi Jan 11 at 6:38

    None of these solutions worked fine for me in the recent JDK 9.0.1.

    I found that this list of dependencies is enough for a proper functioning, so you don't need to explicitly specify --add-module (though it is specified within these dependencies's pom's). The only you need is to specify this list of dependencies:

    <dependencies>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
                    @Anil this is a pom.xml file of the Maven configuration. If you don't know what is that, then it is better to start from beggining
    – Andremoniy
                    Feb 13, 2018 at 13:16
                    An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.sun.xml.bind.v2.runtime.reflect.opt.Injector (file:/C:/Users/eis/.m2/repository/com/sun/xml/bind/jaxb-impl/2.3.0/jaxb-impl-2.3.0.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) WARNING: Please consider reporting this to the maintainers of com.sun.xml.bind.v2.runtime.reflect.opt.Injector WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release
    – Stefan
                    Feb 19, 2018 at 10:02
                    This worked for me on JDK 9.0.4 (I was calling JAXB related code through a Maven plugin with Maven 3.5.3). Although I would use <dependency>             <groupId>javax.activation</groupId>             <artifactId>javax.activation-api</artifactId>             <version>1.2.0</version>         </dependency> as last dependency.
    – scrutari
                    Apr 20, 2018 at 22:58
                    Awesome. I had a situation where - for some reason - a spring boot app would run in intellij CE but not eclipse on mac, and in eclipse but not intellij CE on win10. Being able to work in one IDE on two platforms is an advantage.
    – kometen
                    May 25, 2018 at 13:22
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.7.0</version>
    </dependency>
    

    Update

    As @Jasper suggested, in order to avoid depending on the entire EclipseLink library, you can also just depend on EclipseLink MOXy:

    Maven

    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.moxy</artifactId>
        <version>2.7.3</version>
    </dependency>
    

    Gradle

    compile group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.moxy', version: '2.7.3'
    

    As dependencies for my Java 8 app, which produces a *.jar which can be run by both JRE 8 or JRE 9 with no additional arguments.

    In addition, this needs to be executed somewhere before JAXB API will be used:

    System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory");
    

    Works great so far, as a workaround. Doesn't look like a perfect solution though...

    adding org.eclipse.persistence:eclipselink just to get JAXB APIs is a very heavy-weight dependency, unless you are already using eclipselink? – Andy Guibert Sep 27, 2017 at 18:59 Yes it is heavy (~9mb) and yes I've been using that already. I've mentioned that this is simply an alternative workaround for those who, maybe temporary, will have to use both 8 and 9 JREs for the same jar/war without providing command-line arguments. – Mikhail Kholodkov Sep 27, 2017 at 19:33 for the sake of interop between JDK 8 & 9, I would recommend using the -XX:+IgnoreUnrecognizedVMOptions command line option (updated my answer with details) – Andy Guibert Sep 27, 2017 at 19:55 System.setProperty("javax.xml.bind.JAXBContextFactory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); does not work for me – David Brossard Feb 16, 2018 at 18:00 To avoid depending on the entire EclipseLink library, you can also just depend on EclipseLink MOXy: groupId org.eclipse.persistence, artifactId org.eclipse.persistence.moxy. – Jesper Sep 30, 2018 at 13:14

    it´s because java version if you are using jdk 9 or a later version just add this to your pom

    <dependency>
      <groupId>javax.xml.bind</groupId>
      <artifactId>jaxb-api</artifactId>
      <version>2.3.0</version>
    </dependency>
                    @Cesar Rodriguez T, I tried this with a swagger example and compiling worked but running gave errors.  I used the selected answer which included more dependencies and that worked.
    – PatS
                    Nov 13, 2018 at 13:24
                    In my project two pom.xml i found but they not writable , its only in readable format what i need to do? @CesarRodriguez
    – Surajkaran Meghwanshi
                    Jan 11 at 6:41
    

    http://search.maven.org/remotecontent?filepath=com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar

  • jaxb-api-2.3.0.jar
  • http://search.maven.org/remotecontent?filepath=javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar

  • jaxb-core-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

  • jaxb-impl-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

  • Download above files and copy them into libs folder in the project
  • Add the imported JAR files in Java Build Path
  • Note that the com.sun.xml.bind artifacts are old and provided only for backward compatibility. You should use the equivalent org.glassfish.jaxb artifacts instead, as mentioned in some of the other answers. – Jesper Sep 30, 2018 at 12:59 This didn't work for me. It threw an error, and said that it couldn't find a particular class. – RamenChef Oct 15, 2018 at 2:15 Worked for me when I put them in tomcat9/lib folder under Mint 19.2 (Ubuntu 18.04 base), when deploying a Grails 3.4.10 application. – Mohamad Fakih Dec 5, 2019 at 20:53 Didn't work, instead raised more errors requiring several other jar inclusions. Mine was for jdk8 – vibhor vaish Feb 25, 2021 at 7:22

    At the time of compilation as well as run time, add the switch --add-modules java.xml.bind

    javac --add-modules java.xml.bind <java file name>
    java --add-modules java.xml.bind <class file>
    

    A good introduction of the JDK 9 modules can also be found at : https://www.youtube.com/watch?v=KZfbRuvv5qc

    I encountered this issue when working on a Java Project in Debian 10.

    Each time I start the appliction it throws the error in the log file:

    java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

    Here's how I solved it:

    The issue is often caused when JAXB library (Java Architecture for XML Binding) is missing in the classpath. JAXB is included in Java SE 10 or older, but it is removed from Java SE from Java 11 or newer –moved to Java EE under Jakarta EE project.

    So, I checked my Java version using:

    java --version
    

    And it gave me this output

    openjdk 11.0.8 2020-07-14
    OpenJDK Runtime Environment (build 11.0.8+10-post-Debian-1deb10u1)
    OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Debian-1deb10u1, mixed mode, sharing)
    

    So I was encountering the JAXBException error because I was using Java 11, which does not have the JAXB library (Java Architecture for XML Binding) is missing in the classpath. JAXB is included in it.

    To fix the issue I had to add the JAXB API library to the lib (/opt/tomcat/lib) directory of my tomcat installation:

    sudo wget https://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.4.0-b180830.0359/jaxb-api-2.4.0-b180830.0359.jar
    

    Then I renamed it from jaxb-api-2.4.0-b180830.0359.jar to jaxb-api.jar:

    sudo mv jaxb-api-2.4.0-b180830.0359.jar jaxb-api.jar
    

    Note: Ensure that you change the permission allow tomcat access the file and also change the ownership to tomcat:

    sudo chown -R tomcat:tomcat /opt/tomcat
    sudo chmod -R 777 /opt/tomcat/
    

    And then I restarted the tomcat server:

    sudo systemctl restart tomcat
    

    Resources: [Solved] java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

    That's all.

    Update April 2019

    Changelong for JAXB releases is at https://javaee.github.io/jaxb-v2/doc/user-guide/ch02.html

    excerpts:

        4.1. Changes between 2.3.0.1 and 2.4.0
             JAXB RI is now JPMS modularized:
                All modules have native module descriptor.
                Removed jaxb-core module, which caused split package issue on JPMS.
                RI binary bundle now has single jar per dependency instead of shaded fat jars.
                Removed runtime class weaving optimization.
        4.2. Changes between 2.3.0 and 2.3.0.1
              Removed legacy technology dependencies:
                com.sun.xml.bind:jaxb1-impl
                net.java.dev.msv:msv-core
                net.java.dev.msv:xsdlib
                com.sun.xml.bind.jaxb:isorelax
        4.3. Changes between 2.2.11 and 2.3.0
              Adopt Java SE 9:
                JAXB api can now be loaded as a module.
                JAXB RI is able to run on Java SE 9 from the classpath.
                Addes support for java.util.ServiceLoader mechanism.
                Security fixes
    

    Authoritative link is at https://github.com/eclipse-ee4j/jaxb-ri#maven-artifacts

    Maven coordinates for JAXB artifacts

    jakarta.xml.bind:jakarta.xml.bind-api: API classes for JAXB. Required to compile against JAXB.

    org.glassfish.jaxb:jaxb-runtime: Implementation of JAXB, runtime used for serialization and deserialization java objects to/from xml.

    JAXB fat-jar bundles:

    com.sun.xml.bind:jaxb-impl: JAXB runtime fat

    In contrast to org.glassfish.jaxb artifacts, these jars have all dependency classes included inside. These artifacts does not contain JPMS module descriptors. In Maven projects org.glassfish.jaxb artifacts are supposed to be used instead.

    org.glassfish.jaxb:jaxb-runtime:jar:2.3.2 pulls in:

    [INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.2:compile
    [INFO] |  +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.2:compile
    [INFO] |  +- org.glassfish.jaxb:txw2:jar:2.3.2:compile
    [INFO] |  +- com.sun.istack:istack-commons-runtime:jar:3.0.8:compile
    [INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.8.1:compile
    [INFO] |  +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.16:compile
    [INFO] |  \- jakarta.activation:jakarta.activation-api:jar:1.2.1:compile
    

    Original Answer

    Following Which artifacts should I use for JAXB RI in my Maven project? in Maven, you can use a profile like:

    <profile>
        <id>java-9</id>
        <activation>
            <jdk>9</jdk>
        </activation>
        <dependencies>
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
                <version>2.3.0</version>
            </dependency>
            <dependency>
                <groupId>javax.activation</groupId>
                <artifactId>activation</artifactId>
                <version>1.1.1</version>
            </dependency>
        </dependencies>
    </profile> 
    

    Dependency tree shows:

    [INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.0:compile
    [INFO] |  +- org.glassfish.jaxb:jaxb-core:jar:2.3.0:compile
    [INFO] |  |  +- javax.xml.bind:jaxb-api:jar:2.3.0:compile
    [INFO] |  |  +- org.glassfish.jaxb:txw2:jar:2.3.0:compile
    [INFO] |  |  \- com.sun.istack:istack-commons-runtime:jar:3.0.5:compile
    [INFO] |  +- org.jvnet.staxex:stax-ex:jar:1.7.8:compile
    [INFO] |  \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.13:compile
    [INFO] \- javax.activation:activation:jar:1.1.1:compile
    

    To use this in Eclipse, say Oxygen.3a Release (4.7.3a) or later, Ctrl-Alt-P, or right-click on the project, Maven, then select the profile.

    Thanks for showing that a dependency for javax.xml.bind > jaxb-api that I have seen elsewhere is actually redundant. The glassfish dependency pulls it is. I just tried that, and it does indeed work. – Basil Bourque Jul 23, 2018 at 5:42

    You need to add JAX-B dependencies when using JDK 9+. For Android Studio user, you'll need to add this to your build.gradle's dependencies {} block:

    // Add missing dependencies for JDK 9+
    if (JavaVersion.current().ordinal() >= JavaVersion.VERSION_1_9.ordinal()) {
        // If you're using @AutoValue or any libs that requires javax.annotation (like Dagger)
        compileOnly 'com.github.pengrad:jdk9-deps:1.0'
        compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
        // If you're using Kotlin
        kapt "com.sun.xml.bind:jaxb-core:2.3.0.1"
        kapt "javax.xml.bind:jaxb-api:2.3.1"
        kapt "com.sun.xml.bind:jaxb-impl:2.3.2"
        // If you're using Java
        annotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
        annotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
        testAnnotationProcessor "com.sun.xml.bind:jaxb-core:2.3.0.1"
        testAnnotationProcessor "javax.xml.bind:jaxb-api:2.3.1"
    

    I also stumpled accross the ClassNotFoundException:javax.xml.bind.DatatypeConverter using Java 11 and

    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    

    I tried all this stuff around adding javax.xml.bind:jaxb-api or spring boot jakarta.xml.bind-api .. I found a hint for fixes in jjwt version 0.10.0 .. but most importantly, the jjwt package is now split !

    Thus, check this reference: https://github.com/jwtk/jjwt/issues/510

    Simply, if you use

    Java11 and jjwt 0.9.x and you face the ClassNotFoundException:javax.xml.bind.DatatypeConverter issue,

    go for

    jjwt version 0.11.x, but use the splitted packages: https://github.com/jwtk/jjwt#install

    You maven wont find a higher version for jjwt dependency, since they split the packages.

    Cheers.

    Using jjwt from io.jsonwebtoken version 0.9.1 with java 16 also caused the same error. The root cause is the same of java 11. Using jjwt-api and jjwt-impl (from io.jsonwebtoken) with version 0.10.7 solved the issue here. – Luciano Brum Jul 21, 2021 at 18:03 <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>${jaxb-api.version}</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>${jaxb-api.version}</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>${jaxb-api.version}</version> </dependency> Note that the com.sun.xml.bind artifacts are old and provided only for backward compatibility. You should use the equivalent org.glassfish.jaxb artifacts instead, as mentioned in some of the other answers. – Jesper Sep 30, 2018 at 12:58

    Go to Your Build.gradle and add below dependencies for both Java 9 or Java 10.

    sourceCompatibility = 10 // You can also decrease your souce compatibility to 1.8 
    //java 9+ does not have Jax B Dependents
        compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
        compile group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0'
        compile group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.0'
        compile group: 'javax.activation', name: 'activation', version: '1.1.1'
    

    You can use --add-modules=java.xml.bind JVM option to add xml bind module to JVM run-time environment.

    Eg: java --add-modules=java.xml.bind XmlTestClass

    The root cause of this issue is that Gradle Daemon using JDK11, either you set your JAVA_HOME to JDK11 or your running your Gradle Task in the shared daemon which running with JDK11.

    For Android:

  • Check your Project Structure settings, you can change the JDK to JDK8 from there.

  • You can also set a JAVA_HOME and points to java8 home.

    For Java Web Start Execution we can use Andy Guibert's suggestion like this:

    <j2se version="1.6+" 
          java-vm-args="-XX:+IgnoreUnrecognizedVMOptions --add-modules=java.se.ee"/>
    

    Note the extra "=" in the --add-modules. See this OpenJDK Ticket or the last note in "Understanding Runtime Access Warnings" of the Java Platform, Standard Edition Oracle JDK 9 Migration Guide.

    <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> Make a note that javax libraries are deprecated since jdk 11. Just replace javax dependencies with Jakarta libraries dependencies referring below link. wiki.eclipse.org/Jakarta_EE_Maven_Coordinates – Abhishek Singh Dec 15, 2021 at 4:58

    This solved my problems with dependencies running Apache Camel 2.24.1 on Java 12:

        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0.1</version>
        </dependency>
    

    Since JavaEE is now governed by https://jakarta.ee/, the new Maven coordinates as of 2.3.2 are:

    https://eclipse-ee4j.github.io/jaxb-ri/#maven-artifacts

    The first released jaxb.version is 2.3.2.

    <properties>
      <jaxb.version>2.3.2</jaxb.version>
    </properties>
    <dependency>
      <groupId>jakarta.xml.bind</groupId>
      <artifactId>jakarta.xml.bind-api</artifactId>
      <version>${jaxb.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>${jaxb.version}</version>
    </dependency>
    

    I followed this URL and the below settings had really helped me. I use Java 10 with STS IDE in Macbook Pro. It works like a charm.

       <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>javax.activation-api</artifactId>
        <version>1.2.0</version>
    </dependency>
                    This does not sound related to me. there are several solutions in this thread that work regardless of using spring boot 2. (I also use spring boot 2.0.5.RELEASE btw). Maybe in Spring 2.1.0.M2 there is already a jaxb runtime included.
    – Sebastian Thees
                    Nov 2, 2018 at 9:40
                    It seems that with Spring Boot 2.1.0.RELEASE, JAXB is not necessary anymore - github.com/spring-projects/spring-boot/releases
    – Burrich
                    Nov 4, 2018 at 14:53
    

    When upgrading you may face the following:

    java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

    Hibernate typically requires JAXB that’s no longer provided by default. You can add the java.xml.bind module to restore this functionality with Java9 or Java10 (even if the module is deprecated).

    As of Java11, the module is not available so your only option is to add the JAXB RI (you can do that as of Java9 in place of adding the java.xml.bind module:

    Maven

    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
    </dependency>
    

    Gradle (build.gradle.kts):

    implementation("org.glassfish.jaxb:jaxb-runtime")
    

    Gradle (build.gradle)

    implementation 'org.glassfish.jaxb:jaxb-runtime'
    

    If you rather specify a specific version, take a look here: https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime

    Not an answer, but an addendum: I got because running groovysh (Groovy 2.4.13) if JAVA_HOME points to a Java 9 installation (java version "9.0.1" to be precise) fails abysmally:

    java.lang.reflect.InvocationTargetException
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:564)
            at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:107)
            at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:129)
    Caused by: java.lang.NoClassDefFoundError: Unable to load class groovy.xml.jaxb.JaxbGroovyMethods due to missing dependency javax/xml/bind/JAXBContext
            at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:400)
            at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:277)
            at org.codehaus.groovy.ast.ClassNode.getMethods(ClassNode.java:397)
            at org.codehaus.groovy.tools.shell.Groovysh.<init>(Groovysh.groovy:135)
            at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
            at org.codehaus.groovy.tools.shell.Main.<init>(Main.groovy:66)
            at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
            at org.codehaus.groovy.tools.shell.Main.main(Main.groovy:163)
    ... 6 more
    

    The solution was to:

  • Go to the JAXB Project at github.io ("JAXB is licensed under a dual license - CDDL 1.1 and GPL 2.0 with Class-path Exception")

  • Download jaxb-ri-2.3.0.zip

  • Unzip wherever you put your java infrastructure files (in my case, /usr/local/java/jaxb-ri/). Other solution may exist (maybe via SDKMAN, I dunno)

  • Make sure the jars in the lib subdirectory are on the CLASSPATH. I do it via a script started on bash startup, called /etc/profile.d/java.sh, where I added (among many other lines) the following loop:

  • Packed into a function...

    function extend_qzminynshg {
       local BASE="/usr/local/java"
       for LIB in jaxb-api.jar  jaxb-core.jar  jaxb-impl.jar  jaxb-jxc.jar  jaxb-xjc.jar; do
          local FQLIB="$BASE/jaxb-ri/lib/$LIB"
          if [[ -f $FQLIB ]]; then
             export CLASSPATH=$FQLIB:$CLASSPATH
    extend_qzminynshg; unset extend_qzminynshg
    

    And it works!

    I don't understand the downvotzes. Apparently people want to faff around with command-line options instead of actually getting the jars? Suit yourself. – David Tonhofer Jan 20, 2018 at 17:50 Java developers typically use build tools like Gradle or Maven to manage dependencies rather than manually downloading jars. That is probably the reason for the down votes. – Joshua Davis Mar 24, 2018 at 13:55

    OK, I have been having the same kind of issue, but I was using Java 8, and kept getting this error, I tried most of the solutions. but it turns out that my maven was still pointing to java 9 even-though I set the global Java version to 8, as soon as I fixed that it all worked.

    For anybody who might have this kind of problem, check out How to fix Maven to use default Java (archived)

  •