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

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

  • 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 нет единой точки, чтобы узнать обо всем этом, что, я думаю, имеет большую ценность.
  • Вопросы, требующие рекомендаций библиотеки, обычно считаются не по теме, потому что «они, как правило, привлекают самоуверенные ответы и спам», но я не думаю, что здесь это применимо. Набор допустимых библиотек четко обозначен: они должны реализовывать определенный стандарт. Помимо этого, все остальное не имеет значения, поэтому я не вижу большого риска для мнения и спама.

person Nicolai Parlog    schedule 11.01.2018    source источник
comment
В основном вы можете найти всех, кто перемещается, в github.com/javaee, а ссылки на некоторые подробности на JEP 320: удаление модулей Java EE и CORBA   -  person Naman    schedule 11.01.2018
comment
См. Также эту статью в InfoWorld от 14 мая 2018 г., Дорожная карта Java: корпоративная Java Eclipse Jakarta EE обретает форму, автор Пол Крилл. Подзаголовок: Eclipse Foundation описывает 39 проектов, которые войдут в состав нового облачного, удобного для микросервисов корпоративного проекта Java, а также то, как GlassFish будет развиваться.   -  person Basil Bourque    schedule 19.07.2018
comment
Из JDK 11 он был удален. Если вы используете jdk 9 или более позднюю версию, лучше добавить зависимость напрямую, а не использовать --add-modules java.xml.bind.   -  person Anver Sadhat    schedule 29.10.2018


Ответы (10)


Вместо использования устаревших модулей Java EE используйте следующие артефакты.

JAF (java.activation)

JavaBeans Activation Framework (теперь Jakarta Activation) - это отдельная технология (доступная на Maven Central):

<dependency>
    <groupId>com.sun.activation</groupId>
    <artifactId>jakarta.activation</artifactId>
    <version>1.2.2</version>
</dependency>

(Источник)

CORBA (java.corba)

Из JEP 320:

Автономной версии CORBA не будет, если третьи стороны не возьмут на себя обслуживание CORBA API, реализации ORB, поставщика CosNaming и т. Д. Возможна поддержка третьей стороной, поскольку платформа Java SE поддерживает независимые реализации CORBA. Напротив, API для RMI-IIOP определяется и реализуется исключительно в Java SE. Не будет отдельной версии RMI-IIOP, если не будет запущен выделенный JSR для ее обслуживания или если управление API не будет передано Eclipse Foundation (передача управления Java EE от JCP к Eclipse Foundation включает GlassFish и его реализация CORBA и RMI-IIOP).

JTA (java.transaction)

Автономная версия:

<dependency>
    <groupId>jakarta.transaction</groupId>
    <artifactId>jakarta.transaction-api</artifactId>
    <version>1.3.3</version>
</dependency>

(Источник)

JAXB (java.xml.bind)

Поскольку Java EE был переименован в Jakarta EE, JAXB теперь снабжен новыми артефактами:

<!-- API -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.3</version>
</dependency>

<!-- Runtime -->
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.3</version>
    <scope>runtime</scope>
</dependency>

<!-- Alternative runtime -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
    <scope>runtime</scope>
</dependency>

Справочная страница реализации JAXB.

Альтернативная среда выполнения была пользователя Abhijit Sarkar.

schemagen и xjc также можно загрузить оттуда как часть автономного дистрибутива JAXB.

См. Также связанный ответ.

JAX-WS (java.xml.ws)

Эталонная реализация:

<!-- API -->
<dependency>
    <groupId>jakarta.xml.ws</groupId>
    <artifactId>jakarta.xml.ws-api</artifactId>
    <version>2.3.3</version>
</dependency>

<!-- Runtime -->
<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.3.3</version>
</dependency>

Загрузка автономного дистрибутива (содержит wsgen и wsimport).

Общие аннотации (java.xml.ws.annotation)

Аннотации Java Commons (доступны в Maven Central):

<dependency>
    <groupId>jakarta.annotation</groupId>
    <artifactId>jakarta.annotation-api</artifactId>
    <version>1.3.5</version>
