[java] 더 이상 사용되지 않는 JPMS 모듈을 Java EE API로 교체

자바 (9)는 자바 EE API를 포함 여섯 개 모듈 사용되지 않는 그들이되어 제거 될 것 곧 :

  • java.activationjavax.activation패키지
  • java.corbajavax.activity, javax.rmi, javax.rmi.CORBA, 및 org.omg.*패키지
  • java.transactionjavax.transaction패키지
  • 모든 javax.xml.bind.*패키지 와 함께 java.xml.bind
  • java.xml.wsjavax.jws, javax.jws.soap, javax.xml.soap, 모든 javax.xml.ws.*패키지
  • java.xml.ws.annotationjavax.annotation패키지

어떤 유지 관리 타사 아티팩트가 해당 API를 제공합니까? API를 얼마나 잘 제공하는지 또는 제공해야하는 다른 기능은 중요하지 않습니다. 중요한 것은 이러한 모듈 / 패키지를 대체 할 수있는 것입니까?

지식을 쉽게 수집 할 수 있도록 지금까지 알고있는 내용에 답하고 커뮤니티 위키를 만들었습니다. 사람들이 자신의 답변을 작성하는 대신 그것을 확장하기를 바랍니다.


투표 마감 전에 :

  • 예, 이미 개별 모듈에 대한 몇 가지 질문이 있으며이 질문에 대한 답변은 물론 해당 정보를 복제합니다. 그러나 AFAIK는 이러한 모든 것에 대해 배울 단일 포인트가 없으며 많은 가치가 있다고 생각합니다.
  • 도서관의 추천을 요구하는 질문은 “논평 한 답변과 스팸을 끌어들이는 경향이 있기 때문에”일반적으로 주제가 아닌 것으로 간주되지만 여기서는 해당되는 것으로 생각하지 않습니다. 유효한 라이브러리 세트는 명확하게 설명되어 있습니다. 특정 표준을 구현해야합니다. 그 외에는 아무 것도 중요하지 않으므로 의견과 스팸의 위험이별로 없습니다.


답변

더 이상 사용되지 않는 Java EE 모듈을 사용하는 대신 다음 아티팩트를 사용하십시오.

JAF ( java.activation )

JavaBeans Activation Framework (현재 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, ORB 구현, CosNaming 제공자 등의 유지 보수를 인계하지 않는 한 독립형 CORBA 버전은 없습니다. Java SE Platform은 독립적 인 CORBA 구현을 보증하므로 써드 파티 유지 보수가 가능합니다. 반대로 RMI-IIOP 용 API는 Java SE 내에서만 정의되고 구현됩니다. 전용 JSR을 유지 보수하기 시작하거나 Eclipse Foundation에서 API의 관리 권한을 인수하지 않으면 독립형 버전의 RMI-IIOP가 제공되지 않습니다 (JCP에서 Eclipse Foundation으로 Java EE의 관리 전환이 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 가 Jakarta 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 Annotations (Maven Central에서 사용 가능) :

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

( 소스 )


답변

JDK9 용 JAXB (java.xml.bind)

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>


답변

Spring Boot 2 기반 응용 프로그램의 JAX-WS (java.xml.ws) 및 JAXB (java.xml.bind)를 교체해야 하고이 JAR (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뿐만 아니라.

이제는 정말 지저분한 상황이지만 작동하지만 어떻게 최상의 교체인지 확인해야합니까?


답변

jaxws-ri는 http://download.eclipse.org/rt/eclipselink/maven.repo 에서 찾을 수있는 commonj.sdo : commonj.sdo : jar : 2.1.1.v201112051852에 전 이적으로 의존하는 것으로 보입니다.


답변

위의 답변에 대한 약간의 변형 (개선)은 JAXB에만 해당됩니다. runtime스코프에 의존성을 추가 할 수 있으며 이것이 효과적으로 필요한 경우에만 가능합니다 (즉, 버전이 9보다 큰 JRE에서 실행하기 위해 빌드 할 때 — 여기에서 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>


답변

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> 


답변

이 문제의 JAXB 부분을 해결하는 가장 쉬운 방법은 루트 pom 또는 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-plugin0.14.0 버전으로 업데이트하면 모든 jaxb 생성 문제가 해결되었습니다.