【问题标题】:java 9 unnamed module reads package [X] from both ... while debugging (with IntelliJ)java 9 未命名模块在调试时从两者中读取包 [X](使用 IntelliJ)
【发布时间】:2018-09-01 21:21:21
【问题描述】:

在我的项目中,我有一个使用多个第三方库的包。我们来看看依赖树:

[INFO] +- commons-logging:commons-logging:jar:1.2:compile
[INFO] +- org.apache.directory.studio:org.apache.commons.collections:jar:3.2.1:compile
[INFO] |  \- commons-collections:commons-collections:jar:3.2.2:compile
[INFO] +- xerces:xercesImpl:jar:2.11.0:compile
[INFO] |  \- xml-apis:xml-apis:jar:1.4.01:compile
[INFO] +- org.apache.cxf:cxf-rt-bindings-soap:jar:3.2.2:compile
[INFO] |  +- org.apache.cxf:cxf-core:jar:3.2.2:compile
[INFO] |  |  +- com.fasterxml.woodstox:woodstox-core:jar:5.0.3:compile
[INFO] |  |  |  \- org.codehaus.woodstox:stax2-api:jar:3.1.4:compile
[INFO] |  |  \- org.apache.ws.xmlschema:xmlschema-core:jar:2.2.3:compile
[INFO] |  +- org.apache.cxf:cxf-rt-wsdl:jar:3.2.2:compile
[INFO] |  |  +- wsdl4j:wsdl4j:jar:1.6.3:compile
[INFO] |  |  \- org.ow2.asm:asm:jar:5.2:compile
[INFO] |  \- org.apache.cxf:cxf-rt-databinding-jaxb:jar:3.2.2:compile
[INFO] +- org.apache.wss4j:wss4j-ws-security-common:jar:2.2.1:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.7.22:compile
[INFO] |  +- org.apache.santuario:xmlsec:jar:2.1.1:compile
[INFO] |  |  \- commons-codec:commons-codec:jar:1.10:compile
[INFO] |  +- org.opensaml:opensaml-saml-impl:jar:3.3.0:compile
[INFO] |  |  +- org.opensaml:opensaml-profile-api:jar:3.3.0:compile
[INFO] |  |  |  \- org.opensaml:opensaml-core:jar:3.3.0:compile
[INFO] |  |  |     \- io.dropwizard.metrics:metrics-core:jar:3.1.2:compile
[INFO] |  |  +- org.opensaml:opensaml-saml-api:jar:3.3.0:compile
[INFO] |  |  |  +- org.opensaml:opensaml-xmlsec-api:jar:3.3.0:compile
[INFO] |  |  |  \- org.opensaml:opensaml-soap-api:jar:3.3.0:compile
[INFO] |  |  +- org.opensaml:opensaml-security-impl:jar:3.3.0:compile
[INFO] |  |  |  \- org.opensaml:opensaml-security-api:jar:3.3.0:compile
[INFO] |  |  |     +- org.cryptacular:cryptacular:jar:1.1.1:compile
[INFO] |  |  |     \- org.bouncycastle:bcprov-jdk15on:jar:1.55:compile
[INFO] |  |  +- org.opensaml:opensaml-xmlsec-impl:jar:3.3.0:compile
[INFO] |  |  \- net.shibboleth.utilities:java-support:jar:7.3.0:compile
[INFO] |  |     +- com.google.guava:guava:jar:19.0:compile
[INFO] |  |     \- joda-time:joda-time:jar:2.7:compile
[INFO] |  +- org.opensaml:opensaml-xacml-impl:jar:3.3.0:compile
[INFO] |  |  \- org.opensaml:opensaml-xacml-api:jar:3.3.0:compile
[INFO] |  +- org.opensaml:opensaml-xacml-saml-impl:jar:3.3.0:compile
[INFO] |  |  \- org.opensaml:opensaml-xacml-saml-api:jar:3.3.0:compile
[INFO] |  +- org.jasypt:jasypt:jar:1.9.2:compile
[INFO] |  \- org.apache.geronimo.javamail:geronimo-javamail_1.4_mail:jar:1.8.4:compile
[INFO] +- org.apache.wss4j:wss4j-ws-security-dom:jar:2.2.1:compile
[INFO] |  \- net.sf.ehcache:ehcache:jar:2.10.4:runtime
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.22:compile
[INFO] +- log4j:log4j:jar:1.2.17:compile
[INFO] \- org.testng:testng:jar:6.11:test
[INFO]    +- com.beust:jcommander:jar:1.64:test
[INFO]    \- org.yaml:snakeyaml:jar:1.17:test

目前编译运行正常。

但是当我开始使用 IntelliJ 进行调试时,我会得到一个包含 100 多个错误的列表,例如:

Error:java: the unnamed module reads package org.opensaml.saml.config from both opensaml.saml.api and opensaml.saml.impl
Error:java: the unnamed module reads package javax.xml.datatype from both xml.apis and java.xml
Error:java: the unnamed module reads package javax.xml.transform.dom from both xml.apis and java.xml
....

由于新的 Java 9 模块限制,这似乎是一个错误。但是这里怎么处理呢?

org.opensaml 都是 wss4j-ws-security-common 2.2.1 的一部分(这是最后一个版本,于 2018 年 1 月发布)。 opensaml.saml.api 和 opensaml.saml.impl 是 3.3.0 版本,并且都使用相同版本的 org.opensaml.saml.config。所以???

为什么“mvn compile”通过了,但是用 IntelliJ 调试却失败了?

【问题讨论】:

    标签: java intellij-idea java-9 java-module module-path


    【解决方案1】:

    我的 Java 9 IntelliJ 项目中也有 100 多个相同的“错误:未命名的模块从 xml.apis 和 java.xml 读取包 javax.xml”。

    除非我尝试在 IntelliJ 中运行单元测试时得到它们。从命令行使用 maven 构建和测试一切正常;和你一样。

    我能够让我的错误消失...

    1) 从多模块项目的顶级 pom 中删除以下内容...

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>1.4.01</version>
    </dependency>  
    ...
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>${javaee.api.version}</version>
        <scope>provided</scope>
    </dependency>
    

    2) 在 IntelliJ 的项目导航器中右键单击顶级 pom,然后选择“Maven - Reimport

    3) 从 IntelliJ 菜单执行“Build -> Build module [myModule]”。

    只需找出哪些 Maven 工件包含在您的 100 多条“错误” 消息中列出的包。然后将它们注释掉。重新导入。然后从菜单中“构建模块”。无论如何,这对我有用。

    我从 pom 中删除的工件是从我用作模板的另一个项目推测性地复制/粘贴到那里的。但幸运的是,我不需要它们中的任何一个。

    【讨论】:

      【解决方案2】:

      这是一个已知的 IDEA 错误。请投票给https://youtrack.jetbrains.com/issue/IDEA-171320

      【讨论】:

        猜你喜欢
        • 2017-11-11
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        相关资源
        最近更新 更多