Kullanımdan kaldırılmış JPMS modüllerinin Java EE API'leriyle değiştirilmesi


183

Java 9 Java EE API'ler içeriyor altı modülleri kaldırılmış ve onlar vardır kaldırılacak yakında:

  • java.activation ilejavax.activation paketin
  • java.corba ile javax.activity, javax.rmi, javax.rmi.CORBA, veorg.omg.* paketler
  • java.transaction ilejavax.transaction paket
  • java.xml.bind tümjavax.xml.bind.* paketler
  • java.xml.ws ile javax.jws, javax.jws.soap, javax.xml.soapve tümjavax.xml.ws.* paketler
  • java.xml.ws.annotation ile javax.annotationpaketin

Hangi üçüncü taraf eserleri bu API'ları sağlar? Bu API'ları ne kadar iyi sağladıkları veya hangi diğer özellikleri sunmaları önemli değil - önemli olan tek şey, bu modüller / paketler için bir yedek yedek mi?

Bilgi kaynağının toplanmasını kolaylaştırmak için, şimdiye kadar bildiklerimle cevap verdim ve yanıtı bir topluluk wiki'si haline getirdim. Umarım insanlar kendi cevaplarını yazmak yerine genişletirler.


Kapatmak için oy vermeden önce:

  • Evet, bireysel modüller hakkında zaten bazı sorular var ve bu sorunun cevabı elbette bu bilgileri çoğaltacaktır. Fakat AFAIK bunların hepsini öğrenecek tek bir nokta yok, bence çok değerli.
  • Kütüphane önerileri isteyen sorular genellikle konu dışı kabul edilir, çünkü "düşünülen cevapları ve spam'leri çekme eğilimindedirler", ancak bunun burada geçerli olduğunu düşünmüyorum. Geçerli kütüphaneler kümesi açıkça tanımlanmıştır: Belirli bir standart uygulamak zorundadırlar. Bunun dışında hiçbir şey önemli değil, bu yüzden görüş ve spam için fazla risk görmüyorum.

6
Çoğunlukla github.com/javaee altında taşınanların hepsini bulabilirsiniz ve JEP
Naman

Ayrıca InfoWorld, Java yol haritasındaki 2018-05-14 makalesine bakın : Eclipse'nin Jakarta EE kuruluşu Java Paul Krill tarafından şekilleniyor . Altyazı: Eclipse Foundation, yeni bulut-yerel, mikro hizmet dostu kurumsal Java çabasını ve GlassFish'in nasıl gelişeceğini belirleyecek 39 projenin ana hatlarını veriyor
Fesleğen Bourque

2
JDK 11'den kaldırıldı. Eğer jdk 9 veya üstü kullanıyorsanız, bağımlılığı doğrudan "
add

Yanıtlar:


205

Kullanımdan kaldırılmış Java EE modüllerini kullanmak yerine, aşağıdaki eserleri kullanın.

JAF ( java.aktivasyonu )

