การแทนที่โมดูล JPMS ที่เลิกใช้แล้วด้วย Java EE API


183

Java 9 คัดค้านหกโมดูลที่มี Java EE APIsและกำลังจะถูกลบในไม่ช้า:

  • java.activati ​​onกับ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 เหล่านั้นได้ดีเพียงใดหรือคุณสมบัติอื่น ๆ ที่พวกเขามีให้ - สิ่งที่สำคัญคือพวกเขาจะสามารถแทนที่ Drop-in สำหรับโมดูล / แพ็คเกจเหล่านี้ได้หรือไม่?

เพื่อให้ง่ายต่อการรวบรวมความรู้ฉันได้ตอบกับสิ่งที่ฉันรู้จนถึงตอนนี้และทำให้คำตอบเป็นวิกิชุมชน ฉันหวังว่าผู้คนจะขยายออกไปแทนที่จะเขียนคำตอบของตัวเอง


ก่อนที่คุณจะลงคะแนนให้ปิด:

  • ใช่มีบางคำถามในแต่ละโมดูลและคำตอบสำหรับคำถามนี้แน่นอนว่าข้อมูลนั้นซ้ำกัน แต่ AFAIK ไม่มีจุดเดียวที่จะเรียนรู้เกี่ยวกับสิ่งเหล่านี้ทั้งหมดซึ่งฉันคิดว่ามีค่ามาก
  • คำถามที่ขอคำแนะนำจากห้องสมุดมักจะถูกพิจารณาว่าเป็นหัวข้อนอกเรื่องเพราะ "พวกเขามักจะดึงดูดคำตอบและสแปมที่มีความคิดเห็น" แต่ฉันไม่คิดว่ามันจะใช้กับที่นี่ ชุดของไลบรารีที่ถูกต้องได้รับการอธิบายอย่างชัดเจน: พวกเขาจะต้องใช้มาตรฐานเฉพาะ นอกเหนือจากนั้นไม่มีอะไรสำคัญดังนั้นฉันจึงไม่เห็นความเสี่ยงต่อความคิดเห็นและสแปม

6
คุณสามารถค้นหาผู้ที่ได้รับการย้ายภายใต้github.com/javaeeและลิงก์ไปยังข้อมูลเฉพาะบางอย่างที่JEP 320: นำโมดูล Java EE และ CORBA ออก
Naman

ดูเพิ่มเติมที่บทความ 2018-05-14 ใน InfoWorld, Java roadmap: Jakarta EE enterprise จาการ์ตา Eclipse Java เป็นผู้นำโดย Paul Krill คำบรรยาย: Eclipse Foundation สรุปโครงการ 39 โครงการที่จะรวมความพยายามของ Java ในองค์กรแบบคลาวด์และเป็นมิตรกับไมโครไซต์และวิธีที่ GlassFish จะพัฒนาขึ้น
Basil Bourque

2
จาก JDK 11 จะถูกลบออก หากคุณใช้ jdk 9 หรือสูงกว่าการเพิ่มการพึ่งพาโดยตรงควรใช้ "--add-modules java.xml.bind" ประเภทของสิ่งต่าง ๆ
Anver Sadhat

คำตอบ:


205

แทนที่จะใช้โมดูล Java EE ที่เลิกใช้แล้วให้ใช้ส่วนต่อไปนี้

JAF ( java.activati ​​on )

