【问题标题】:Split Packages and Bootstrap Jars in Java 9在 Java 9 中拆分包和引导 Jar
【发布时间】:2017-10-06 19:16:06
【问题描述】:

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

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

src 目录包含一个依赖于Foo 的类com.example.Bar 以及一个用于com.example 的模块定义。 bootstrap.jar 文件不包含模块信息,因为它是在 Java 9 之前编译的,因此它使用了一个名为 bootstrap 的自动模块。问题是现在包 com.examplecom.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 文件来实现“拆分构建”?还是有其他方法?

【问题讨论】:

    标签: java bootstrapping java-9 java-module


    【解决方案1】:

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

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

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

    你的情况

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

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

    【讨论】:

    • 我想这没关系,因为bootstrap.jar 仅用于构建,之后所有的包都不再拆分
    • 我假设我必须将这些选项作为编译器参数添加到 gradle 中,但是如何在 IntelliJ 中使用它?
    • True for gradle and VM options in Edit run configurations 是您可以在 intelliJ 中使用它们的地方。
    • 但是如何设置它以便 IntelliJ build 也使用此选项?
    • @Clashsoft 我希望我在之前的评论中也回答了这个问题。要通过 intelliJ 构建它,您可以编辑和配置运行。
    猜你喜欢
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2016-09-07
    • 2010-09-29
    相关资源
    最近更新 更多