代码之家  ›  专栏  ›  技术社区  ›  Nicolai Parlog

用Java EE API替换不推荐使用的JPMS模块

  •  261
  • Nicolai Parlog  · 技术社区  · 7 年前

    Java 9 deprecated six modules that contain Java EE APIs 他们是 going to be removed 很快:

    • Java语言激活 具有 javax.activation 包裹
    • Java语言corba公司 具有 javax.activity , javax.rmi , javax.rmi.CORBA org.omg.* 包装
    • Java语言交易 具有 javax.transaction 包裹
    • Java语言xml。绑定 与所有 javax.xml.bind.* 包装
    • Java语言xml。ws系列 具有 javax.jws , javax.jws.soap , javax.xml.soap ,以及所有 javax.xml.ws.* 包装
    • Java语言xml。ws。注释 具有 javax.annotation 包裹

    哪些维护的第三方工件提供了这些API?不管他们提供这些API的能力有多好,也不管他们必须提供哪些其他功能,重要的是,它们是否是这些模块/包的替代品?

    为了更方便地收集knoweldge,我用迄今为止所知的内容进行了回答,并将答案设置为社区维基。我希望人们能扩展它,而不是自己写答案。


    投票关闭前:

    • 是的,已经有一些关于各个模块的问题,对这个问题的回答当然会重复这些信息。但是,要了解所有这些,没有一点是值得的,我认为这很有价值。
    • 要求图书馆推荐的问题通常被认为是离题的,因为“它们往往会吸引固执己见的答案和垃圾邮件”,但我认为这不适用于这里。有效库的集合被清楚地描述:它们必须实现特定的标准。除此之外,其他一切都无关紧要,所以我认为发表意见和垃圾邮件的风险不大。
    11 回复  |  直到 3 年前
        1
  •  292
  •   Nicolai Parlog    4 年前

    不要使用不推荐使用的Java EE模块,而是使用以下构件。

    JAF公司( Java语言激活 )

    JavaBeans激活框架(现在 雅加达激活 )是一种独立的技术(可在Maven Central上使用):

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

    ( Source )

    CORBA公司( Java语言corba公司 )

    从…起 JEP 320 :

    除非第三方接管CORBA API、ORB实现、CosNaming提供者等的维护,否则不会有独立的CORBA版本。第三方维护是可能的,因为Java SE平台支持CORBA的独立实现。相反,RMI-IIOP的API仅在Java SE中定义和实现。除非启动专门的JSR来维护RMI-IIOP,或者由Eclipse基金会接管API的管理,否则不会有独立版本的RMI-IIOP(Java EE的管理从JCP过渡到Eclipse基金会包括 GlassFish 以及CORBA和RMI-IIOP的实现)。

    JTA公司( Java语言交易 )

    单机版:

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

    ( Source )

    JAXB公司( Java语言xml。绑定 )

    自Java EE以来 更名为雅加达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>
    
    <!-- Alternative runtime -->
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.3</version>
        <scope>runtime</scope>
    </dependency>
    

    JAXB Reference Implementation page .

    替代运行时为 brought up by Abhijit Sarkar .

    schemagen xjc 也可以作为独立JAXB发行版的一部分从那里下载。

    另请参见 linked answer .

    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>
    

    Standalone distribution download (包含 wsgen wsimport ).

    常见批注( Java语言xml。ws。注释 )

    Java Commons Annotations (在Maven Central上提供):

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

    ( Source )

        2
  •  34
  •   Toparvion    6 年前

    用于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>
    
        3
  •  12
  •   virgo47    6 年前

    我需要为基于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 被描述为“旧”并使用 this answer 追求 org.glassfish 基于带来的东西 org.eclipse.yasson

    现在情况真的很糟糕,它能起作用,但谁又能确定它是最好的替代品,对吗?

        4
  •  7
  •   theNikki1    6 年前

    jaxws ri似乎从commonj传递依赖。sdo:commonj。sdo:jar:2.1.1。v201112051852,显然可以从存储库中找到 http://download.eclipse.org/rt/eclipselink/maven.repo

        5
  •  3
  •   abarisone    3 年前

    我在春季mvc项目中使用jdk 11+ant+ivy。 “我出错了” 包javax。jws不存在 “所以我补充道 javax。jws-api-1.1。罐子 类路径 成功了! 只需从下载jar https://repo1.maven.org/maven2/javax/jws/javax.jws-api/1.1/javax.jws-api-1.1.jar 并将其添加到 build.xml

    或者将其添加到 pom.xml :

    <dependency>
      <groupId>javax.jws</groupId>
      <artifactId>javax.jws-api</artifactId>
      <version>1.1</version>
    </dependency>
    
        6
  •  2
  •   paul-emil    6 年前

    只是对上述答案的一个小改动(改进)——这里仅为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>
    
        7
  •  2
  •   Max von Hippel MD. Sahib Bin Mahboob    2 年前

    如果您有相同的问题,请将以下依赖项添加到pom。xml

    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>2.3.3</version>
    </dependency>
    

    然后使用JAVA 8作为替代JRE。有关更多详细信息,请参阅 to this video ,这对我很有用。

        8
  •  1
  •   Des Albert    5 年前

    我已经使用JDK 11.0.3尝试了上述大多数建议,但都没有成功。我最终找到的唯一可行的解决方案是:。也许还有其他的选择也可行,但版本的选择似乎至关重要。例如,更改com。太阳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> 
    
        9
  •  1
  •   David    4 年前

    如果在Talend中有此问题(例如7.x),可以添加默认POM。项目xml:

    <dependencies>
        <dependency>
            <groupId>javax.xml.soap</groupId>
            <artifactId>javax.xml.soap-api</artifactId>
            <version>1.4.0</version>
        </dependency>
    </dependencies>
    

    测试对象:

    • AdoptJDK 8.0.275.1-hotspot:好的
    • 采用JDK 11.0.9.101-hotspot:正常
    • 采用JDK 15.0.1.9-hotspot:KO(但这是另一个问题:不兼容的条件操作数类型Exception和TDieException)
    • Zulu-8.50.0.1017:正常
    • Zulu-11.43.1015:正常
        10
  •  0
  •   George    6 年前

    我发现解决这些问题的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生成问题。

        11
  •  0
  •   Wale    3 年前

    到2022年,这确实是一个真正的痛苦! 我尝试了许多上述建议,但只能使其与以下依赖项一起工作。

    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0.1</version>
    </dependency>
     
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
     
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.1</version>
    </dependency>
      
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.25.0-GA</version>
    </dependency>
    

    注意:不要试图更新依赖项,只要保持这种方式就行了,这对我很有用。