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