jaxb2-maven-plugin failing on java 9

Viewed 5627

The schemagen goal of the jaxb2-maven-plugin fails on Java 9. The error is:

[Exception]: java.lang.ClassNotFoundException
[Message]: com.sun.istack.SAXParseException2
  • The jaxb2 plugin version is 2.3.1
  • The maven version is 3.5.0.
  • The maven compiler plugin version is 3.7.0.
  • All the plugins / dependencies are up-to-date.

I don't have any module-info.java file. The projects I build are legacy Java 8 projects, where the JDK has been upgraded from 1.8u144 to version 9.

Hopefully, the only plugin that fails at this moment is the jaxb2-maven-plugin. Everything else is OK, both at compile time and at execution time. The stack trace is:

org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
com.sun.tools.jxc.ap.SchemaGenerator.process(SchemaGenerator.java:103)
jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:968)
jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:884)
jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.access$2200(JavacProcessingEnvironment.java:108)
jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1206)
jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1315)
jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1246)
jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:922)
jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:100)
jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:142)
jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:96)
jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:90)
com.sun.tools.jxc.SchemaGenerator$Runner.compile(SchemaGenerator.java:261)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:564)
com.sun.tools.jxc.SchemaGenerator.run(SchemaGenerator.java:166)
org.codehaus.mojo.jaxb2.schemageneration.AbstractXsdGeneratorMojo.performExecution(AbstractXsdGeneratorMojo.java:372)
org.codehaus.mojo.jaxb2.AbstractJaxbMojo.execute(AbstractJaxbMojo.java:257)
org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:154)
org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:146)
org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:309)
org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:194)
org.apache.maven.DefaultMaven.execute(DefaultMaven.java:107)
org.apache.maven.cli.MavenCli.execute(MavenCli.java:993)
org.apache.maven.cli.MavenCli.doMain(MavenCli.java:345)
org.apache.maven.cli.MavenCli.main(MavenCli.java:191)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:564)
org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
2 Answers

I could fix the problem by adding the following dependencies to the plugin:

<dependencies>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-jxc-jdk9</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>javax.activation-api</artifactId>
        <version>1.2.0</version>
    </dependency>
</dependencies>

For the xjc goal, I assume that it's needed to add the following dependencies to the plugin:

<dependencies>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-xjc-jdk9</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>javax.activation-api</artifactId>
        <version>1.2.0</version>
    </dependency>
</dependencies>

Of course this is a workaround until a new version of the plugin is released.

I finally resolved issue using xjc directly:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <executions>
        <execution>
            <id>execute xjc</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <executable>xjc</executable>
                <longModulepath>false</longModulepath>
                <arguments>
                    <argument>-extension</argument>
                    <argument>-no-header</argument>
                    <argument>-d</argument>
                    <argument>src/main/java</argument>

                    <argument>-p</argument>
                    <argument>my.package.name</argument>
                    <argument>-b</argument>
                    <argument>src/main/resources/mybindings.xjb</argument>
                    <argument>src/main/resources/myschema.xsd</argument>
                </arguments>
            </configuration>
        </execution>
    </executions>
</plugin>
Related