3

似乎在 Java 9 中不允许有所谓的拆分包,即在两个不同的模块中定义同一个包。这导致我的迁移过程出现问题:(Gradle)项目包含一个名为 的 Jar 文件,bootstrap.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.example并且bootstrap.

首先,有这个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 文件来实现“拆分构建”?或者还有其他方法吗?

4

1 回答 1

3

尽管解决此问题的长期解决方案是将此类包解析为存在于单个模块中,然后将代码模块化。

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

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

就像你的情况

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

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

于 2017-10-06T19:28:00.957 回答