【问题标题】:Can I exclude an exported package from a Java module?我可以从 Java 模块中排除导出的包吗?
【发布时间】:2018-06-23 18:43:37
【问题描述】:

模块 jta 和 java.sql 将包 javax.transaction.xa 导出到模块 dom4j

如您所见,jtajava.sql 两个模块都导出同一个包,javax.transaction.xa。但是,jta 中的包具有我需要的类,这些类在java.sql 中不存在。我根本不需要java.sql 模块,但我需要java.sql.SQLException

是否可以防止java.sql 导出javax.transaction.xa

【问题讨论】:

    标签: java java-9 jta java-module


    【解决方案1】:

    JTA GitHub 读取以下内容以确认@Alan 在comment 中已经指出的内容-

    此独立版本的 Java(TM) Java Transaction API (JTA) 使用 Java平台模块系统“自动”模块名称 java.transaction,以匹配 JDK 9 中使用的模块名称。未来 版本将包括完整的模块元数据。而且 javax.transaction.xa 包现在归 Java SE 所有。

    您可以使用 Maven(例如)使用该版本:-

    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>javax.transaction-api</artifactId>
        <version>1.3</version>
    </dependency>
    

    这里是release notes for JTA1.3MR.


    另外,JEP 320: Remove the Java EE and CORBA Modules 也详细阐述了这一点 -

    ...javax.transaction.xa 包支持 JDBC 中的 XA 事务。 这个"XA package" 与JDBC 位于java.sql 模块中 Java SE 9. 因为java.sql 模块不可升级,所以它不是 独立版本的 JTA 可以覆盖 Java SE XA 包的版本

    并进一步说明您的解决方案的可扩展性

    ...为了便于维护,Java SE 中的 XA 包可能会移动到 未来不同的不可升级模块,但作为 架构问题它将与 JDBC 一起保留在 Java SE 中 长期...

    按计划进行

    在 2018 年初,JTA 1.3 将被定义为仅包含 CORBA 互操作包; JAR 文件将相应更新。

    【讨论】:

    • 我已经知道这个 fix,但我只能通过删除 module-info.java 并通过命令行添加模块来让它工作(Spring 没有想与模块路径合作:P)。不过谢谢!
    • 对于 JDK 9 和 JDK 10,如果您将 JTA 1.3 作为模块部署,那么您需要将其部署在升级模块路径上,以便它覆盖运行时映像中的 java.transaction 模块. JDK 11 中不存在这种复杂性,因为建议从 Java SE 11 中删除 java.transaction。
    【解决方案2】:

    您可以使用 javac -d -cp /PATHTOYOURFILE -d-cp 标志仅编译所需的目录和类路径。类路径也可以用逗号分隔。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2018-09-27
      相关资源
      最近更新 更多