当模块导出修补包时,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系统”。您可能已经在那里看到了我的功能请求()。