Заміни застарілих модулів JPMS з API EE Java


183

У застарілому Java 9 застаріли шість модулів, що містять API Java EE, і вони незабаром будуть видалені :

  • java.активація з javax.activationпакетом
  • java.corba з javax.activity, javax.rmi, javax.rmi.CORBAі org.omg.*пакети
  • java.передача з 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 не існує єдиного сенсу дізнатися про все це, що, на мою думку, має велике значення.
  • Питання, що задають рекомендації щодо бібліотеки, зазвичай вважаються позатематичними, оскільки "вони, як правило, залучають впевнені відповіді та спам", але я не думаю, що це стосується тут. Набір дійсних бібліотек чітко окреслено: вони повинні реалізувати певний стандарт. Крім цього нічого іншого не має значення, тому я не бачу великого ризику для думок та спаму.

6
В основному ви можете знайти всіх тих, хто переміщується під github.com/javaee та посиланнями на декілька конкретних даних на JEP 320: Видаліть модулі Java EE та CORBA
Наман

Дивіться також цю статтю на 2018-05-14 в Інфосвіті, дорожня карта Java: Eclipse's Jakarta EE підприємство Java формує Пол Крілл. Підзаголовок: Фонд Eclipse описує 39 проектів, які складатимуть нове хмарне підприємство, сприятливе для мікросервісів, Java, і як розвиватиметься GlassFish
Василь Бурк

2
З JDK 11 його було вилучено. Якщо ви використовуєте jdk 9 або вище, краще додати залежність, а не використовувати "--add-модулі java.xml.bind", такі речі
Anver Sadhat

Відповіді:


205

Замість того, щоб використовувати застарілі модулі Java EE, використовуйте наступні артефакти.

JAF ( java.activation )

