Thay thế cho các mô-đun JPMS không dùng nữa với API Java EE


183

Java 9 không dùng nữa sáu mô-đun có chứa API Java EE và chúng sẽ sớm bị xóa :

  • java.activation với javax.activationgói
  • java.corba với javax.activity, javax.rmi, javax.rmi.CORBA, và org.omg.*gói
  • java.transaction với javax.transactiongói
  • java.xml.bind với tất cả javax.xml.bind.*các gói
  • java.xml.ws với javax.jws, javax.jws.soap, javax.xml.soap, và tất cả các javax.xml.ws.*gói
  • java.xml.ws.annotation với javax.annotationgói

Những tạo phẩm của bên thứ ba được duy trì nào cung cấp các API đó? Không quan trọng là họ cung cấp các API đó tốt như thế nào hoặc những tính năng nào khác mà họ phải cung cấp - tất cả vấn đề là, chúng có phải là sự thay thế thả xuống cho các mô-đun / gói này không?

Để làm cho việc thu thập kiến ​​thức dễ dàng hơn, tôi đã trả lời với những gì tôi biết cho đến nay và đưa câu trả lời lên wiki cộng đồng. Tôi hy vọng mọi người sẽ mở rộng nó thay vì viết câu trả lời của riêng họ.


Trước khi bạn bỏ phiếu để đóng:

  • Vâng, đã có một số câu hỏi trên các mô-đun riêng lẻ và một câu trả lời cho câu hỏi này tất nhiên sẽ sao chép thông tin đó. Nhưng AFAIK không có một điểm duy nhất để tìm hiểu về tất cả những điều này, mà tôi nghĩ có rất nhiều giá trị.
  • Các câu hỏi yêu cầu đề xuất thư viện thường được coi là lạc đề, bởi vì "chúng có xu hướng thu hút các câu trả lời và thư rác", nhưng tôi không nghĩ rằng điều đó áp dụng ở đây. Tập hợp các thư viện hợp lệ được phân định rõ ràng: Họ phải thực hiện một tiêu chuẩn cụ thể. Ngoài ra, không có gì khác, vì vậy tôi không thấy nhiều rủi ro cho ý kiến ​​và thư rác.

6
Bạn hầu như có thể tìm thấy tất cả những người được di chuyển theo github.com/javaee và liên kết đến một số chi tiết cụ thể tại JEP 320: Xóa Mô-đun Java EE và CORBA
Naman

Xem thêm bài viết 2018-05-14 này trong InfoWorld, lộ trình Java: Java doanh nghiệp Jakarta EE của Java hình thành bởi Paul Krill. Phụ đề: Quỹ Eclipse phác thảo 39 dự án sẽ tạo nên nỗ lực Java doanh nghiệp thân thiện với đám mây, thân thiện với dịch vụ đám mây mới và cách GlassFish sẽ phát triển
Basil Bourque

2
Từ JDK 11, nó đã bị xóa. Nếu bạn đang sử dụng jdk 9 trở lên, tốt hơn là trực tiếp thêm phụ thuộc thay vì sử dụng loại công cụ "--add-mô-đun java.xml.bind"
Anver Sadhat

Câu trả lời:


205

Thay vì sử dụng các mô-đun Java EE không dùng nữa, hãy sử dụng các tạo phẩm sau.

JAF ( java.activation )

Khung kích hoạt JavaBeans (nay là Jakarta Activation ) là một công nghệ độc lập (có sẵn trên Maven Central):

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

( Nguồn )

CORBA ( java.corba )

Từ JEP 320 :

Sẽ không có phiên bản độc lập của CORBA trừ khi các bên thứ ba đảm nhận việc bảo trì API CORBA, triển khai ORB, nhà cung cấp CosNaming, v.v. Có thể bảo trì bên thứ ba vì Nền tảng Java SE tán thành việc triển khai CORBA độc lập. Ngược lại, API cho RMI-IIOP được định nghĩa và triển khai chỉ trong Java SE. Sẽ không có phiên bản độc lập của RMI-IIOP trừ khi một JSR chuyên dụng được bắt đầu để duy trì nó hoặc việc quản lý API được Quỹ Foundation (chuyển đổi quản lý Java EE từ JCP sang Quỹ Eclipse bao gồm GlassFish và việc thực hiện CORBA và RMI-IIOP).

JTA ( java.transaction )

Phiên bản độc lập:

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

( Nguồn )

JAXB ( java.xml.bind )

