it-swarm.com.ru

Замена устаревших модулей JPMS на API Java EE

Java 9 устарело шесть модулей, содержащих API Java EE , и они будут удалены скоро:

  • Java.activation с пакетом 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 или какие другие функции они могут предложить - все, что имеет значение, являются ли они заменой этих модулей/пакетов?

Чтобы было легче собирать знания, я ответил тем, что знаю до сих пор, и сделал ответ вики-сообществом. Я надеюсь, что люди расширят его вместо того, чтобы писать свои собственные ответы.


Прежде чем голосовать, чтобы закрыть:

  • Да, уже есть несколько вопросов по отдельным модулям, и ответ на этот вопрос, конечно, дублирует эту информацию. Но AFAIK нет единого смысла, чтобы узнать обо всем этом, что я думаю, имеет большую ценность.
  • Вопросы с просьбой о рекомендациях библиотеки обычно считаются не по теме, потому что «они, как правило, привлекают взвешенные ответы и спам», но я не думаю, что это применимо здесь. Набор допустимых библиотек четко очерчен: они должны реализовывать определенный стандарт. Кроме того, ничто другое не имеет значения, поэтому я не вижу большого риска для мнения и спама.
101
Nicolai

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

( Source ; посмотрите, как использовать 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>

( Источник )

114
Nicolai

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>
18
bourgesl

Кажется, что jaxws-ri транзитивно зависит от commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852, который, очевидно, можно найти в репозитории http://download.Eclipse.org/rt/eclipselink/maven.repo

7
theNikki1

Мне нужно было заменить 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 также.

Теперь это действительно грязная ситуация, это работает, но как можно быть уверенным, что это лучшая замена, верно?

6
virgo47

Я экспериментировал с большинством предложений, описанных выше, используя 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> 
0
Des Albert

Я нашел самый простой способ обойти 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 для меня.

0
George

Просто незначительное изменение (улучшение) вышеупомянутых ответов - приведено здесь только для 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>
0
paul-emil