在Java 9中,我应该使用哪个模块来使用JPA?
我正在测试Java 9的项目需要JPA(javax.persistence.*
类)。当我添加module-info.java
并声明我的模块时,javax.persistece
包下的所有类都变为不可用。在Java 9中,我应该使用哪个模块来使用JPA?
我搜索了很多,但是我找不到需要在Java 9模块项目中使用JPA的模块。
UPDATE 作为艾伦的建议,我跑了
$ jar --describe-module --file=javax.persistence-api-2.2.jar
No module descriptor found. Derived automatic module.
[email protected] 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]模块未找到:java.persistence“。
更新2 这是我的项目结构:
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ ├── my
│ │ │ └── module
│ │ │ └── MyBean.java
│ │ └── module-info.java
│ └── resources
└── test
├── java
└── resources
的pom.xml
有javax.persistence-api
依赖。
随着maven,你可以使用一个依赖像
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
与maven-compiler-plugin
的更新与jdk9 detailed here.
与依赖类似的合作与gradle
compile group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'
这是基于出javaee/jpa-spec。这将促进
requires java.persistence
作为自动模块作为拟名称旨在用于模块here.
添加到细节,这是在META-INF /清单中定义.MF为:
Manifest-Version: 1.0
Bundle-Description: Java(TM) Persistence 2.2 API jar
Automatic-Module-Name: java.persistence
...
Note - 根据Alan的建议找出模块名称的方法是精确的,但没有广告,我仍然更喜欢使用某个包的类,然后让IntelliJ(2017.2.4)为我做这个决议,当我说'导入班',然后'添加要求'。 ;)
谢谢,但我已在'pom.xml'中拥有该依赖关系。 –
@GiovanniLovato您尝试使用的模块的名称不正确,但 – nullpointer
已更正,但仍未找到“模块:java.persistence”。 –
我不认为JPA已作为一个模块还,但你应该能够使用它作为一个自动模块。您可以使用jar --file=<jarfile> --describe-module
来查看为JPA JAR文件派生的模块名称。
谢谢!我更新了我的问题。 –
该jar工具报告其名称为“java.persistence”,而不是“javax.persistence”。 –
已更正,但仍“未找到模块:java.persistence”。 –
'require'应该使用自动模块的文件名:'javax.persistence-api-2.2',但看起来很奇怪。我会重命名该罐子? –
@JoopEggen如果我没有错,自动模块命名将任何非字母数字字符转换为点('.')。所以在这种情况下,当前的模块名称最终将成为'javax.persistence.api'(当然,没有版本号,这些不在模块级别维护) – nullpointer