</dependency>

(Источник)

person Community    schedule 11.01.2018
comment
что делать, если модуль читает jax-ws из зависимости jdk и com.sun.xml.ws? - person nllsdfx; 16.05.2018
comment
Я не уверен, что именно вы спрашиваете. Какой модуль читает jax-ws? Если у вас есть java.xml.ws в графе модуля и com.sun.xml.ws:jaxws-ri в пути к классу, последний будет проигнорирован (потому что из разделенных пакетов). - person Nicolai Parlog; 16.05.2018
comment
Что ж, я хочу использовать com.sun.xml.ws:jaxws-ri вместо java.xml.ws в моем модуле, потому что последний устарел и будет удален. И я добавил зависимость к моему pom-файлу, и модуль ошибок xyz считывает пакет javax.xml.ws из обоих появившихся java.xml.ws и java.xml.ws. - person nllsdfx; 16.05.2018
comment
Похоже, что модуль java.xml.ws все-таки разрешен, возможно, из-за --add-modules или потому, что это требуется для некоторых других модулей. Можете ли вы открыть новый вопрос, чтобы мы могли его рассмотреть? - person Nicolai Parlog; 16.05.2018
comment
взгляните, пожалуйста, на stackoverflow.com/questions/50392459/ - person nllsdfx; 17.05.2018
comment
А как насчет самого модуля java.se.ee? Есть ли замена в maven? - person ZhekaKozlov; 27.05.2018
comment
@ZhekaKozlov: Насколько я знаю, нет, но его легко создать, если он вам понадобится. - person Nicolai Parlog; 27.05.2018
comment
По поводу замен JAXB. И jaxb-core, и jaxb-impl содержат одно и то же имя пакета com.sun.xml.bind и вызовут ошибку разделения пакета в модульном приложении JPMS. Это не сработает, если присутствуют оба. - person Terran; 02.10.2018
comment
Это правда. Две детали: (1) Если ни один явный модуль (т.е. модуль с объявлением модуля) не зависит от JAXB, вы все равно можете разместить их в пути к классам, где разделенные пакеты не имеют значения. (2) Параметр командной строки _ 1_ может исправить разделение. - person Nicolai Parlog; 03.10.2018
comment
@Terran Проблема разделения пакетов больше не актуальна. Теперь существует один модуль Maven jaxb-runtime вместо двух модулей jaxb-core и jaxb-impl. - person ZhekaKozlov; 18.11.2019
comment
Это тоже нужно com.google.code.findbugs: jsr305 на случай, если мы пропустили javax.annotation.Nullable - person Zain Qazi; 30.04.2020
comment
это, кажется, самый обновленный ответ на сегодняшний день ... поэтому я хотел бы добавить дополнительный вопрос, есть ли правильный способ с maven добавить эти банки, но только если он на java 11+, что означает, что сборка / запуск ( in dev) на java 8 все равно будет работать, не беспокоясь о том, какой класс / jar фактически используется. Очевидно, что если у вас есть артефакт сборки, вам придется фильтровать или нет в зависимости от того, для чего вы создаете, но просто запуск в режиме разработки будет другим. - person xenoterracide; 19.01.2021
comment
com.sun.xml.bind:jaxb-impl устарел. Новая среда выполнения - org.glassfish.jaxb:jaxb-runtime. - person Abhijit Sarkar; 24.03.2021
comment
Спасибо @AbhijitSarkar, добавил в ответ. - person Nicolai Parlog; 29.03.2021
comment
Какими будут координаты maven в JAXB в будущем? Я запутался, потому что на странице Джакарты написано com.sun.xml.bind:jaxb-impl, но @AbhijitSarkar говорит, что он устарел? - person Reto Höhener; 26.05.2021

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>
person bourgesl    schedule 16.01.2018
comment
Спасибо, у меня это сработало на Java 10. Однако использование одного свойства для номера версии 2.3.0 как для jaxb-api, так и для jaxb-runtime не является хорошей идеей. Время выполнения в настоящее время составляет 2.3.0.1, а для API - 2.3.0. Я предлагаю полностью исключить элемент properties в ответе и просто жестко запрограммировать каждый номер версии в каждом dependency отдельно. - person Basil Bourque; 18.07.2018
comment
Моя рекомендация: в <dependencyManagement> импортируйте org.glassfish.jaxb:jaxb-bom BOM какой-либо версии (последняя сейчас - 2.3.0.1), а затем в фактическом разделе <dependencies> не указывайте версию ни для jaxb-api, ни для jaxb-runtime. Номер версии будет взят из спецификации, что обеспечит их постоянную синхронизацию и одновременное обновление. - person AndrewF; 08.11.2018
comment
JAXB 2.3. [0 | 1] больше не будет работать для Java 11! См. github.com/eclipse-ee4j/jaxb-api/issues/78 - person col.panic; 12.12.2018

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

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

