在Java 9中,似乎不允许有所谓的拆分包,即在两个不同的模块中定义相同的包。这会导致我的迁移过程出现问题:(Gradle)项目包含一个名为bootstrap.jar的Jar文件,其结构如下:
bootstrap.jar
- com
- example
- Foo.class
- Bar.class
- Baz.classsrc目录包含一个依赖于Foo的类com.example.Bar以及一个用于com.example的模块定义。bootstrap.jar文件不包含模块信息,因为它是在Java9之前编译的,所以它使用一个名为bootstrap的自动模块。问题是现在在com.example和bootstrap这两个模块中都定义了com.example包。
首先,存在此bootstrap.jar文件的原因如下:
src/com/example文件夹实际上包含Bar.java、Baz.java和另一个文件Foo.dyvil。后者是用基于JVM的编程语言编写的。因此,依赖关系链如下所示:
Bar.java -> Foo.dyvil -> Baz.java在构建过程中,它被编译成Foo.class,放在一个新的Jar文件中,该文件稍后将替换bootstrap.jar。放置所有这些文件的原因是,Java和Dyvil编译器都无法处理其他语言的文件,因此它们需要对以前构建的已编译类进行一些访问。这就是为什么有bootstrap.jar的原因。
现在来看实际问题:由于Java 9中不允许拆分包,有没有办法使用我的项目中描述和使用的"bootstrap“jar文件来实现”拆分构建“?或者还有其他方法吗?
发布于 2017-10-07 03:28:01
不过,长期的解决方案是将这些包解析为存在于单个模块中,然后模块化代码。
作为临时解决方案,您可以使用以下选项:-
--patch-module <module>=<file>(<pathsep><file>)*就像你的情况一样
--patch-module com.example=bootstrap.jar但是请记住,--patch-module选项仅用于测试和调试。强烈建议在生产环境中使用它。
https://stackoverflow.com/questions/46612514
复制相似问题