Do Java EE được đổi thương hiệu thành Jakarta EE , JAXB hiện được cung cấp bởi các tạo phẩm mới:

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

Trang thực hiện tham khảo JAXB .

schemagenxjccó thể được tải xuống ở đó như là một phần của bản phân phối JAXB độc lập.

Xem thêm câu trả lời liên kết .

JAX-WS ( java.xml.ws )

Thực hiện tham khảo:

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

Tải xuống phân phối độc lập (chứa wsgenwsimport).

Chú thích phổ biến ( java.xml.ws.annotation )

Chú thích Java Commons (có sẵn trên Maven Central):

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

( Nguồn )


Phải làm gì trong trường hợp nếu một mô-đun đọc jax-wstừ cả jdk và com.sun.xml.wsphụ thuộc?
nllsdfx

1
Tôi không chắc chính xác những gì bạn đang hỏi. Mô-đun nào đọc jax-ws? Nếu bạn có java.xml.ws trong biểu đồ mô-đun và com.sun.xml.ws:jaxws-ri trên đường dẫn lớp, cái sau sẽ bị bỏ qua (vì các gói tách ).
Nicolai

Vâng, tôi muốn sử dụng com.sun.xml.ws:jaxws-rithay vì java.xml.wstrong mô-đun của mình vì cái sau bị phản đối và sẽ bị xóa. Và tôi đã thêm sự phụ thuộc vào tệp pom của mình và lỗi "mô-đun xyz đọc gói 'javax.xml.ws' từ cả 'java.xml.ws' và 'java.xml.ws'".
nllsdfx

Dường như mô-đun java.xml.ws được giải quyết sau tất cả, có thể do một --add-moduleshoặc vì một số mô-đun khác yêu cầu nó. Bạn có thể mở một câu hỏi mới, vì vậy chúng tôi có thể xem nó?
Nicolai

1
Đúng. Hai chi tiết: (1) Nếu không có mô-đun rõ ràng (nghĩa là một mô-đun có khai báo mô-đun) phụ thuộc vào JAXB, bạn vẫn có thể đặt chúng trên đường dẫn lớp, trong đó các gói phân chia không thành vấn đề. (2) Tùy chọn dòng lệnh --patch-modulecó thể sửa đổi phần tách.
Nicolai

25

JAXB (java.xml.bind) cho JDK9

Hoạt động hoàn hảo trong các ứng dụng máy tính để bàn của tôi trên 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
Cảm ơn, điều này đã làm việc với tôi trên Java 10. Tuy nhiên, việc sử dụng một thuộc tính duy nhất cho số phiên bản 2.3.0cho cả hai jaxb-apijaxb-runtimekhông phải là một ý tưởng hay. Thời gian chạy Glassfish hiện tại2.3.0.1 trong khi API vẫn còn 2.3.0. Tôi đề nghị bỏ propertieshoàn toàn phần tử trong Câu trả lời và chỉ mã cứng từng số phiên bản trong từng phần dependencyriêng biệt.
Basil Bourque

Khuyến nghị của tôi: trong <dependencyManagement>, nhập org.glassfish.jaxb:jaxb-bomBOM ở một số phiên bản (mới nhất là 2.3.0.1), và sau đó trong phần thực tế <dependencies>, không chỉ định phiên bản cho một trong hai jaxb-apihoặc jaxb-runtime. Số phiên bản sẽ được lấy từ BOM, điều này sẽ đảm bảo chúng luôn đồng bộ và được nâng cấp cùng nhau.
AndrewF

2
JAXB 2.3. [0 | 1] sẽ không hoạt động cho Java 11 nữa! Xem github.com/eclipse-ee4j/jaxb-api/issues/78
col.panic

9

Tôi cần thay thế JAX-WS (java.xml.ws) và JAXB (java.xml.bind) cho ứng dụng dựa trên Spring Boot 2 của tôi và kết thúc với các JAR này (bản dựng 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'

(Bạn có thể cần compilehoặc phạm vi khác, runtimeOnlylà đủ cho chúng tôi.)

Tôi nhận thấy rằng https://mvnreposective.com/artifact/com.sun.xml.bind/jaxb-core được mô tả là "Cũ" và sử dụng câu trả lời này cũng được sử dụng cho các org.glassfishcông cụ dựa trên org.eclipse.yasson.

Bây giờ tình hình thực sự lộn xộn, nó hoạt động, nhưng làm thế nào mọi người nên chắc chắn đó là sự thay thế tốt nhất, phải không?


chúng tôi cũng đang sử dụng gradle và tôi đã không nhận được bất cứ nơi nào. Đã cố gắng dịch các giải pháp maven để phân loại nhưng không thành công. Ví dụ của bạn hoạt động với tôi (mặc dù đã biên dịch, không được cung cấp, dự án tôi cố gắng di chuyển đang sử dụng vertx). Cảm ơn đã chia sẻ và thực sự, tôi cũng hy vọng sẽ sớm có một số giải thích rõ ràng về việc học lớp :)
Lars

