Check the Implementation

The first time I tried to use MOXy, I was not able to tell whether I had actually configured it correctly. So, first of all, you may want to check which implementation of JAXB is being used for the domain classes you are trying to handle.

The following code checks to see which implementation is used to handle YourDomainClass.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
private void checkProvider() throws JAXBException {
    JAXBContext jc = JAXBContext.newInstance(YourDomainClass.class);

    String jaxbContextImpl = jc.getClass().getName();
    if(MOXY_JAXB_CONTEXT.equals(jaxbContextImpl)) {
        System.out.println("EclipseLink MOXy");
    } else if(METRO_JAXB_CONTEXT.equals(jaxbContextImpl)) {
        System.out.println("Metro");
    } else {
        System.out.println("Other");
    }
}

Set Up MOXy

Create a jaxb.properties file containing this:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

This file needs to be placed in the same packages as the domain classes you want MOXy to handle.

JAXB Libraries and JARs

The module java.se.ee was removed from Java 11. See JEP-320. This module includes JAXB (and JAX-WS and others). To use JAXB in Java 11 and newer, you therefore need to add it to your project as a separate library. The contents of my pom.xml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<dependency>  
    <groupId>org.eclipse.persistence</groupId>  
    <artifactId>eclipselink</artifactId>  
    <version>2.7.6</version>  
</dependency>  

<!--   
     Use 2.3.1 below to prevent "illegal   
     reflective access operation" warnings.  
-->  
<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>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.1</version>
    <scope>runtime</scope>
</dependency>

<dependency>  
    <groupId>com.sun.xml.bind</groupId>  
    <artifactId>jaxb-impl</artifactId>  
    <version>2.3.1</version>  
</dependency>  
-->

In the above POM, the following artifacts are shown:

LibraryNotes
eclipselinkContains MOXy classes as well as other libraries provided by the EclipseLink project.
jaxb-apiVersion 2.3.1 of the JAXB API, containing javax.xml.bind. Remember, JAXB is just an API! Maven tells me there is a newer version: 2.4.0-b180830.0359. But I have never used it.
jaxb-coreThis contains core classes required by the runtime modules.
jaxb-runtimeThis is the Glassfish reference implementation of JAXB. But not the only implementation, of course. It is part of Project Metro - which also includes the JAX-WS reference implementation, among other libraries.
jaxb-implThe old JAXB Runtime module. Version 2.3.1 is from 2018. YOU DO NOT NEED IT TO RUN MOXy. If you don’t use MOXy, You should probably be using the Metro jaxb-runtime, rather than this.

There is also this:

1
2
3
4
5
6
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-ri</artifactId>
    <version>2.3.3</version>
    <type>pom</type>
</dependency>

This is a standalone bundle of the Glassfish (Metro) JAXB reference implementation. You can find the xjc and schemagen tools inside this JAR, since these tools are also no longer a part of the core Java distribution. You can download the JAR from here, unzip it, and then look in the bin directory to find the tools' binaries.

Deploy MOXy

Remember to ensure the MOXy properties file is copied from the source folder to the correct target, as part of the Maven/Ant/Gradle build process.

For a Maven-based project, the following section will ensure the properties file is copied correctly:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<build>  
    <resources>  
        <resource>  
            <directory>src/main/java</directory>  
            <excludes>  
                <exclude>**/*.java</exclude>  
            </excludes>  
        </resource>  
    </resources>  
</build>