Search code examples
hibernatejava-9

Hibernate + Java 9 + javax.transaction.SystemException


I kind of have the same problem as: Hibernate, Java 9 and SystemException

I can follow the steps like this

    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>javax.transaction-api</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.3.0.CR1</version>
        <exclusions>
            <exclusion>
                <groupId>org.jboss.spec.javax.transaction</groupId>
                <artifactId>jboss-transaction-api_1.2_spec</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

+ Module-info:

requires javax.transaction.api;

But the solution does not work for me because I'm still getting the errors

[ERROR] error: module org.apache.commons.lang3 reads package javax.transaction.xa from both javax.transaction.api and java.sql

Then, browsing around I found that version 1.3 has the javax.transaction.xa removed, so I'll go:

    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>javax.transaction-api</artifactId>
        <version>1.3</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.3.0.CR1</version>
        <exclusions>
            <exclusion>
                <groupId>org.jboss.spec.javax.transaction</groupId>
                <artifactId>jboss-transaction-api_1.2_spec</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
  • Module-Info:

    requires java.transaction;
    requires java.persistence;
    requires java.sql;
    requires java.naming;
    requires jboss.logging;
    

Now I'm able to succesfully build my JAR. I'm importing that jar to a second project and then the project crashes like this:

NoClassDefFoundErrorjavax/transaction/SystemException
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:374)
at jboss.logging@3.3.1.Final/org.jboss.logging.Logger$1.run(Logger.java:2554)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at jboss.logging@3.3.1.Final/org.jboss.logging.Logger.getMessageLogger(Logger.java:2529)
at jboss.logging@3.3.1.Final/org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:28)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:24)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.<clinit>(ClassLoaderServiceImpl.java:40)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.boot.registry.BootstrapServiceRegistryBuilder.build(BootstrapServiceRegistryBuilder.java:218)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.boot.registry.StandardServiceRegistryBuilder.<init>(StandardServiceRegistryBuilder.java:58)
at a.data/com.a.data.hibernate.HibernateServiceLocator.<clinit>(HibernateServiceLocator.java:39)
at g.editor/com.g.App.start(App.java:293)

Caused by javax.transaction.SystemException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:374)
at jboss.logging@3.3.1.Final/org.jboss.logging.Logger$1.run(Logger.java:2554)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at jboss.logging@3.3.1.Final/org.jboss.logging.Logger.getMessageLogger(Logger.java:2529)
at jboss.logging@3.3.1.Final/org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:28)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:24)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.<clinit>(ClassLoaderServiceImpl.java:40)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.boot.registry.BootstrapServiceRegistryBuilder.build(BootstrapServiceRegistryBuilder.java:218)
at org.hibernate.orm.core@5.3.0.CR1/org.hibernate.boot.registry.StandardServiceRegistryBuilder.<init>(StandardServiceRegistryBuilder.java:58)

I already tried to: - import java.se.ee instead - update my JDK from 9.0.1 to 9.0.4 - update my JDK to 10.0.0 which got me into problems with maven, so I left that route... I can take it back if necessary. - I'm not using failsafe... though I tried the StackOverflow answer about adding a maven plugin :P (yep at this point I'm willing to try I logical stuff).

Has anybody actually solved this scenario? I mean hibernate in one module and using it in the second one with named modules?

Thank you so much


Solution

  • Update 2019/08/05

    Libraries have been updated to allow for better support. Please use the same module-info definitions as

    opens xx.xx.xx.entities to org.hibernate.orm.core;
    
    requires java.transaction;
    requires java.xml.bind;
    requires java.sql;
    requires java.activation;
    requires java.persistence;
    

    Maven has been simplified greatly

    <plugin>
                            <artifactId>maven-compiler-plugin</artifactId>
                            <configuration>
                                <annotationProcessorPaths>
                                    <annotationProcessorPath>
                                        <groupId>org.hibernate</groupId>
                                        <artifactId>hibernate-jpamodelgen</artifactId>
                                        <version>${maven.hibernate.version}</version>
                                    </annotationProcessorPath>
                                    <annotationProcessorPath>
                                        <groupId>org.projectlombok</groupId>
                                        <artifactId>lombok</artifactId>
                                        <version>${lombok.version}</version>
                                    </annotationProcessorPath>
                                    <path>
                                        <groupId>javax.xml.bind</groupId>
                                        <artifactId>jaxb-api</artifactId>
                                        <version>2.3.0</version>
                                    </path>
                                    <path>
                                        <groupId>javax.annotation</groupId>
                                        <artifactId>javax.annotation-api</artifactId>
                                        <version>1.3.1</version>
                                    </path>
                                    <path>
                                        <groupId>org.mapstruct</groupId>
                                        <artifactId>mapstruct-processor</artifactId>
                                        <version>${mapstruct.version}</version>
                                    </path>
                                </annotationProcessorPaths>
                            </configuration>
    
                        </plugin>