gpt4 book ai didi

hibernate + Java 9 + javax.transaction.SystemException

转载 作者:行者123 更新时间:2023-12-04 21:04:36 32 4
gpt4 key购买 nike

我有同样的问题:
Hibernate, Java 9 and SystemException

我可以按照这样的步骤

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

+
模块信息:
requires javax.transaction.api;

但是该解决方案对我不起作用,因为我仍然遇到错误
[ERROR] error: module org.apache.commons.lang3 reads package javax.transaction.xa from both javax.transaction.api and java.sql

然后,浏览我发现版本 1.3 删除了 javax.transaction.xa,所以我会去:
    <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>
  • 模块信息:
    requires java.transaction;
    requires java.persistence;
    requires java.sql;
    requires java.naming;
    requires jboss.logging;

  • 现在我能够成功构建我的 JAR。我将该 jar 导入到第二个项目,然后项目像这样崩溃:
    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)

    我已经尝试过:
    - 改为导入 java.se.ee
    - 将我的 JDK 从 9.0.1 更新到 9.0.4
    - 将我的 JDK 更新到 10.0.0,这让我遇到了 maven 的问题,所以我离开了那条路……如果有必要,我可以把它拿回来。
    - 我没有使用故障保护......虽然我尝试了关于添加 maven 插件的 StackOverflow 答案:P(是的,在这一点上我愿意尝试我合乎逻辑的东西)。

    有没有人真正解决过这种情况?我的意思是在一个模块中 hibernate 并在带有命名模块的第二个模块中使用它?

    非常感谢

    最佳答案

    好的,所以需要一点
    这也适用于 JDK 10,注解处理是为了支持 JPAModelGen。

    配置maven

    <properties>
    <jdk.version>1.10</jdk.version>
    <jar.classifier>jre10</jar.classifier> <!-- Optional for Dual Build-->
    <maven.compiler.source>1.10</maven.compiler.source>
    <maven.compiler.target>1.10</maven.compiler.target>
    <maven.compiler.release>10</maven.compiler.release>

    然后为 JDK 10 配置编译器
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${maven.compiler.version}</version>
    <configuration>
    <release>10</release>
    </configuration>
    <dependencies>
    <dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>6.2</version> <!-- Use newer version of ASM -->
    </dependency>
    </dependencies>
    </plugin>

    然后为 java.xml.bind 和 java.transaction 添加补丁模块
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${maven.compiler.version}</version>
    <goals>
    <goal>compile</goal>
    </goals>
    <configuration>
    <outputDirectory>${project.build.directory}/generated-sources/annotations</outputDirectory>
    <annotationProcessorPaths>
    <annotationProcessorPath>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>${maven.hibernate.version}</version>
    </annotationProcessorPath>
    <annotationProcessorPath>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>${jaxb.version}</version>
    </annotationProcessorPath>
    </annotationProcessorPaths>
    <annotationProcessors>
    <annotationProcessor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</annotationProcessor>
    </annotationProcessors>
    <compilerArgs>
    <arg>-AaddGeneratedAnnotation=false</arg>
    <arg>--patch-module</arg>
    <arg>java.transaction=${settings.localRepository}/javax/transaction/javax.transaction-api/${javax.transaction.transactionapi}/javax.transaction-api-${javax.transaction.transactionapi}.jar</arg>
    <arg>--patch-module</arg>
    <arg>java.xml.bind=${settings.localRepository}/javax/xml/bind/jaxb-api/${jaxb.version}/jaxb-api-${jaxb.version}.jar</arg>
    </compilerArgs>
    <compilerArguments>
    <AaddGeneratedAnnotation>false</AaddGeneratedAnnotation>
    <Adebug>true</Adebug>
    </compilerArguments>
    <failOnError>true</failOnError>
    </configuration>
    <dependencies>
    <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>${maven.hibernate.version}</version>
    <optional>true</optional>
    </dependency>
    <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>${jaxb.version}</version>
    <type>jar</type>
    </dependency>
    </dependencies>
    </plugin>

    属性是
    <jaxb.version>2.3.0</jaxb.version>
    <javax.transaction.transactionapi>1.3</javax.transaction.transactionapi>
    <maven.hibernate.version>5.3.2.Final</maven.hibernate.version>
    <maven.hibernate.validator.version>6.0.10.Final</maven.hibernate.validator.version>
    <maven.hibernate.annotations.version>5.0.1.Final</maven.hibernate.annotations.version>
    <maven.hibernate.jpa.persistence.version>1.0.2.Final</maven.hibernate.jpa.persistence.version>

    我包含的顶部依赖项以确保已下载 maven
    <dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <version>${javax.transaction.transactionapi}</version>
    <type>jar</type>
    <scope>provided</provided>
    </dependency>


    <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>${maven.hibernate.version}</version>
    <type>jar</type>
    <exclusions>
    <exclusion>
    <artifactId>jboss-transaction-api_1.2_spec</artifactId>
    <groupId>org.jboss.spec.javax.transaction</groupId>
    </exclusion>
    <exclusion>
    <artifactId>javax.activation-api</artifactId>
    <groupId>javax.activation</groupId>
    </exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>${maven.hibernate.validator.version}</version>
    <type>jar</type>
    <exclusions>
    <exclusion>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    </exclusion>
    </exclusions>
    </dependency>

    但是等等,还有更多……
    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;

    然后相应地配置您的运行时,eclipse 和 netbeans 只需为上面定义的补丁模块添加 vm 参数。
    enter image description here

    我在这里使用@args 只是为了符合JDK 9 及更高版本的要求,因此它是严格模块化的。
    JDK 11(目前为止)所有这些都是必需的,除了可以删除的补丁模块规范,因为 1.3 将单独声明包

    关于 hibernate + Java 9 + javax.transaction.SystemException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585906/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com