Замена устаревших модулей JPMS на API Java EE
Java 9 устарела из шести модулей, которые содержат API Java EE, и они скоро будут удалены:
- активация с
javax.activation
пакет - java.corba с
javax.activity
,javax.rmi
,javax.rmi.CORBA
, а такжеorg.omg.*
пакеты - сделка с
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 with
javax.annotation
пакет
Какие поддерживаемые сторонние артефакты предоставляют эти API? Неважно, насколько хорошо они предоставляют эти API или какие другие функции они могут предложить - все, что имеет значение, являются ли они заменой этих модулей / пакетов?
Чтобы было легче собирать знания, я ответил тем, что знаю до сих пор, и сделал ответ вики-сообществом. Я надеюсь, что люди расширят его вместо того, чтобы писать свои собственные ответы.
Прежде чем голосовать, чтобы закрыть:
- Да, уже есть несколько вопросов по отдельным модулям, и ответ на этот вопрос, конечно, дублирует эту информацию. Но AFAIK нет единого смысла, чтобы узнать обо всем этом, что я думаю, имеет большую ценность.
- Вопросы с просьбой дать рекомендации по библиотеке обычно считаются не по теме, потому что "они, как правило, привлекают взвешенные ответы и спам", но я не думаю, что это применимо здесь. Набор допустимых библиотек четко очерчен: они должны реализовывать определенный стандарт. Кроме этого, ничто другое не имеет значения, поэтому я не вижу большого риска для мнения и спама.
11 ответов
Вместо использования устаревших модулей Java EE используйте следующие артефакты.
JAF (java.activation)
JavaBeans Activation 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 для ее обслуживания или если управление Eclipse Foundation перешло к управлению API (переход координирующей роли 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>
( Источник)
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>
Мне нужно было заменить 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
было достаточно для нас.)
Я заметил, что https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core описан как "Старый", и использование этого ответа пошло на org.glassfish
основанные вещи, которые принесли в org.eclipse.yasson
также.
Теперь это действительно грязная ситуация, она работает, но как можно быть уверенным, что это лучшая замена, верно?
Кажется, что jaxws-ri транзитивно зависит от commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852, который, по-видимому, можно найти в репозитории http://download.eclipse.org/rt/eclipselink/maven.repo
Просто незначительное изменение (улучшение) вышеупомянутых ответов - приведено здесь только для 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>
Я использую jdk 11 + ant + ivy в моем весеннем проекте mvc. Я получал сообщение об ошибке " пакет javax.jws не существует ", поэтому я добавил javax.jws-api-1.1.jar в путь к классам, и он сработал! Просто загрузите банку с https://repo1.maven.org/maven2/javax/jws/javax.jws-api/1.1/javax.jws-api-1.1.jar и добавьте ее в свой путь к классам в своем build.xml
Если у вас есть эта проблема в Talend (например, 7.x), вы можете добавить в Default POM.xml проекта:
<dependencies>
<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>javax.xml.soap-api</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
Протестировано с:
- AdoptJDK 8.0.275.1-точка доступа: ОК
- AdoptJDK 11.0.9.101-точка доступа: ОК
- AdoptJDK 15.0.1.9-hotspot: KO (но это еще одна проблема: несовместимые типы условных операндов Exception и TDieException)
- Зулу-8.50.0.1017: ОК
- Зулу-11.43.1015: ОК
Это действительно настоящая боль, которая все еще проходит через это по состоянию на 2022 год! Я пробовал много вышеперечисленных предложений, но смог заставить его работать только с приведенными ниже зависимостями.
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>
Примечание. Не поддавайтесь искушению обновить зависимости, просто оставьте так, и у меня это работает.
Если у вас такая же проблема, добавьте приведенную ниже зависимость к pom.xml
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.3</version>
</dependency>
Затем используйте JAVA 8 в качестве альтернативной JRE. Для получения дополнительной информации следуйте https://www.youtube.com/watch?v=pgSJda16N54 видео, и это сработало для меня.
Я экспериментировал с большинством описанных выше предложений, используя 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>
Я нашел самый простой способ обойти 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 для меня.