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


183

자바 (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는 이러한 모든 것에 대해 배울 단일 포인트가 없으며 많은 가치가 있다고 생각합니다.
  • 도서관의 추천을 요구하는 질문은 "논평 한 답변과 스팸을 끌어들이는 경향이 있기 때문에"일반적으로 주제가 아닌 것으로 간주되지만 여기서는 해당되는 것으로 생각하지 않습니다. 유효한 라이브러리 세트는 명확하게 설명되어 있습니다. 특정 표준을 구현해야합니다. 그 외에는 아무 것도 중요하지 않으므로 의견과 스팸의 위험이별로 없습니다.

6
JEP 320 에서 github.com/javaee 아래로 이동하는 모든 것을 찾을 수 있으며 JEP 320
Naman

Java의 InfoWorld 로드맵 : 2018 년 5 월 14 일 기사 : Eclipse의 Jakarta EE 엔터프라이즈 Java가 Paul Krill의 모습입니다. 자막 : Eclipse Foundation은 새로운 클라우드 네이티브 마이크로 서비스 친화적 인 엔터프라이즈 Java 노력을 구성 할 39 개의 프로젝트와 GlassFish의 진화 방식을 설명합니다
Basil Bourque

2
JDK 11부터는 제거되었습니다. jdk 9 이상을 사용하는 경우 "--add-modules java.xml.bind"를 사용하는 대신 종속성을 직접 추가하는 것이 좋습니다.
Anver Sadhat

답변:


205

더 이상 사용되지 않는 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>

( 소스 )


모듈이 jax-wsjdk와 com.sun.xml.ws의존성 을 모두 읽는 경우 어떻게해야합니까 ?
nllsdfx

1
정확히 무엇을 요구하는지 잘 모르겠습니다. jax-ws를 읽는 모듈은 무엇입니까? 당신이있는 경우 java.xml.ws 모듈 그래프와의 com.sun.xml.ws:jaxws-ri 클래스 경로를, 후자는 (때문에 무시됩니다 분할 패키지 ).
Nicolai

글쎄, 나는 후자가 더 이상 사용되지 않고 제거되기 때문에 내 모듈 com.sun.xml.ws:jaxws-ri대신에 사용하고 싶습니다 java.xml.ws. 그리고 내 pom 파일에 종속성을 추가하고 "module xyz는 'java.xml.ws'와 'java.xml.ws'모두에서 'javax.xml.ws 패키지를 읽습니다.'라는 오류가 발생했습니다.
nllsdfx

java.xml.ws 모듈 은 결국 --add-modules또는 다른 모듈이 필요하기 때문에 해결 된 것처럼 보입니다 . 새로운 질문을 열어서 살펴볼 수 있습니까?
Nicolai

1
사실입니다. 두 가지 세부 사항 : (1) 명시 적 모듈 (예 : 모듈 선언이있는 모듈)이 JAXB에 의존하지 않는 경우에도 분할 패키지가 중요하지 않은 클래스 경로에 모듈을 배치 할 수 있습니다. (2) 명령 행 옵션 --patch-module은 분할을 수정할 수 있습니다.
Nicolai

25

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>

5
덕분에,이, 그러나 자바 (10)에 나를 위해 버전 번호에 대한 하나의 속성의 사용을 일을 2.3.0모두 jaxb-api하고 jaxb-runtime좋은 생각이 아니다. 글래스 피시 런타임에서 현재2.3.0.1 API가에 남아있는 동안 2.3.0. properties요소를 Answer에 완전히 떨어 뜨리고 각 버전 번호를 dependency개별적으로 하드 코딩 하는 것이 좋습니다 .
Basil Bourque

내 권장 사항 : 에서 일부 버전 (최신 2.3.0.1)에서 BOM을 <dependencyManagement>가져온 org.glassfish.jaxb:jaxb-bom다음 실제 <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

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뿐만 아니라.

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


우리는 또한 gradle을 사용하고 있으며 아무데도 가지 않았습니다. maven 솔루션을 gradle로 변환하려고 시도했지만 성공하지 못했습니다. 귀하의 예제는 저에게 효과적입니다 (제공되지는 않았지만 마이그레이션하려고하는 프로젝트는 vertx를 사용하고 있습니다). 공유 해주셔서 감사합니다. 그래도 곧 gradle에 관한 설명이 있기를 바랍니다. :)
Lars

상황이 매우 빠르게 발전한다는 점에 유의하십시오. 최근에 Jakarta API가 더 두드러지는 Spring Boot 2.2로 다른 프로젝트를 옮겼지만 여전히 구현이 필요합니다. 이를 위해 여전히 org.glassfish. *를 사용합니다. Spring Boot 프로젝트를 사용할 때마다 종속성 버전 부록을 확인하고 가능한 한 많이 준수합니다 (현재 버전을 필요한 버전으로 변경) : docs.spring.io/spring-boot/docs/current/reference/html/ ...
virgo47

8

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


1
아마도 답변보다는 의견에 더 적합했기 때문일 것입니다. 어쨌든 문제를 해결할 수 있었습니까? 종속성을 검색 할 수없는 것 같습니다. mvn -U clean install계속 말합니다 Could not find artifact commonj.sdo:commonj.sdo:jar:2.1.1.v201112051852.
Zyl

1
나는 maven 전문가는 아니지만 pom.xml에 리포지토리가 선언되지 않은 경우 commonj.sdo : commonj.sdo : jar : 2.1.1.v201112051852를 찾는 것 같습니다. 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
작동시킬 수는 있지만 settings.xml에서 미러를 제거해야했습니다. 그러나 추가 검사 후 더 이상 사용되지 않는 패키지를 대체하는 방법을 재현 할 수 없습니다. 대신 나는이 의존성이 훌륭하게 작동한다는 것을 발견했다.<dependency> <groupId>javax.jws</groupId> <artifactId>jsr181-api</artifactId> <version>1.0-MR1</version> </dependency>
Zyl

패키지를 제외 할 수있었습니다sdo-eclipselink-plugin
Joseph Lust

2

위의 답변에 대한 약간의 변형 (개선)은 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>

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 부분을 해결하는 가장 쉬운 방법은 루트 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 생성 문제가 해결되었습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.