Penggantian untuk modul JPMS yang sudah tidak digunakan lagi dengan Java EE APIs

183

Java 9 tidak lagi menggunakan enam modul yang mengandung Java EE API dan akan segera dihapus :

  • java.activation dengan javax.activationpaket
  • java.corba dengan javax.activity, javax.rmi, javax.rmi.CORBA, dan org.omg.*paket
  • java.transaction dengan javax.transactionpaket
  • java.xml.bind dengan semua javax.xml.bind.*paket
  • java.xml.ws dengan javax.jws, javax.jws.soap, javax.xml.soap, dan semua javax.xml.ws.*paket
  • java.xml.ws.annotation dengan javax.annotationpaket

Artefak pihak ketiga yang dikelola mana yang menyediakan API itu? Tidak masalah seberapa baik mereka menyediakan API tersebut atau fitur lain apa yang mereka tawarkan - yang penting adalah, apakah itu pengganti drop-in untuk modul / paket ini?

Untuk membuatnya lebih mudah untuk mengumpulkan pengetahuan, saya menjawab dengan apa yang saya ketahui sejauh ini dan membuat jawabannya sebagai wiki komunitas. Saya harap orang-orang akan memperluas itu daripada menulis jawaban mereka sendiri


Sebelum Anda memilih untuk menutup:

  • Ya, sudah ada beberapa pertanyaan pada modul individual dan jawaban untuk pertanyaan ini tentu saja akan menggandakan informasi itu. Tetapi AFAIK tidak ada satu titik untuk belajar tentang semua ini, yang saya pikir memiliki banyak nilai.
  • Pertanyaan yang meminta rekomendasi perpustakaan biasanya dianggap di luar topik, karena "mereka cenderung menarik jawaban dan spam yang beralasan", tapi saya rasa itu tidak berlaku di sini. Himpunan perpustakaan yang valid jelas digambarkan: Mereka harus menerapkan standar tertentu. Selain itu tidak ada hal lain yang penting, jadi saya tidak melihat banyak risiko untuk pendapat dan spam.
Nicolai
sumber
6
Anda sebagian besar dapat menemukan semua yang dipindahkan di bawah github.com/javaee dan tautan ke beberapa spesifik di JEP 320: Hapus Java EE dan CORBA Modules
Naman
Lihat juga artikel 2018-05-14 ini di InfoWorld, Java roadmap: Java EE enterprise Jakarta Eclipse dibentuk oleh Paul Krill. Subtitle: Eclipse Foundation menguraikan 39 proyek yang akan membentuk usaha Java-asli yang baru, usaha yang ramah microservices, dan bagaimana GlassFish akan berkembang
Basil Bourque
2
Dari JDK 11 telah dihapus. Jika Anda menggunakan jdk 9 atau lebih, lebih baik menambahkan dependensi secara langsung daripada menggunakan jenis "--add-modules java.xml.bind"
Anver Sadhat

Jawaban:

205

Alih-alih menggunakan modul Java EE yang sudah usang, gunakan artefak berikut.

JAF ( java.activation )

JavaBeans Activation Framework (sekarang Jakarta Activation ) adalah teknologi mandiri (tersedia di Maven Central):

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

( Sumber )

CORBA ( java.corba )

Dari JEP 320 :

Tidak akan ada versi mandiri CORBA kecuali jika pihak ketiga mengambil alih pemeliharaan API CORBA, implementasi ORB, penyedia CosNaming, dll. Pemeliharaan pihak ketiga dimungkinkan karena Java SE Platform mendukung implementasi independen CORBA. Sebaliknya, API untuk RMI-IIOP didefinisikan dan diimplementasikan hanya dalam Java SE. Tidak akan ada versi mandiri RMI-IIOP kecuali JSR khusus mulai memeliharanya, atau kepengurusan API diambil alih oleh Eclipse Foundation (transisi kepengurusan Java EE dari JCP ke Eclipse Foundation mencakup GlassFish dan penerapan CORBA dan RMI-IIOP).

JTA ( java.transaction )

Versi yang berdiri sendiri:

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

