Java 9 + Maven:如果两个依赖项导出同一个模块会发生什么?

时间:2017-12-05 10:15:25

标签: java maven java-9 java-module

我正在尝试调用Java方法java.lang.NoSuchMethodError。据我所知,类路径在编译时和运行时都是相同的,所以不应该发生这个错误。

Repro步骤:

  1. 创建4个Maven项目:

    • 在MyLibrary
    • ExtensionPresent
    • ExtensionMissing
    • USERCODE
  2. 模块ExtensionPresentExtensionMissing导出相同的模块名称。

  3. ExtensionMissing出口:

  4. package dummy;
    
    public class Extension {}
    
    1. ExtensionPresent出口:
    2. package dummy;
      
      public class Extension {
      
          public static void present() {
              System.out.println("Extension present!");
          }
      }
      
      1. MyLibraryExtensionMissing声明为依赖。
      2. UserCodeMyLibrary声明为依赖。
      3. UserCode.main()调用Extension.present()。这会触发编译时错误,因为ExtensionMissing不包含此方法。
      4. 现在有趣的部分......在UserCode项目中,在ExtensionPresent之后添加MyLibrary作为依赖项。
      5. 我不再收到编译器错误(该方法现在在编译时出现)。
      6. 当我尝试调用UserCode.main()时,我得到:
      7. --- exec-maven-plugin:1.6.0:exec (default-cli) @ mavenproject3 ---
        Exception in thread "main" java.lang.NoSuchMethodError: dummy.Extension.present()V
        

        这是我的项目配置,Maven的实施或JDK工具中的错误吗?

        (侧面说明,我这样做是为了解决:Implementing a (compile-time) plugin architecture without split packages

        更新:这是一个可执行的测试用例:https://github.com/cowwoc/exec-maven-plugin-class-shadowing

1 个答案:

答案 0 :(得分:0)

当我启用调试日志记录时,我看到插件触发了以下命令:

  • compiler-maven-plugin正在调用:javac -d ~/UserCode/target/classes -classpath ~/UserCode/target/classes: --module-path ~/.m2/repository/ExtensionPresent/1.0-SNAPSHOT/ExtensionPresent-1.0-SNAPSHOT.jar:~/.m2/repository/MyLibrary/1.0-SNAPSHOT/MyLibrary-1.0-SNAPSHOT.jar:~/.m2/repository/ExtensionMissing/1.0-SNAPSHOT/ExtensionMissing-1.0-SNAPSHOT.jar: -sourcepath ~/UserCode/src/main/java:~/UserCode/target/generated-sources/annotations: -s ~/UserCode/target/generated-sources/annotations -g -nowarn -target 9 -source 9 -encoding UTF-8
  • maven-exec-plugin正在调用java, --module-path, ~/UserCode/target/classes:~/.m2/repository/MyLibrary/1.0-SNAPSHOT/MyLibrary-1.0-SNAPSHOT.jar:~/.m2/repository/ExtensionMissing/1.0-SNAPSHOT/ExtensionMissing-1.0-SNAPSHOT.jar:~/.m2/repository/ExtensionPresent/1.0-SNAPSHOT/ExtensionPresent-1.0-SNAPSHOT.jar, -m, UserCode/com.usercode.Main]

这让我相信maven-exec-plugin以错误的顺序列出了依赖项。我尝试手动调用应用程序,交换依赖项的顺序,确定程序运行。

我针对maven-exec-plugin提交了bug report

我针对maven-compiler-plugin提交了第二个bug report,因为它似乎也将错误的顺序传递给javac,具体取决于项目目录的名称(奇数但是真实)。