Рамка активації JavaBeans (тепер 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 не буде, якщо треті сторони не візьмуть на себе обслуговування API-інтерфейсів CORBA, впровадження ORB, постачальника CosNaming тощо. Технічне обслуговування можливе тому, що платформа Java SE підтримує незалежні реалізації CORBA. На відміну від цього, API для RMI-IIOP визначається та реалізується виключно в межах Java SE. Не буде окремої версії RMI-IIOP, якщо не буде розпочато спеціальний JSR для його підтримання, або керівництво API не буде взяте на себе Фундація Eclipse (перехід керівництва Java EE з JCP у фонд Eclipse включає 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 була перейменована на Джакарту 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>

Сторінка впровадження довідника JAXB .

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>

( Джерело )


що робити у випадку, якщо модуль читає jax-wsяк jdk, так і com.sun.xml.wsзалежність?
nllsdfx

1
Я не впевнений, що саме ви запитуєте. Який модуль читає jax-ws? Якщо у графі модуля є java.xml.ws та com.sun.xml.ws:jaxws-ri на шляху до класу, остання буде ігнорована (через розділені пакети ).
Миколай

Я хочу використовувати com.sun.xml.ws:jaxws-riзамість java.xml.wsсвого модуля, оскільки останній застарілий і буде видалений. І я додав залежність до мого файлу pom, і з'явилася помилка "модуль xyz читає пакет" javax.xml.ws "з обох" java.xml.ws "і" java.xml.ws "".
nllsdfx

Схоже, що модуль java.xml.ws врегульований врешті, можливо, через --add-modulesабо тому, що цього потребують деякі інші модулі. Чи можете ви відкрити нове запитання, щоб ми могли його розглянути?
Миколай

1
Це правда. Дві деталі: (1) Якщо жоден явний модуль (тобто один із заявою модуля) не залежить від JAXB, ви все одно можете розмістити їх на шляху до класу, де розділені пакети не мають значення. (2) Параметр командного рядка --patch-moduleможе поправити розкол.
Ніколай

25

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>

5
Дякую, це працювало для мене на Java 10. Однак використання однієї властивості для номера версії 2.3.0для обох jaxb-apiі jaxb-runtimeне є хорошою ідеєю. Glassfish виконання в даний час в2.3.0.1 той час як API залишається 2.3.0. Я пропоную propertiesповністю залишити елемент у відповіді та просто жорстко кодувати номер версії в кожній dependencyокремо.
Василь Бурк

Моя рекомендація: у <dependencyManagement>, імпортуйте org.glassfish.jaxb:jaxb-bomBOM у деякій версії (остання зараз - 2.3.0.1), а потім у фактичному <dependencies>розділі не вказуйте версію для jaxb-apiабо jaxb-runtime. Номер версії буде взято з BOM, що гарантуватиме, що вони завжди синхронізуються та покращатимуться разом.
AndrewF

2
JAXB 2.3. [0 | 1] більше не працюватиме для Java 11! Дивіться github.com/eclipse-ee4j/jaxb-api/isissue/78
col.panic

9

Мені потрібно було замінити 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.

Зараз це справді безладний стан, він працює, але як же хтось бути впевнений, що це найкраща заміна, правда?


ми також використовуємо gradle, і я нікуди не потрапив. Намагався перевести мавенські розчини на граді, але успіху не було. Ваш приклад працює для мене (хоча компіляція використовується, хоча проект, який я намагаюся перенести, використовується vertx). Дякую за те, що поділився, і, справді, я також сподіваюся, що скоро з'являться роз'яснення щодо gradle :)
Ларс,

Зверніть увагу, що ситуація розвивається досить швидко - нещодавно я переїхав ще один проект до Spring Boot 2.2, де API Джакарти є більш помітним, але нам ще потрібні реалізації. Для цього я все ще використовую org.glassfish. * Речі. Щоразу, коли я використовую проект Spring Boot, я намагаюсь максимально перевірити додаток їх версій залежності та максимально відповідати цьому (змінити поточну на потрібну вам версію): docs.spring.io/spring-boot/docs/current/reference/html/ …
virgo47

8

Здається, що jaxws-ri залежить транзитивно від commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852, який, очевидно, можна знайти з сховища http://download.eclipse.org/rt/eclipselink/maven.repo


1
Можливо, тому, що це більше підходило для коментаря, ніж для відповіді. Незалежно від того, чи вдалося ви вирішити проблему? Я не можу знайти залежність. mvn -U clean installпродовжує говорити Could not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852.
Зіль

1
Я не є експертом Maven, але здається, що це знаходить commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852, коли в pom.xml не оголошено сховища. Якщо в pom.xml є сховища (наприклад, Spring-Snapshot), потрібно також додати download.eclipse.org/rt/eclipselink/maven.repository , наприклад <repository> <id> my-id </id> <name> eclipse-repo </name> <url> download.eclipse.org/rt/eclipselink/maven.repo </ url > </repository> ps. Я б додав коментар замість відповіді, якби моя репутація була досить великою :)
theNikki1

2
Я міг би змусити його працювати, але мені довелося також видалити дзеркало зі своїх налаштувань.xml. Після подальшої перевірки я не можу відтворити, як це заміна застарілого пакету. Натомість я виявив цю залежність, яка працює чудово:<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
Zyl

Мені вдалося виключити пакунокsdo-eclipselink-plugin
Йосип Похоть

2

Лише незначна зміна (вдосконалення) вищезазначених відповідей --- тут пояснюється лише для 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>

1

Я експериментував з більшістю пропозицій, описаних вище, використовуючи 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

Я знайшов найпростіший шлях, щоб обійти частину цих проблем 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

Я використовую jdk 11 + мураха + плющ у моєму весняному проекті mvc. Я отримував помилку " пакет javax.jws не існує ", тому я додав javax.jws-api-1.1.jar до classpath, і він працював! Просто завантажте банку з https://repo1.maven.org/maven2/javax/jws/javax.jws-api/1.1/javax.jws-api-1.1.jar та додайте його на свій класний шлях у build.xml

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.