包与Java 9中的自动模块冲突

包与Java 9中的自动模块冲突,java,compiler-errors,java-9,java-module,java-platform-module-system,Java,Compiler Errors,Java 9,Java Module,Java Platform Module System,随着Java9即将面世,我认为将我的一些项目移植到Java9将是一个很好的学习练习。在我的一个项目中,我对和有依赖关系 我想将此项目创建为命名模块。为此,我需要创建一个module info.java文件,并在此处指定rxjava和rxjavafx的要求。但是,这些库还没有任何模块信息 为了解决这个问题,我读了这篇文章。据我所知,我需要重命名rxjava和rxjavafxjar,使其具有一个简单的名称,然后在--module path参数中列出jar。然后,我在module info.java中

随着Java9即将面世,我认为将我的一些项目移植到Java9将是一个很好的学习练习。在我的一个项目中,我对和有依赖关系

我想将此项目创建为命名模块。为此,我需要创建一个
module info.java
文件,并在此处指定
rxjava
rxjavafx
的要求。但是,这些库还没有任何模块信息

为了解决这个问题,我读了这篇文章。据我所知,我需要重命名
rxjava
rxjavafx
jar,使其具有一个简单的名称,然后在
--module path
参数中列出jar。然后,我在
module info.java
中添加一个带有jar名称的
requires
指令

模块com.foo.bar{
需要rxjavafx;
需要rxjava;
}
我编写了一个gradle任务来为我编辑jar名称,它在大多数情况下似乎都能工作。它需要所有需要编译的jar,并将它们重命名为不包含版本信息或斜杠。然后将这些文件连接成一个
分隔字符串:

tasks.withType(JavaCompile) {
    delete { delete '/tmp/gradle' }
    copy {
        from configurations.compile + configurations.testCompile
        into '/tmp/gradle'
        rename '(.*)-[0-9]+\\..*.jar', '$1.jar'
        rename { String fileName -> fileName.replace("-", "") }
    }
    options.compilerArgs += ['--module-path', fileTree(dir: '/tmp/gradle', include: '*.jar').getFiles().join(':')]
}
当然,
rx
库共享它们的一些包名。。。但是,这会导致编译器回吐错误,例如:

错误:模块从rxjava和rxjavafx读取包rx.subscriptions
错误:模块从rxjava和rxjavafx读取包rx.schedulers
错误:模块从rxjava和rxjavafx读取包rx.observables
错误:模块rxjava从rxjavafx和rxjava读取包rx.subscriptions
错误:模块rxjava从rxjavafx和rxjava读取包rx.schedulers
错误:模块rxjava从rxjavafx和rxjava读取包rx.Observable
错误:模块rxjavafx从rxjava和rxjavafx读取包rx.subscriptions
错误:模块rxjavafx从rxjava和rxjavafx读取包rx.schedulers
错误:模块rxjavafx从rxjava和rxjavafx读取包rx.Observable
似乎解决这个问题的唯一方法是将
rxjava
rxjavafx
的内容重新打包到一个jar中,并将其作为一个模块添加。但这似乎不是一个好的解决方案

因此,我的问题是:

  • 我是否正确使用新模块系统
  • 对此错误我能做些什么?及
  • 这些依赖关系是否阻止我更新,或者我应该等待rx更新他们的LIB

注意:我试过用标准的
java
/
javac
运行这个程序,它们会导致相同的问题。这也是我的java版本:

java版本“9-ea”
Java(TM)SE运行时环境(构建9-ea+140)
Java HotSpot(TM)64位服务器虚拟机(构建9-ea+140,混合模式)
我是否正确使用新模块系统

对。您看到的是预期行为,这是因为JPMS模块不允许拆分包

如果您不熟悉术语“拆分包”,它本质上意味着来自两个不同模块的同一包的两个成员

例如:
com.foo.A(来自moduleA.jar)
com.foo.B(来自moduleB.jar)

对此错误我能做些什么

您有两个选择:

  • (更难)“取消拆分”包依赖项。然而,如果您不熟悉库的内部工作,这可能是困难的或不可能的
  • (更容易)将两个jar组合成一个jar(因此是一个自动模块),如上所述。我同意这不是一个“好”的解决方案,但首先拆分包通常也不是一个好主意
  • 这些依赖关系是否阻止我更新,或者我应该等待rx更新他们的LIB

    希望rx最终会更新他们的LIB,使其在将来某个时候不会有拆分包。在此之前,我的建议是将两个罐子一起打碎成一个罐子(选项2)

    我是否正确使用新模块系统

    对。您看到的是预期行为,这是因为JPMS模块不允许拆分包

    如果您不熟悉术语“拆分包”,它本质上意味着来自两个不同模块的同一包的两个成员

    例如:
    com.foo.A(来自moduleA.jar)
    com.foo.B(来自moduleB.jar)

    对此错误我能做些什么

    您有两个选择:

  • (更难)“取消拆分”包依赖项。然而,如果您不熟悉库的内部工作,这可能是困难的或不可能的
  • (更容易)将两个jar组合成一个jar(因此是一个自动模块),如上所述。我同意这不是一个“好”的解决方案,但首先拆分包通常也不是一个好主意
  • 这些依赖关系是否阻止我更新,或者我应该等待rx更新他们的LIB


    希望rx最终会更新他们的LIB,使其在将来某个时候不会有拆分包。在此之前,我的建议是将两个罐子一起打碎成一个罐子(选项2)。

    我遇到了同样的问题:

    error: module flyway.core reads package javax.transaction.xa from both jboss.transaction.api.1.2.spec and java.sql
    error: module slf4j.api reads package javax.transaction.xa from both jboss.transaction.api.1.2.spec and java.sql
    error: module hibernate.core reads package javax.transaction.xa from both jboss.transaction.api.1.2.spec and java.sql
    .../src/main/java/module-info.java:1: error: module eu.com.x reads package javax.transaction.xa from both java.sql and jboss.transaction.api.1.2.spec
    
    我可以通过检查我的项目可传递依赖项(“gradle依赖项”或“mvn依赖项:树”可能会有帮助)并通过代码simmiliar排除拆分包编译问题,以:

    configurations.all {
        exclude group: 'org.jboss.spec.javax.transaction', module: 'jboss-transaction-api_1.2_spec'
    }
    

    
    org.hibernate
    冬眠核心
    5.2.10.最终版本
    org.jboss.spec.javax.transaction
    jboss-transaction-api_1.2_规范
    

    我的问题是不需要重新包装罐子。此问题未在#JDK8上发生。可能排除依赖项对每个项目都没有帮助。

    我遇到了同样的问题:

    error: module flyway.core reads package javax.transaction.xa from both jboss.transaction.api.1.2.spec and java.sql
    error: module slf4j.api reads package javax.transaction.xa from both jboss.transaction.api.1.2.spec and java.sql
    error: module hibernate.core reads package javax.transaction.xa from both jboss.transaction.api.1.2.spec and java.sql
    .../src/main/java/module-info.java:1: error: module eu.com.x reads package javax.transaction.xa from both java.sql and jboss.transaction.api.1.2.spec
    
    我可以在编译时摆脱拆分包
    <dependencies>
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-core</artifactId>
          <version>5.2.10.Final</version>
          <exclusions>
            <exclusion>
              <groupId>org.jboss.spec.javax.transaction</groupId>
              <artifactId>jboss-transaction-api_1.2_spec</artifactId>
            </exclusion>
          </exclusions> 
        </dependency>
      </dependencies>
    
     opens javax.transaction.xa;