Xin lưu ý rằng tình hình phát triển khá nhanh - mới đây tôi đã chuyển một dự án khác sang Spring Boot 2.2, nơi các API Jakarta nổi bật hơn, nhưng chúng tôi vẫn cần triển khai. Cho rằng tôi vẫn sử dụng org.glassfish. * Thứ. Bất cứ khi nào tôi sử dụng dự án Spring Boot, tôi có xu hướng kiểm tra phụ lục phiên bản phụ thuộc của chúng và tuân thủ càng nhiều càng tốt (thay đổi hiện tại thành phiên bản bạn cần): docs.spring.io/spring-boot/docs/cản/reference/html/ Tiết
virgo47

8

Dường như jaxws-ri phụ thuộc quá mức từ commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 mà dường như có thể tìm thấy từ kho lưu trữ http://doad.eclipse.org/rt/eclipselink/maven.repo


1
Có lẽ bởi vì nó phù hợp hơn cho một bình luận hơn là một câu trả lời. Bất kể, bạn đã có thể khắc phục vấn đề? Tôi dường như không thể lấy lại sự phụ thuộc. mvn -U clean installcứ nói Could not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852.
Zyl

1
Tôi không phải là chuyên gia về maven, nhưng có vẻ như nó đang tìm kiếm commonj.sdo: commonj.sdo: jar: 2.1.1.v201112051852 khi không có kho lưu trữ nào được khai báo trong pom.xml. Nếu có kho lưu trữ trong pom.xml (như ảnh chụp mùa xuân), người ta cũng phải thêm download.eclipse.org/rt/eclipselink/maven.reposeective , ví dụ <repository> <id> my-id </ id> <name> nhật thực-repo </ name> <url> download.eclipse.org/rt/eclipselink/maven.repo </ url > </ repository> ps. Tôi đã có thêm bình luận thay vì trả lời nếu danh tiếng của tôi đủ lớn :)
theNikki1

2
Tôi có thể làm cho nó hoạt động nhưng tôi cũng phải xóa một máy nhân bản khỏi tệp cài đặt của tôi. Sau khi kiểm tra thêm, tuy nhiên tôi không thể sao chép đây là sự thay thế cho gói không dùng nữa. Thay vào đó, tôi tìm thấy sự phụ thuộc này hoạt động độc đáo:<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
Zyl

Tôi chỉ có thể loại trừ góisdo-eclipselink-plugin
Joseph Lust

2

Chỉ là một biến thể nhỏ (cải tiến) cho các câu trả lời ở trên --- chỉ được minh họa ở đây cho JAXB. Người ta có thể thêm các phụ thuộc với runtimephạm vi và chỉ khi điều này thực sự cần thiết (tức là khi xây dựng để chạy trong JRE với phiên bản> = 9 --- ở đây v11 được minh họa):

<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

Tôi đã thử nghiệm với hầu hết các đề xuất được mô tả ở trên bằng cách sử dụng JDK 11.0.3 và đã không thành công. Giải pháp duy nhất mà cuối cùng tôi tìm thấy để làm việc là sau đây. Có lẽ có các tùy chọn khác cũng hoạt động nhưng có vẻ như việc lựa chọn phiên bản là rất quan trọng. Ví dụ: việc thay đổi com.sun.xml.ws:rt thành 2.3.2 khiến mô-đun javax.jws không còn khả dụng.

    <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

Tôi đã tìm thấy cách dễ nhất để khắc phục các phần của JAXB trong các vấn đề này là sử dụng quản lý phụ thuộc trong pom gốc của tôi hoặc trong bom của tôi:

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

Và trong các mô-đun không biên dịch trên 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>  
    <!-- ... -->

Ngoài ra, việc cập nhật phiên bản org.jvnet.jaxb2.maven2:maven-jaxb2-pluginlên 0.14.0 đã giải quyết tất cả các vấn đề tạo jaxb cho tôi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.