非推奨のJPMSモジュールとJava EE APIの置き換え


183

Javaの9は、Java EEのAPIが含まれている6個のモジュールを非推奨とされている、彼らは削除されようとしてすぐに:

  • java.activation付きjavax.activationパッケージ
  • java.corbajavax.activityjavax.rmijavax.rmi.CORBA、およびorg.omg.*パッケージ
  • java.transaction付きjavax.transactionパッケージ
  • すべてのjavax.xml.bind.*パッケージを含むjava.xml.bind
  • java.xml.wsjavax.jwsjavax.jws.soapjavax.xml.soap、およびすべてjavax.xml.ws.*のパッケージ
  • java.xml.ws.annotation付きjavax.annotationパッケージ

維持されているサードパーティのアーティファクトのうち、これらのAPIを提供するものはどれですか。それらがそれらのAPIをどれだけうまく提供しているか、または彼らが提供しなければならないその他の機能は問題ではありません-重要なのは、これらがこれらのモジュール/パッケージのドロップインの置き換えですか?

知識の収集を容易にするために、これまでにわかったことを回答し、その回答をコミュニティWikiにしました。自分の答えを書くのではなく、もっと広げてほしいです。


投票する前に:

  • はい、個々のモジュールにはすでにいくつかの質問があり、この質問への回答はもちろんその情報を複製します。しかし、私の知る限り、これらすべてについて学ぶべき単一のポイントはありません。
  • ライブラリの推奨事項を求める質問は、「意見の分かれた回答やスパムを引き付ける傾向がある」ため、通常はトピック外と見なされますが、ここでは当てはまりません。有効なライブラリのセットは明確に描かれています。特定の標準を実装する必要があります。それ以外は何も問題ではないので、意見やスパムのリスクはあまりありません。

6
JEP 320github.com/javaeeおよびいくつかの詳細へのリンクの下に移動するものはすべて見つかります。JavaEE およびCORBAモジュールの削除
Naman

InfoWorldの2018年5月14日の記事、Javaロードマップもご覧ください:EclipseのJakarta EEエンタープライズJavaは、Paul Krillによって具体化されています。サブタイトル:Eclipse Foundationは、クラウドネイティブでマイクロサービスに対応した新しいエンタープライズJavaの取り組みを構成する39のプロジェクトと、GlassFishがどのように進化するかを概説しています
Basil Bourque

2
JDK 11から削除されました。jdk 9以降を使用している場合は、「
add

回答:


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はありません。JavaSEプラットフォームがCORBAの独立した実装を承認しているため、サードパーティのメンテナンスが可能です。対照的に、RMI-IIOPのAPIは、Java SE内でのみ定義および実装されます。RMI-IIOPのスタンドアロンバージョンは、それを維持するために専用のJSRが開始されない限り、またはAPIのスチュワードシップがEclipse Foundationに引き継がれます(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 2018年

1
あなたが何を求めているのか正確にはわかりません。どのモジュールがjax-wsを読み取りますか?あなたが持っている場合はjava.xml.wsをモジュールグラフとでcom.sun.xml.ws:jaxws-riクラスパス上の、後者は(理由により無視されますスプリットパッケージ)。
ニコライ

後者は非推奨であり、削除されるため、まあ私は自分のモジュールのcom.sun.xml.ws:jaxws-ri代わりに使用したいとjava.xml.ws思います。そして、私はpomファイルに依存関係を追加し、「モジュールxyzが「java.xml.ws」と「java.xml.ws」の両方からパッケージ「javax.xml.ws」を読み取ります」というエラーが表示されました。
nllsdfx 2018年

モジュールjava.xml.wsが解決されたようです。おそらく、--add-modulesまたは他の一部のモジュールで必要とされているためです。新しい質問を開いて、それを見てみましょうか。
ニコライ

1
それは本当だ。2つの詳細:(1)明示的なモジュールがない場合(つまり、モジュール宣言があるモジュール)がJAXBに依存していない場合でも、それらをクラスパスに配置できます。分割パッケージは関係ありません。(2)コマンドラインオプションで--patch-module分割を修正できます。
ニコライ

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
おかげで、これは、バージョン番号のための単一のプロパティを使用していること、しかし、Javaの10に私のために働いた2.3.0の両方のためjaxb-apiとすることはjaxb-runtime良いアイデアではありません。Glassfishの実行時現在の位置である2.3.0.1 APIは、のまま2.3.0properties要素を完全にAnswerにドロップし、各バージョン番号をdependency個別にハードコードすることをお勧めします。
バジルブルク2018

私の推奨事項:では<dependencyManagement>org.glassfish.jaxb:jaxb-bomBOMを特定のバージョン(最新は2.3.0.1)でインポートし、実際の<dependencies>セクションでは、jaxb-apiまたはのバージョンを指定しないでくださいjaxb-runtime。バージョン番号はBOMから取得されます。これにより、バージョン番号が常に同期され、一緒にアップグレードされます。
AndrewF 2018年

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ビルド)で終了しました。

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

状況は急速に変化することに注意してください。最近、別のプロジェクトをSpring Boot 2.2に移動しました。このプロジェクトでは、Jakarta APIがより顕著ですが、実装も必要です。そのために私はまだ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のエキスパートではありませんが、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
ジョセフ・ラスト2018

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-pluginを0.14.0 に更新すると、jaxb生成の問題がすべて解決しました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.