Замена устаревших модулей 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 для меня.

Другие вопросы по тегам