JavaBeans Aktivasyon Çerçevesi (şimdi Jakarta Aktivasyonu ) bağımsız bir teknolojidir (Maven Central'da mevcuttur):

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

( Kaynak )

CORBA ( java.corba )

Gönderen Jep 320 :

Üçüncü tarafların CORBA API'lerinin, ORB uygulamasının, CosNaming sağlayıcısının, vb. Bakımını devralmadığı sürece, CORBA'nın bağımsız bir sürümü olmayacaktır. Java SE Platformu, CORBA'nın bağımsız uygulamalarını onayladığı için üçüncü taraf bakımı mümkündür. Buna karşılık, RMI-IIOP için API sadece Java SE içinde tanımlanır ve uygulanır. Özel bir JSR onu korumak için başlatılmadıkça veya API'nın yönetimi Eclipse Foundation tarafından devralınmadıkça, RMI-IIOP'un bağımsız bir sürümü olmayacaktır (Java EE'nin yönetiminin JCP'den Eclipse Vakfı'na geçişi GlassFish'i içerir. ve CORBA ve RMI-IIOP uygulamaları).

JTA ( java.transaction )

Bağımsız sürüm:

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

( Kaynak )

JAXB ( java.xml.bind )

Java EE , Jakarta EE'ye yeniden markalaştırıldığı için JAXB şimdi yeni eserler tarafından sağlanıyor:

<!-- 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 Referans Uygulama sayfası .

schemagen ve xjc bağımsız bir JAXB dağıtımının bir parçası olarak buradan da indirilebilir.

Ayrıca bakınız . Bağlantılı cevap .

JAX-WS ( java.xml.ws )

Referans uygulaması:

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

Bağımsız dağıtım indirme ( wsgenve içerir wsimport).

Genel Ek Açıklamalar ( java.xml.ws.annotation )

Java Commons Ek Açıklamaları (Maven Central'da bulunur):

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

( Kaynak )


bir modül jax-wshem jdk hem de com.sun.xml.wsbağımlılıktan okursa ne yapmalı ?
nllsdfx

1
Tam olarak ne istediğini bilmiyorum. Hangi modül jax-ws okuyor? Eğer varsa java.xml.ws modül grafiğinde ve com.sun.xml.ws:jaxws-ri sınıf yolunda, ikincisi (çünkü göz ardı edilecektir bölünmüş paketleri ).
Nicolai

Peki benim modül com.sun.xml.ws:jaxws-riyerine kullanmak istiyorum java.xml.wsçünkü ikincisi kullanımdan kaldırıldı ve kaldırılacak. Ve pom dosyama bağımlılığı ekledi ve "modül xyz 'javax.xml.ws' paketini 'java.xml.ws' ve 'java.xml.ws' 'paketini okur" hatası ortaya çıktı.
nllsdfx

Görünüşe göre java.xml.ws modülü , belki de bir --add-modulesveya bazı modüller gerektirdiğinden dolayı çözülmüştür . Yeni bir soru açabilir misiniz, bu yüzden ona bir göz atabilir miyiz?
Nicolai

1
Bu doğru. İki ayrıntı: (1) Hiçbir açık modül (yani modül bildirimli bir modül) JAXB'ye bağlı değilse, bunları bölünmüş paketlerin önemli olmadığı sınıf yoluna yerleştirebilirsiniz. (2) Komut satırı seçeneği --patch-modulebölünmeyi düzeltebilir.
Nicolai

25

JDK9 için JAXB (java.xml.bind)

JDK9 / 10 EA'deki Masaüstü Uygulamalarımda Mükemmel Çalışmak

<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
Teşekkürler, bu benim için Java 10 üzerinde çalıştı. Ancak, 2.3.0her ikisi için sürüm numarası için tek bir özellik kullanımı jaxb-apive jaxb-runtimeiyi bir fikir değil. GlassFish çalışma zamanı şu anda dolu2.3.0.1 API de kalırken 2.3.0. propertiesÖğeyi tamamen Yanıt'a bırakmanızı ve her sürüm numarasını dependencyayrı ayrı sabit kodlamanızı öneririm .
Basil Bourque

Benim tavsiyem: içinde <dependencyManagement>, org.glassfish.jaxb:jaxb-bomMalzeme Listesini bazı sürümlerde içe aktarın (en son şimdi 2.3.0.1'dir) ve daha sonra gerçek <dependencies>bölümde, ya jaxb-apida için bir sürüm belirtmeyin jaxb-runtime. Sürüm numarası, her zaman senkronize olduklarından ve birlikte yükseltildiklerinden emin olacak olan Malzeme Listesinden alınacaktır.
AndrewF

2
JAXB 2.3. [0 | 1] artık Java 11 için çalışmayacak! Bkz. Github.com/eclipse-ee4j/jaxb-api/issues/78
col.panic

9

Benim Spring Boot 2 tabanlı uygulama için JAX-WS (java.xml.ws) ve JAXB (java.xml.bind) yerine gerekli ve bu JAR (Gradle build) ile sona erdi:

// 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'

(İhtiyacınız compileveya başka bir kapsam, runtimeOnlybizim için yeterliydi.)

Https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core'un "Eski" olarak tanımlandığını ve bu cevabı kullanmanın org.glassfishgetirdiği temel şeyler için de gittiğini fark ettim org.eclipse.yasson.

Şimdi gerçekten dağınık bir durum, işe yarıyor, ama herkes bunun en iyi yedek olduğundan nasıl emin olmalı, değil mi?


Ayrıca gradle kullanıyoruz ve hiçbir yere ulaşamadım. Maaven çözeltilerini kalıba çevirmeye çalıştım ama başarı yok. Örneğin benim için çalışıyor (derleme kullanılır, ancak sağlanmadı, taşımaya çalıştığım proje vertx kullanıyor). Paylaştığınız için teşekkürler ve gerçekten de umarım yakında gradle hakkında bazı açıklamalar olacak :)
Lars

Durumun oldukça hızlı bir şekilde geliştiğini lütfen unutmayın - kısa süre önce başka bir projeyi Jakarta API'larının daha belirgin olduğu Spring Boot 2.2'ye taşıdım, ancak yine de uygulamalara ihtiyacımız var. Bunun için hala org.glassfish. * Şeyler kullanıyorum. Spring Boot projesini her kullandığımda, bağımlılık sürümleri ekini kontrol etme ve mümkün olduğunca buna uyma eğilimindeyim (ihtiyacınız olan sürümü değiştirin): docs.spring.io/spring-boot/docs/current/reference/html/ …
virgo47

8

Jaxws-ri, görünüşte depodan http://download.eclipse.org/rt/eclipselink/maven.repo adresinden bulunabilen commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852'ye geçici olarak bağlı gibi görünüyor.


1
Muhtemelen bir cevaptan ziyade bir yorum için daha uygun olduğu için. Ne olursa olsun, sorunu çözebildiniz mi? Bağımlılığı alamıyorum. mvn -U clean installsöylemeye devam ediyor Could not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852.
Zyl

1
Ben maven uzmanı değilim, ama pom.xml'de depo bildirilmediğinde commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 buluyor gibi görünüyor. Pom.xml dosyasında (yaylı anlık görüntü gibi) havuzlar da eklenmelidir. havuzlar download.eclipse.org/rt/eclipselink/maven.repository , örneğin <repository> <id> my-id </id> <name> eclipse-repo </name> <url> download.eclipse.org/rt/eclipselink/maven.repo </ url > </repository> ps. Eğer itibarım yeterince büyük olsaydı cevap yerine yorum
eklerdim

2
Çalışmak için alabilirdim ama aynı zamanda benim settings.xml bir ayna kaldırmak zorunda kaldı. Ancak daha sonra yapılan incelemeden sonra, kullanımdan kaldırılan paketin yerini nasıl alabileceğimi tekrarlayamıyorum. Bunun yerine güzel çalışan bu bağımlılığı buldum:<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
Zyl

Paketi hariç sdo-eclipselink-plugin
Joseph Lust

2

Yukarıdaki cevaplarda sadece küçük bir değişiklik (gelişme) --- burada sadece JAXB için örneklenmiştir. runtimeKapsam ile bağımlılıklar eklenebilir ve sadece bu etkin bir şekilde ihtiyaç duyulursa (yani,> = 9 --- ile bir JRE'de çalışmak için bina oluştururken burada v11 örneklendirilir):

<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 kullanarak yukarıda açıklanan önerilerin çoğunu denedim ve başarılı olamadım. Sonunda işe yaradığımı bulduğum tek çözüm şudur. Belki de çalışan başka seçenekler de var, ancak sürüm seçiminin kritik olduğu anlaşılıyor. Örneğin, com.sun.xml.ws:rt dosyasının 2.3.2 olarak değiştirilmesi, javax.jws modülünün artık kullanılmamasına neden olur.

    <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

Bu sorunların JAXB bölümlerinde dolaşmanın en kolay yolunun kök pom'ımda veya bomomda bağımlılık yönetimi kullanmak olduğunu buldum:

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

Ve jdk11'de derleme başarısız olan modüllerde:

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

Ayrıca, org.jvnet.jaxb2.maven2:maven-jaxb2-plugin0.14.0 sürümünün güncellenmesi benim için tüm jaxb nesil sorunlarını çözdü.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.