Какой модуль мне нужен в Java 9 для использования JPA?

Я тестирую Java 9 с проектом, для которого требуется JPA (javax.persistence.* классы). Когда я добавляю module-info.java и объявляю свой модуль, все классы в пакете javax.persistece становятся недоступными.

Я много искал, но не смог найти модуль, требующий использования JPA в проекте модуля Java 9.

ОБНОВЛЕНИЕ Как предложил Алан, я побежал

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

Тестовый репозиторий: https://github.com/heruan/java9-jpa


person Giovanni Lovato    schedule 28.09.2017    source источник
comment
requires следует использовать имя файла для автоматических модулей: javax.persistence-api-2.2 но это выглядит странно. Я бы переименовал банку?   -  person Joop Eggen    schedule 28.09.2017
comment
@JoopEggen Автоматическое именование модулей, если я не ошибаюсь, преобразует любой небуквенно-цифровой символ в точку (.). Таким образом, в этом случае текущее имя модуля будет javax.persistence.api (конечно, без номера версии, который не поддерживается на уровне модуля)   -  person Naman    schedule 28.09.2017


Ответы (3)


С помощью maven вы можете использовать такую ​​зависимость, как

<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
</dependency>

с maven-compiler-plugin обновленным для работы с jdk9 подробно здесь

Аналогично зависимости с gradle

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

который основан на javaee/jpa-spec. Это облегчило бы

requires java.persistence 

как автоматический модуль, как предлагается для имени, предназначенного для модуля здесь.


В дополнение к деталям это определяется в META-INF/MANIFEST.MF как:

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

Примечание. Способ определения имени модуля, предложенный Аланом, является точным, но без рекламы, и я по-прежнему предпочитаю использовать класс какого-либо пакета, а затем позволить IntelliJ(2017.2 .4) сделайте это разрешение для меня, когда я скажу «импортировать класс», а затем «добавить требует». ;)

person Naman    schedule 28.09.2017
comment
Спасибо, но у меня уже есть эта зависимость в файле pom.xml. - person Giovanni Lovato; 28.09.2017
comment
@GiovanniLovato имя модуля, который вы пробовали, неверно - person Naman; 28.09.2017
comment
Исправлено, но модуль все равно не найден: java.persistence. - person Giovanni Lovato; 28.09.2017
comment
Не уверен, как выглядит структура вашего проекта. Просто убедитесь, что в этом случае jar доступен на пути к модулю. - person Naman; 28.09.2017
comment
Обновлен вопрос со структурой проекта! Не знаю, включены ли зависимости Maven в путь к модулю. - person Giovanni Lovato; 28.09.2017
comment
Структура выглядит хорошо для меня. Можете ли вы также поделиться соответствующим файлом pom.xml и построить ли проект с помощью maven (если вы пытались)? - person Naman; 28.09.2017
comment
Репозиторий по адресу github.com/heruan/java9-jpa (сбой Maven, модуль не найден: java .упорство). - person Giovanni Lovato; 28.09.2017
comment
@GiovanniLovato Не работает для меня по одной причине ... принимает значение по умолчанию maven-compiler-plugin 3.1, которое не поддерживает jdk9. Поэтому попробуйте изменить плагин, как здесь - person Naman; 28.09.2017
comment
Принуждение компилятора Maven к версии 3.7.0 решило проблему компиляции в Maven, но не в Eclipse, но это проблема Eclipse. Благодарю вас! - person Giovanni Lovato; 28.09.2017

Я не думаю, что JPA еще не опубликован как модуль, но вы сможете использовать его как автоматический модуль. Можете ли вы использовать jar --file=<jarfile> --describe-module, чтобы узнать, какое имя модуля получено для файла JPA JAR.

person Alan Bateman    schedule 28.09.2017
comment
Инструмент jar сообщает свое имя как java.persistence, а не javax.persistence. - person Alan Bateman; 28.09.2017
comment
Исправлено, но модуль все равно не найден: java.persistence. - person Giovanni Lovato; 28.09.2017
comment
Хм, я ожидал, что это сработает, по крайней мере, с maven-compiler-plugin 3.6.2, который вызывает компилятор с правильным путем к модулю при компиляции модуля. - person Alan Bateman; 28.09.2017
comment
Только что увидел ваш комментарий с проектом maven на github. Если вы обновите pom, чтобы использовать maven-compiler-plugin 3.6.2 или новее в качестве плагина сборки, вы обнаружите, что он строится нормально. - person Alan Bateman; 28.09.2017

Попробуйте использовать эту зависимость maven:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.5.2.Final</version>
</dependency>
person Mădălina Oprea    schedule 15.06.2021