Замены для устаревших модулей JPMS с API Java EE
В Java 9 устарели шесть модулей, которые содержат API Java EE, и они скоро будут удалены:
- java.активация с пакетом
javax.activation
- java.corba с
javax.activity
, javax.rmi
, javax.rmi.CORBA
и org.omg.*
пакеты - java.transaction с пакетом
javax.transaction
- java.xml.bind со всеми пакетами
javax.xml.bind.*
- java.xml.ws с
javax.jws
, javax.jws.soap
, javax.xml.soap
и всеми пакетами javax.xml.ws.*
- java.xml.ws.annotation с пакетом
javax.annotation
Какие поддерживаемые сторонние артефакты предоставляют эти API? Неважно, насколько хорошо они предоставляют эти API или какие другие функции они могут предложить - все, что имеет значение, - это замена для этих модулей/пакетов?
Чтобы было легче собирать knoweldge, я ответил тем, что знал до сих пор, и сделал ответ на wiki сообщества. Я надеюсь, что люди расширят его, вместо того чтобы писать собственные ответы.
Перед тем как проголосовать, чтобы закрыть:
- Да, уже есть некоторые вопросы по отдельным модулям, и ответ на этот вопрос, разумеется, дублирует эту информацию. Но AFAIK нет единого момента, чтобы узнать обо всех этих, которые, я думаю, имеют большую ценность.
- Вопросы, требующие рекомендаций в отношении библиотек, обычно считаются вне темы, потому что "они склонны привлекать упрямые ответы и спам", но я не думаю, что это применимо здесь. Набор достоверных библиотек четко очерчен: им необходимо реализовать определенный стандарт. Помимо этого ничего не имеет значения, поэтому я не вижу большого риска для мнений и спама.
Ответы
Ответ 1
Вместо использования устаревших модулей Java EE используйте следующие артефакты.
JAF (java.activation)
JavaBeans Activiation Framework - это автономная технология (доступна на Maven Central):
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
<version>1.2.0</version>
</dependency>
(Источник)
CORBA (java.corba)
Из JEP 320:
Не будет отдельной версии CORBA, если третьи стороны не возьмут на себя обслуживание API CORBA, реализации ORB, провайдера CosNaming и т.д. Третье обслуживание возможно, потому что платформа Java SE поддерживает независимые реализации CORBA. Напротив, API для RMI-IIOP определяется и реализуется исключительно в Java SE. Не будет отдельной версии RMI-IIOP, если не будет выделен выделенный JSR, или управление API будет передано Фондом Eclipse (переход управления Java EE от JCP к Eclipse Foundation включает GlassFish и его внедрение CORBA и RMI-IIOP).
JTA (java.transaction)
Автономная версия:
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.2</version>
</dependency>
(Источник, посмотрите, как использовать 1.2
и предстоящий 1.3
на пути к классу и модулю.)
JAXB (java.xml.bind)
Эталонная реализация:
<!-- Java 6 = JAXB version 2.0 -->
<!-- Java 7 = JAXB version 2.2.3 -->
<!-- Java 8 = JAXB version 2.2.8 -->
<!-- Java 9 = JAXB version 2.3.0 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.8</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.8</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.8</version>
</dependency>
(Источник; JEP 320 объясняет, откуда взять schemagen
и xjc
.)
JAX-WS (java.xml.ws)
Эталонная реализация:
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-ri</artifactId>
<version>2.3.0</version>
<type>pom</type>
</dependency>
(Источник, также объясняет, где получить wsgen
и wsimport
.)
Общие аннотации (java.xml.ws.annotation)
Аннотации Java Commons (доступны на Maven Central):
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
(Источник)
Ответ 2
JAXB (java.xml.bind) для JDK9
Отлично работает в настольных приложениях на jdk9/10 EA
<properties>
<jaxb-api.version>2.3.0</jaxb-api.version>
</properties>
<!-- JAXB 2.3.0 for jdk9+ -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb-api.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb-api.version}</version>
</dependency>
<!-- JAXB needs javax.activation module (jdk9) -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
Ответ 3
Кажется, что jaxws-ri транзитивно зависит от commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852, который, очевидно, можно найти в репозитории http://download.eclipse.org/rt/eclipselink/maven.repo
Ответ 4
Мне нужно было заменить JAX-WS (java.xml.ws) и JAXB (java.xml.bind) для моего приложения на основе Spring Boot 2, и в итоге я получил следующие JAR (сборка Gradle):
// replacements for deprecated JDK module java.xml.ws
runtimeOnly 'javax.xml.ws:jaxws-api:2.3.0' // javax.xml.ws.* classes
runtimeOnly 'javax.jws:jsr181-api:1.0-MR1' // for javax.jws.* classes
// replacement for deprecated JDK module java.xml.bind
runtimeOnly 'javax.xml.bind:jaxb-api'
runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:2.3.0.1'
runtimeOnly 'org.glassfish:javax.json:1.1.2'
runtimeOnly 'org.eclipse:yasson:1.0.1'
(Вам может понадобиться compile
или другая область, runtimeOnly
достаточно было только runtimeOnly
.)
Я заметил, что https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core описан как "Старый", и использование этого ответа пошло для org.glassfish
основе org.glassfish
который привел в org.eclipse.yasson
как Что ж.
Теперь это действительно грязная ситуация, это работает, но как можно быть уверенным, что это лучшая замена, верно?
Ответ 5
Просто незначительное изменение (улучшение) вышеупомянутых ответов - приведено здесь только для JAXB. Можно добавить зависимости с областью runtime
и только если это эффективно необходимо (т.е. При сборке для запуска в JRE с версией> = 9 - здесь показан пример v11):
<profile>
<id>when-on-jdk-11</id>
<activation>
<jdk>11</jdk>
</activation>
<properties>
<!-- missing artefacts version properties -->
<jaxb-api.version>2.3.1</jaxb-api.version>
<jaxb-impl.version>2.3.2</jaxb-impl.version> <!-- one might let it the same with the jaxb-api.version -->
</properties>
<dependencies>
<!-- runtime dependencies to avoid JAXB related CNF exceptions when running on Java 11 (e.g.: ClassNotFoundException: javax.xml.bind.annotation.XmlType) -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb-api.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>${jaxb-impl.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</profile>
Ответ 6
Я нашел самый простой способ обойти JAXB-части этих проблем - использовать управление зависимостями в моей корневой помпе или в моей:
<project ...>
<dependencyManagement>
<dependencies>
<!-- ... -->
<!-- Gone from jvm in java11 -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-ri</artifactId>
<version>2.4.0-b180830.0438</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<!-- ... -->
</dependencies>
</dependencyManagement>
</project>
И в модулях, которые терпят неудачу при компиляции на jdk11:
<!-- ... -->
<dependencies>
<!-- Gone from jvm in java11 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<scope>runtime</scope>
</dependency>
<!-- ... -->
</dependencies>
<!-- ... -->
Кроме того, обновление версии org.jvnet.jaxb2.maven2:maven-jaxb2-plugin
до 0.14.0 решило все проблемы генерации jaxb для меня.
Ответ 7
Я экспериментировал с большинством предложений, описанных выше, используя JDK 11.0.3, и не был успешным. Единственное решение, которое я в итоге нашел для работы, заключается в следующем. Возможно, есть и другие варианты, которые также работают, но кажется, что выбор версии имеет решающее значение. Например, изменение com.sun.xml.ws:rt на 2.3.2 приводит к тому, что модуль javax.jws больше не будет доступен.
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.4.0-b180830.0438</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>rt</artifactId>
<version>2.3.1</version>
</dependency>