Java 9中的拆分包和引导程序包

时间:2017-10-06 19:16:07

标签: java bootstrapping java-9 java-module

似乎在Java 9中不允许使用所谓的Split Packages,即在两个不同的模块中定义相同的包。这导致我的迁移过程出现问题:(Gradle)项目包含一个名为bootstrap.jar的Jar文件,其结构如下:

bootstrap.jar
- com
  - example
    - Foo.class
    - Bar.class
    - Baz.class

src目录包含com.example.Bar的类Foo以及com.example的模块定义。 bootstrap.jar文件不包含模块信息,因为它是在Java 9之前编译的,因此它使用名为bootstrap的自动模块。问题是,现在包com.example已在两个模块com.examplebootstrap中定义。

首先有这个bootstrap.jar文件的原因如下:

src/com/example文件夹实际上包含Bar.javaBaz.java和另一个文件Foo.dyvil。后者是用基于JVM的编程语言编写的。所以依赖链看起来像这样:

Bar.java -> Foo.dyvil -> Baz.java

在构建过程中,它被编译为Foo.class,它被放置在一个新的Jar文件中,该文件稍后将替换bootstrap.jar。放置所有这些文件的原因是Java和Dyvil编译器都无法处理其他语言文件,因此它们需要访问先前构建的已编译类。这就是为什么有bootstrap.jar

现在针对实际问题:由于Java 9中不允许使用拆分包,有没有办法使用我的项目中描述和使用的“bootstrap”jar文件来实现“拆分构建”?或者还有其他方法吗?

1 个答案:

答案 0 :(得分:3)

虽然长期解决方案是将这些软件包解析为存在于单个模块中,然后将代码模块化。

作为临时解决方案,您可以使用以下选项: -

--patch-module <module>=<file>(<pathsep><file>)*

就像你的情况一样

--patch-module com.example=bootstrap.jar

请记住, --patch-module选项仅用于测试和调试。强烈建议不要在生产环境中使用它。