(Sumber )

JAXB ( java.xml.bind )

Sejak Java EE diganti nama menjadi Jakarta EE , JAXB sekarang disediakan oleh artefak baru:

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

Halaman Implementasi Referensi JAXB .

schemagen dan xjc dapat diunduh di sana juga sebagai bagian dari distribusi JAXB mandiri.

Lihat juga jawaban yang ditautkan .

JAX-WS ( java.xml.ws )

Implementasi referensi:

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

Unduhan distribusi mandiri (berisi wsgendan wsimport).

Anotasi Umum ( java.xml.ws.annotation )

Java Commons Annotations (tersedia di Maven Central):

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

( Sumber )

Nicolai
sumber
apa yang harus dilakukan jika modul membaca jax-wsdari jdk dan com.sun.xml.wsketergantungan?
nllsdfx
1
Saya tidak yakin apa yang sebenarnya Anda tanyakan. Modul mana yang membaca jax-ws? Jika Anda memiliki java.xml.ws dalam grafik modul dan com.sun.xml.ws:jaxws-ri di jalur kelas, yang terakhir akan diabaikan (karena paket-paket terpisah ).
Nicolai
Yah saya ingin menggunakan com.sun.xml.ws:jaxws-ribukan java.xml.wsdi modul saya karena yang terakhir sudah usang dan akan dihapus. Dan saya menambahkan dependensi ke file pom saya dan kesalahan "module xyz membaca paket 'javax.xml.ws' dari 'java.xml.ws' dan 'java.xml.ws'" muncul.
nllsdfx
Sepertinya modul java.xml.ws sudah teratasi, mungkin karena --add-modulesatau karena beberapa modul lain memerlukannya. Bisakah Anda membuka pertanyaan baru, jadi kita bisa melihatnya?
Nicolai
1
Itu benar. Dua perincian: (1) Jika tidak ada modul eksplisit (yaitu satu dengan deklarasi modul) bergantung pada JAXB, Anda masih bisa menempatkannya di jalur kelas, di mana paket-paket terpisah tidak penting. (2) Opsi baris perintah --patch-moduledapat memperbaiki pemisahan.
Nicolai
25

JAXB (java.xml.bind) untuk JDK9

Bekerja dengan sempurna di aplikasi desktop saya di 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>
bourgesl
sumber
5
Terima kasih, ini bekerja untuk saya di Java 10. Namun, penggunaan satu properti untuk nomor versi 2.3.0untuk keduanya jaxb-apidan jaxb-runtimebukan ide yang baik. The runtime Glassfish saat ini di2.3.0.1 saat API tetap di 2.3.0. Saya sarankan menjatuhkan propertieselemen seluruhnya dalam Jawaban, dan hanya kode-keras setiap nomor versi di masing dependency- masing secara terpisah.
Basil Bourque
Rekomendasi saya: di <dependencyManagement>, impor org.glassfish.jaxb:jaxb-bomBOM di beberapa versi (sekarang terbaru adalah 2.3.0.1), dan kemudian di bagian yang sebenarnya <dependencies>, jangan tentukan versi untuk jaxb-apiatau jaxb-runtime. Nomor versi akan diambil dari BOM, yang akan memastikan mereka selalu sinkron dan ditingkatkan bersama.
AndrewF
2
JAXB 2.3. [0 | 1] tidak akan berfungsi untuk Java 11 lagi! Lihat github.com/eclipse-ee4j/jaxb-api/issues/78
col.panic
9

Saya perlu mengganti JAX-WS (java.xml.ws) dan JAXB (java.xml.bind) untuk aplikasi berbasis Spring Boot 2 dan berakhir dengan JAR ini (Gradle build):

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

(Anda mungkin perlu compileatau ruang lingkup lain, runtimeOnlysudah cukup untuk kami.)

Saya perhatikan bahwa https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core dijelaskan sebagai "Lama" dan menggunakan jawaban ini digunakan untuk org.glassfishbarang-barang berbasis yang dibawa org.eclipse.yassonjuga.

