[英]Java 9 + Maven: What happens if two dependencies export the same module?
我正在尝试调用Java方法的java.lang.NoSuchMethodError
。 据我所知,类路径在编译时和运行时是相同的,因此不应该发生此错误。
Repro步骤:
创建4个Maven项目:
模块ExtensionPresent
和ExtensionMissing
导出相同的模块名称。
ExtensionMissing
导出:
package dummy;
public class Extension {}
ExtensionPresent
导出: package dummy;
public class Extension {
public static void present() {
System.out.println("Extension present!");
}
}
MyLibrary
ExtensionMissing
声明为依赖项。 UserCode
MyLibrary
声明为依赖项。 UserCode.main()
调用Extension.present()
。 这会触发编译时错误,因为ExtensionMissing
不包含此方法。 UserCode
项目中,在MyLibrary
之后添加ExtensionPresent
作为依赖项。 UserCode.main()
我得到: --- exec-maven-plugin:1.6.0:exec (default-cli) @ mavenproject3 ---
Exception in thread "main" java.lang.NoSuchMethodError: dummy.Extension.present()V
这是我的项目配置,Maven的实现还是JDK工具中的错误?
(另一方面,我这样做是为了解决: 实现一个(编译时)插件架构而没有拆分包 )
更新 :这是一个可执行的测试用例: https : //github.com/cowwoc/exec-maven-plugin-class-shadowing
当我启用调试日志记录时,我看到插件触发了以下命令:
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的错误报告 。
我提交了针对maven-compiler-plugin的第二个bug报告 ,因为它似乎也将错误的命令传递给javac
具体取决于项目目录的名称(奇数但是真实)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.