JavaBeans Activation Framework (ตอนนี้เปิดใช้งานจาการ์ตา ) เป็นเทคโนโลยีแบบสแตนด์อโลน (มีให้ใน 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 APIs, การใช้ 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 ถูก rebranded ไปยังจาการ์ตา 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.wsdependency
nllsdfx

1
ฉันไม่แน่ใจว่าคุณต้องการอะไร โมดูลใดอ่าน jax-ws? หากคุณมีjava.xml.wsในโมดูลกราฟและcom.sun.xml.ws:jaxws-riบนคลาสพา ธ ส่วนท้ายจะถูกละเว้น (เนื่องจากแพ็กเกจแบบแยก )
Nicolai

ดีฉันต้องการใช้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เพราะหรือเพราะโมดูลอื่น ๆ บางอย่างต้องการมัน คุณสามารถเปิดคำถามใหม่ได้หรือไม่เพื่อให้เราสามารถดูได้
Nicolai

1
นั่นเป็นเรื่องจริง รายละเอียดสองอย่าง: (1) หากไม่มีโมดูลที่ชัดเจน (เช่นที่มีการประกาศโมดูล) ขึ้นอยู่กับ JAXB คุณยังสามารถวางไว้บนคลาสพา ธ ซึ่งแพ็คเกจที่แยกไม่สำคัญ (2) ตัวเลือกบรรทัดคำสั่ง--patch-moduleสามารถแก้ไขการแยก
Nicolai

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องค์ประกอบทั้งหมดใน Answer และเพียงฮาร์ดโค้ดแต่ละหมายเลขรุ่นในแต่ละdependencyแยก
Basil Bourque

คำแนะนำของฉัน: ใน<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/issues/78
col.panic

9

ฉันต้องการแทนที่ JAX-WS (java.xml.ws) และ JAXB (java.xml.bind) สำหรับแอปพลิเคชันที่ใช้ Spring Boot 2 ของฉันและจบลงด้วย JARs (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'

(คุณอาจต้องการcompileหรือขอบเขตอื่น ๆruntimeOnlyก็เพียงพอแล้วสำหรับเรา)

ฉันสังเกตเห็นว่าhttps://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-coreอธิบายว่า "เก่า" และการใช้คำตอบนี้ก็นำไปสู่org.glassfishสิ่งต่าง ๆ ที่เกิดขึ้นorg.eclipse.yassonเช่นกัน

ตอนนี้มันเป็นสถานการณ์ที่ยุ่งเหยิงจริงๆมันใช้งานได้ แต่ใครจะแน่ใจได้ว่ามันเป็นสิ่งทดแทนที่ดีที่สุดใช่มั้ย


เรายังใช้ gradle อยู่และฉันก็ไม่ได้ไปไหน พยายามแปลวิธีการแก้ปัญหาให้สำเร็จ แต่ไม่สำเร็จ ตัวอย่างของคุณใช้ได้กับฉัน (ใช้คอมไพล์แม้ว่าไม่ได้ระบุโปรเจคที่ฉันพยายามจะโยกย้ายก็ใช้เวอร์เท็กซ์) ขอบคุณสำหรับการแบ่งปันและแน่นอนฉันหวังว่าจะมีการชี้แจงเกี่ยวกับการไล่ระดับสีเร็ว ๆ นี้ :)
ลาร์ส

โปรดทราบว่าสถานการณ์วิวัฒนาการค่อนข้างเร็ว - เมื่อเร็ว ๆ นี้ฉันย้ายโครงการอื่นไปที่ Spring Boot 2.2 ซึ่ง Jakarta APIs โดดเด่นกว่า แต่เรายังต้องมีการใช้งาน สำหรับสิ่งที่ฉันยังคงใช้ 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ต่อไป
Zyl

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
ฉันสามารถทำให้มันทำงานได้ แต่ฉันต้องลบ mirror ออกจาก settings.xml ด้วย หลังจากการตรวจสอบเพิ่มเติม แต่ฉันไม่สามารถทำซ้ำได้ว่านี่เป็นสิ่งทดแทนสำหรับแพ็คเกจที่เลิกใช้แล้ว แต่ฉันพบว่าการพึ่งพาอาศัยซึ่งทำงานได้ดี:<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
357 Zyl

ฉันสามารถแยกแพคเกจออกมาได้sdo-eclipselink-plugin
Joseph Lust

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 ของปัญหาเหล่านี้คือการใช้การจัดการการพึ่งพาในรูตของฉันหรือใน 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 ทั้งหมดสำหรับฉัน


0

ฉันใช้ jdk 11 + ant + ivy ในโปรเจ็กต์ mvc ฤดูใบไม้ผลิของฉัน ฉันได้รับข้อผิดพลาด " package javax.jws ไม่มีอยู่ " ดังนั้นฉันจึงเพิ่มjavax.jws-api-1.1.jarให้กับclasspathและใช้งานได้! เพียงแค่ดาวน์โหลด jar จากhttps://repo1.maven.org/maven2/javax/jwax/javax.jws-api/1.1/javax.jws-api-1.1.jar และเพิ่มลงใน classpath ของคุณใน build.xml

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.