Java 9中的拆分包和引导jar
在Java 9中,似乎不允许有所谓的拆分包,即在两个不同的模块中定义相同的包。这导致我的迁移过程出现问题:(Gradle)项目包含一个名为Java 9中的拆分包和引导jar,java,bootstrapping,java-9,java-module,Java,Bootstrapping,Java 9,Java Module,在Java 9中,似乎不允许有所谓的拆分包,即在两个不同的模块中定义相同的包。这导致我的迁移过程出现问题:(Gradle)项目包含一个名为bootstrap.Jar的Jar文件,其结构如下: bootstrap.jar - com - example - Foo.class - Bar.class - Baz.class Bar.java -> Foo.dyvil -> Baz.java src目录包含一个依赖于Foo的类com.example.Bar
bootstrap.Jar
的Jar文件,其结构如下:
bootstrap.jar
- com
- example
- Foo.class
- Bar.class
- Baz.class
Bar.java -> Foo.dyvil -> Baz.java
src
目录包含一个依赖于Foo
的类com.example.Bar
,以及com.example
的模块定义。bootstrap.jar
文件不包含模块信息,因为它是在Java9之前编译的,所以它使用一个名为bootstrap
的自动模块。问题是现在包com.example
在两个模块com.example
和bootstrap
中都定义了
首先,存在这个bootstrap.jar
文件的原因如下:
src/com/example
文件夹实际上包含Bar.java
、Baz.java
和另一个文件Foo.dyvil
。后者是用基于JVM的编程语言编写的。因此,依赖关系链如下所示:
bootstrap.jar
- com
- example
- Foo.class
- Bar.class
- Baz.class
Bar.java -> Foo.dyvil -> Baz.java
在构建过程中,它被编译成Foo.class
,并被放入一个新的Jar文件中,该文件稍后将替换bootstrap.Jar
。放置所有这些文件的原因是Java和Dyvil编译器都无法处理其他语言文件,因此它们需要对先前构建中编译的类进行一些访问。这就是为什么会有bootstrap.jar
现在来看实际问题:既然在Java9中不允许拆分包,那么有没有办法使用我的项目中描述和使用的“引导”jar文件来实现“拆分构建”?或者还有其他方法吗?尽管解决这一问题的长期解决方案是将这些包解析为存在于单个模块中,然后对代码进行模块化 作为临时解决方案,您可以使用以下选项:-
--patch-module <module>=<file>(<pathsep><file>)*
请记住,
--patch module
选项仅用于测试和调试。强烈反对在生产设置中使用它。我想这是可以的,因为bootstrap.jar
仅用于构建,之后所有包都不再拆分。我假设我必须在gradle中添加这些选项作为编译器参数,但我如何在IntelliJ中使用此选项?编辑运行配置中的gradle和VM选项也是如此,您可以在IntelliJ中使用它们。但是我如何设置它,以便IntelliJ build也使用此选项?@Clashsoft我希望我在前面的评论中也回答了这个问题。要通过intelliJ构建它,您可以编辑和配置运行。