gpt4 book ai didi

intellij-idea - 在 IntelliJ 上消除 Java 9 拆分包错误

转载 作者:行者123 更新时间:2023-12-04 19:28:26 25 4
gpt4 key购买 nike

我有一个 JDK 9 项目。运行时mvn install ,一切正常。将 IntelliJ 2017.2.6 与 JDK 9.0.4 一起使用时,我出现了
由于拆分包而导致数十个编译错误。例如,在我的 POM 中,我设置了对 org.apache.solr:solr-core:7.2.1 的依赖项。 . IntelliJ 显示的错误之一是:

Error:java: module solr.core reads package org.apache.lucene.search from both lucene.misc and lucene.sandbox

IntelliJ 发出编译错误的原因是:
  • solr-core对工件有 Maven 依赖关系 lucene-misclucene-sandbox
  • 两个lucene-misc.jarlucene-sandbox.jar在包 org.apache.lucene.search 中定义类
  • IntelliJ 认为 lucene-misc.jarlucene-sandbox.jar是 JDK 9 模块(事实上,它们不是模块,它们没有 module-info.java 文件)。由于两个 JDK 9 模块不能参与同一个包,IntelliJ 会发出编译错误。

  • 相比之下,Maven 编译器插件没有错误,因为它认为 lucene-misc.jarlucene-sandbox.jar作为属于
    类路径,而不是模块路径。

    我显然不想重新打包 Lucene 的东西。

    所以我的问题归结为以下几点:如何使 IntelliJ 错误静音 Error:java: module Mod1 reads package P from both Mod2 and Mod3 ?

    最佳答案

    [短]

    如果您想从模块代码运行您的应用程序,这是不可能的。您必须将依赖于碰撞 JAR 的代码迁移到非模块代码,并将碰撞 jar 添加到类路径中。 (如评论中所建议)

    【长】

    Intellij 在幕后尝试运行 JVM,因此 Intellij 只有在 JVM 可以运行的情况下才能运行您的应用程序。

    当您从模块 jar 运行应用程序时,这意味着您从命名模块运行应用程序。该模块必须要求其所有依赖项,这些依赖项应该是名称模块。请注意,即使是从您的非模块 JAR 创建的自动模块也确实被命名。
    Java 9 不允许拆分包,因为配置可靠,只有未命名的模块除外。

    使其工作的唯一方法是将碰撞 jar 移动到未命名的模块,但是 named module cannot depend on unnamed module

    A named module cannot, in fact, even declare a dependence upon the unnamed module. This restriction is intentional, since allowing named modules to depend upon the arbitrary content of the class path would make reliable configuration impossible.



    因此,如果您不想重新打包碰撞 jar,则必须将需要碰撞 jar 的模块移动到非模块 jar。

    你的 maven 插件用它完成了,因为正如@Nicolai 所说:

    Maven places them on the class path (where split packages don't matter), whereas IntelliJ places them on the module path (leading to the problems you observe).



    另见 this answer关于从非模块代码运行应用程序。

    关于intellij-idea - 在 IntelliJ 上消除 Java 9 拆分包错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48871059/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com