当模块导出修补包时,java抛出InvalidModuleDescriptorException
当模块导出修补包时,java抛出InvalidModuleDescriptorException,java,java-9,java-10,java-module,java-platform-module-system,Java,Java 9,Java 10,Java Module,Java Platform Module System,java10.0.2+13在模块路径目录中的module info.class导出不在同一目录下的包时,抛出java.lang.module.InvalidModuleDescriptorException 在许多情况下,这是明智的行为,但在我的情况下,我将包放在另一个目录下,该目录使用--patch module将其修补到相关模块中 示例: 模块m在文件classes/m/Module info.class中定义 m导出包p module info.class是目录classes/m的唯一子目
java
10.0.2+13在模块路径目录中的module info.class
导出不在同一目录下的包时,抛出java.lang.module.InvalidModuleDescriptorException
在许多情况下,这是明智的行为,但在我的情况下,我将包放在另一个目录下,该目录使用--patch module
将其修补到相关模块中
示例:
模块m
在文件classes/m/Module info.class
中定义
m
导出包p
module info.class
是目录classes/m
的唯一子目录
目录classes/patch
包含p/Main.class
简化命令行:
java --module-path classes/m --patch-module m=classes/patch --module m/p.Main
上面将抛出一个java.lang.module.InvalidModuleDescriptorException
,它表示“在模块中找不到包p”
有没有办法让
java
不抛出InvalidModuleDescriptorException
,而不必将class
文件从classes/m
&classes/patch
复制到同一个目录或同一个jar
文件中?您可以共享您的项目结构吗。。。原因是什么?我正在开发一个Gradle插件来支持JPMS模块,所以我尝试支持许多项目结构。我之所以进行修补,是因为Kotlin编译到一个目录,Java编译到另一个目录。运行Java
(例如Test
,JavaExec
)的现有Gradle任务
使用编译任务的输出目录,而不是JAR,我希望尽可能不修改它们的行为。如果我不能通过一些java
参数来防止这个异常,我可能只会依赖jar
任务的jar
输出,而不是编译任务的目录输出。修补是复杂的,实现要求未修补的模块在修补之前不存在完整性问题。在这种情况下,模块声明导出p,但未修补模块中没有包p。我很好奇您是如何来到这里的,因为它应该在编译时失败。在任何情况下,唯一的解决方法是在class/m/p中放置占位符/虚拟资源,以便包集与编译模块中的导出相匹配。@AlanBateman,谢谢。我假设JBS是“Java Bug系统”。您可能已经在那里看到了我的功能请求()。