Sekarang situasinya benar-benar berantakan, itu berfungsi, tetapi bagaimana orang harus yakin itu pengganti terbaik, bukan?

virgo47
sumber
kami juga menggunakan gradle dan saya tidak mendapatkan apa-apa. Mencoba menerjemahkan solusi pakar untuk bertahap tetapi tidak berhasil. Contoh Anda berfungsi untuk saya (kompilasi dulu, tidak disediakan, proyek yang saya coba migrasi menggunakan vertx). Terima kasih telah berbagi dan memang, saya juga berharap akan ada beberapa klarifikasi mengenai gradle segera :)
Lars
Harap perhatikan bahwa situasinya berkembang cukup cepat - baru-baru ini saya memindahkan proyek lain ke Spring Boot 2.2 di mana API Jakarta lebih menonjol, tetapi kami juga masih membutuhkan implementasi. Untuk itu saya masih menggunakan org.glassfish. * Stuff. Setiap kali saya menggunakan proyek Spring Boot, saya cenderung untuk memeriksa lampiran versi ketergantungan mereka dan sesuaikan
virgo47
8

Tampaknya jaxws-ri tergantung secara transitif dari commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 yang tampaknya dapat ditemukan dari repositori http://download.eclipse.org/rt/eclipselink/maven.repo

theNikki1
sumber
1
Mungkin karena lebih cocok untuk komentar daripada jawaban. Bagaimanapun, apakah Anda dapat memperbaiki masalah? Saya tampaknya tidak dapat mengambil ketergantungan. mvn -U clean installterus berkata Could not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852.
Zyl
1
Saya bukan pakar pakar, tetapi tampaknya menemukan commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 ketika tidak ada repositori yang dideklarasikan di pom.xml. Jika ada repositori di pom.xml (seperti pegas-snapshot) orang juga harus menambahkan unduhan.eclipse.org/rt/eclipselink/maven.repository , misalnya <repositori> <id> my-id </id> <name> gerhana-repo </ nama> <url> download.eclipse.org/rt/eclipselink/maven.repo</url > </ repositori> ps. Saya akan menambahkan komentar daripada jawaban jika reputasi saya cukup besar :)
theNikki1
2
Saya dapat membuatnya berfungsi tetapi saya juga harus menghapus cermin dari pengaturan saya.xml. Namun setelah pemeriksaan lebih lanjut saya tidak dapat mereproduksi bagaimana ini adalah pengganti paket yang sudah tidak digunakan lagi. Alih-alih saya menemukan ketergantungan ini yang berfungsi dengan baik:<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
Zyl
Saya hanya bisa mengecualikan paketsdo-eclipselink-plugin
Joseph Lust
2

Hanya sedikit variasi (peningkatan) pada jawaban di atas --- dicontohkan di sini hanya untuk JAXB. Satu dapat menambahkan dependensi dengan runtimecakupan dan hanya jika ini diperlukan secara efektif (yaitu ketika membangun untuk berjalan di JRE dengan versi> = 9 --- di sini v11 dicontohkan):

<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>
paul-emil
sumber
1

Saya telah bereksperimen dengan sebagian besar saran yang dijelaskan di atas menggunakan JDK 11.0.3 dan belum berhasil. Satu-satunya solusi yang akhirnya saya temukan untuk berhasil adalah sebagai berikut. Mungkin ada opsi lain yang juga berfungsi tetapi tampaknya pemilihan versi sangat penting. Misalnya, mengubah com.sun.xml.ws:rt ke 2.3.2 menyebabkan modul javax.jws tidak lagi tersedia.

    <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> 
Des Albert
sumber
0

Saya menemukan jalan termudah untuk berkeliling JAXB bagian dari masalah ini adalah menggunakan manajemen dependensi di root pom saya atau di bom saya:

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

Dan di modul yang gagal dikompilasi pada 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>  
    <!-- ... -->

Juga, memperbarui versi org.jvnet.jaxb2.maven2:maven-jaxb2-pluginke 0.14.0 menyelesaikan semua masalah generasi jaxb bagi saya.

George
sumber