【问题标题】:Which module should I require in Java 9 to use JPA?我应该在 Java 9 中需要哪个模块才能使用 JPA?
【发布时间】:2018-03-10 08:40:36
【问题描述】:

我正在使用需要 JPA(javax.persistence.* 类)的项目测试 Java 9。当我添加module-info.java 并声明我的模块时,javax.persistece 包下的所有类都不可用。

我搜索了很多,但找不到在 Java 9 模块项目中使用 JPA 所需的模块。

更新 正如艾伦建议的那样,我跑了

$ jar --describe-module --file=javax.persistence-api-2.2.jar

No module descriptor found. Derived automatic module.

java.persistence@2.2 automatic
requires java.base mandated
contains javax.persistence
contains javax.persistence.criteria
contains javax.persistence.metamodel
contains javax.persistence.spi

但还是用这个module-info.java

module my.module {

    requires java.persistence;

}

我得到“module-info.java:[3,18] module not found: java.persistence”。

更新 2 这是我的项目结构:

.
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   ├── my
    │   │   │   └── module
    │   │   │       └── MyBean.java
    │   │   └── module-info.java
    │   └── resources
    └── test
        ├── java
        └── resources

pom.xml 具有 javax.persistence-api 依赖项。

测试仓库:https://github.com/heruan/java9-jpa

【问题讨论】:

  • requires 应该使用自动模块的文件名:javax.persistence-api-2.2 但这看起来很奇怪。我会重命名罐子吗?
  • @JoopEggen 如果我没记错的话,自动模块命名会将任何非字母数字字符转换为点(.)。因此,在这种情况下,当前模块名称最终将是 javax.persistence.api(当然没有不在模块级别维护的版本号)

标签: java jpa java-9 module-info


【解决方案1】:

有了,你可以使用像

这样的依赖
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
</dependency>

maven-compiler-plugin 已更新为与 jdk9 detailed here. 一起使用

的依赖类似

compile group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'

它基于javaee/jpa-spec。这将有助于

requires java.persistence 

作为一个自动模块,建议作为模块名称here.


补充细节,这在 META-INF/MANIFEST.MF 中定义为:

Manifest-Version: 1.0
Bundle-Description: Java(TM) Persistence 2.2 API jar
Automatic-Module-Name: java.persistence
...

注意- Alan 建议的找出模块名称的方法是精确的,但没有广告,我仍然更喜欢使用某个包的类,然后让当我说“导入类”然后“添加要求”时,IntelliJ(2017.2.4) 会为我做那个解决方案。 ;)

【讨论】:

  • 谢谢,但我的 pom.xml 中已经有了这种依赖关系。
  • @GiovanniLovato 您尝试的模块名称不正确
  • 已更正,但仍然“找不到模块:java.persistence”。
  • 不确定您的项目结构是什么样的。在这种情况下,只需确保 jar 在模块路径上可用。
  • 强制 Maven 编译器到 3.7.0 解决了在 Maven 中编译的问题,但不是在 Eclipse 中 - 但这是一个 Eclipse 问题。谢谢!
【解决方案2】:

我认为 JPA 尚未作为模块发布,但您应该能够将其用作自动模块。能否使用jar --file=&lt;jarfile&gt; --describe-module 来查看为 JPA JAR 文件派生的模块名称。

【讨论】:

  • jar 工具将其名称报告为“java.persistence”,而不是“javax.persistence”。
  • 已更正,但仍然“找不到模块:java.persistence”。
  • 嗯,我预计它会起作用,至少在 maven-compiler-plugin 3.6.2 中它会在编译模块时使用正确的模块路径调用编译器。
  • 刚刚看到你对 github 上的 maven 项目的评论。如果您更新 pom 以使用 maven-compiler-plugin 3.6.2 或更高版本作为构建插件,那么您应该会发现它可以构建。
【解决方案3】:

尝试使用这个maven依赖:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.5.2.Final</version>
</dependency>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2011-02-22
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多