person virgo47    schedule 07.09.2018
comment
мы также используем gradle, и я ничего не добился. Пытался перевести решения maven в gradle, но безуспешно. Ваш пример работает для меня (использовалась компиляция, но не предоставлена, проект, который я пытаюсь перенести, использует vertx). Спасибо, что поделились, и, действительно, я также надеюсь, что скоро появятся некоторые разъяснения относительно gradle :) - person Lars; 20.09.2018
comment
Обратите внимание, что ситуация развивается довольно быстро - совсем недавно я переместил еще один проект на Spring Boot 2.2, где API-интерфейсы Jakarta более заметны, но нам все еще нужны реализации. Для этого я до сих пор использую материал org.glassfish. *. Всякий раз, когда я использую проект Spring Boot, я стараюсь проверять приложение о версиях их зависимостей и максимально соответствовать ему (изменить текущую версию на нужную): docs.spring.io/spring-boot/docs/current/reference/html/ - person virgo47; 15.06.2020

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

person theNikki1    schedule 26.06.2018
comment
Наверное, потому, что он больше подходил для комментария, чем для ответа. Тем не менее, удалось ли вам решить проблему? Кажется, я не могу получить зависимость. mvn -U clean install продолжает повторять Could not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852. - person Zyl; 02.07.2018
comment
Я не эксперт по maven, но кажется, что он находит commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852, когда в pom.xml не объявлены репозитории. Если в pom.xml есть репозитории (например, spring-snapshot), необходимо также добавить загрузку. eclipse.org/rt/eclipselink/maven.repository, например ‹repository› ‹id› my-id ‹/id› ‹name› eclipse-repo ‹/name› ‹url› download.eclipse.org/rt/eclipselink/maven.repo ‹/ url› ‹/ репозиторий ›пс. Я бы добавил комментарий вместо ответа, если бы моя репутация была достаточно большой :) - person theNikki1; 03.07.2018
comment
Я мог заставить его работать, но мне также пришлось удалить зеркало из моего файла settings.xml. Однако после дополнительной проверки я не могу воспроизвести, как это замена устаревшего пакета. Вместо этого я нашел эту зависимость, которая прекрасно работает: <dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency> - person Zyl; 04.07.2018
comment
Мне удалось просто исключить пакет sdo-eclipselink-plugin - person Joseph Lust; 12.12.2018

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

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

Я использую 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

person Shiva    schedule 07.07.2020
comment
Вы можете правильно включить его через систему разрешения зависимостей Maven: <dependency> <groupId>javax.jws</groupId> <artifactId>javax.jws-api</artifactId><version>1.1</version> </dependency>, и она действительно правильно разрешает классы javax.jws. - person msteiger; 07.08.2020

Если у вас такая же проблема, добавьте приведенную ниже зависимость к 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 видео, и это сработало для меня.

person noOne    schedule 05.04.2021

Я обнаружил, что самый простой способ обойти эти проблемы с JAXB - использовать управление зависимостями в моем корневом pom или в моем bom:

    <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.

person George    schedule 16.02.2019

Если у вас есть эта проблема в Talend (например, 7.x), вы можете добавить в файл 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: ОК
person David    schedule 01.12.2020