【问题标题】:The package com.google.inject is accessible from more than one modulecom.google.inject 包可以从多个模块访问
【发布时间】:2019-03-05 00:34:17
【问题描述】:

我正在尝试将应用程序从 Java 8 升级到 Java 11.0.2。所以这是我使用 Jigsaw 模块的第一步!

我的应用程序使用 GuiceAssistedinjectThrowingproviders 扩展。

这是我目前的module-info.java

`

module com.example.mymodule {

    requires com.google.guice;
    requires com.google.guice.extensions.assistedinject;
    requires com.google.guice.extensions.throwingproviders;

    //...
}


`

该应用程序基于 Maven,当我运行 mvn package 时,我没有收到任何错误。但是在 Eclipse (2018-12) 中,我有这个错误“`包 com.google.inject 可以从多个模块访问”:

我尝试在module-info.java 中评论每个必需的模块,但我显然需要它们中的三个。

我能做些什么来消除这个错误吗?还是这是一个 Eclipse 错误?

这是我的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>example</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.7</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>commons-validator</groupId>
            <artifactId>commons-validator</artifactId>
            <version>1.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-text</artifactId>
            <version>1.6</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.26</version>
        </dependency>

        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>4.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.inject.extensions</groupId>
            <artifactId>guice-throwingproviders</artifactId>
            <version>4.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.inject.extensions</groupId>
            <artifactId>guice-assistedinject</artifactId>
            <version>4.2.2</version>
        </dependency>

    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>11</source>
                        <target>11</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
        </plugins>
    </build>
</project>

这是一个minimal project 来重现我的错误。

这里是a video of the issue(为了清楚起见,请以 1080P 观看!)。

【问题讨论】:

  • 你能显示 pom.xml 的内容吗?
  • @nitind pom.xml 已添加,谢谢。
  • 你能发布更多关于你的 Eclipse 项目是如何设置的吗?我会检查您是否已将 Guice 添加为用户库(等)。如果是这样,Eclipse 可能会在它管理的类路径以及它从 Maven 获得的类路径上看到 Guice。如果他们都指定了 Guice,Eclipse 可能会确定您从多个模块获取 Guice,并且单独运行 mvn 时不会出现相同的错误。
  • @JeffBowman - 我添加了一个最小的项目来重现问题和它的视频!感谢您的帮助。
  • 我无法在 Eclipse 2019-03 的预览版中重现此问题。你能在M3复制它吗?

标签: java eclipse guice java-platform-module-system


【解决方案1】:

Eclipse 使用自己的编译器,在遵循规范方面甚至比 javac 更严格。您在模块信息中需要不同的模块/罐子,它们都使用包 com.google.inject。这是 JPMS 规范中不允许的某种拆分包情况。 AFAIK javac 仅在不同模块的相同包中存在实际类时才会产生错误,但 eclipse 编译器在这里更加挑剔。

有一些解决方案可以解决拆分包问题。如果您没有找到解决问题的较新版本的库(不幸的是,对于今天的大多数依赖项来说这不太可能),您可以 f.e.将模块合并为一个自定义模块,但这当然不是一个完美的解决方案。

有关该问题的更多背景信息,另请参阅 Eclipse can't find XML related classes after switching build path to JDK 10https://bugs.openjdk.java.net/browse/JDK-8215739

【讨论】:

  • 我认为你的答案是正确的。问题是错误的拆分包错误,在 Eclipse 2018-12 中无法正确处理。
【解决方案2】:

我可以在我的机器上重现该错误(相同的 Eclipse 版本,OpenJDK 11),在 Apache NetBeans IDE 10.0 上运行良好。

似乎是 Eclipse 中的一个错误,您应该将其归档here。您已经有一个可以重现错误的最小项目,这很有帮助。

【讨论】:

  • 完成,感谢您的建议。 bugs.eclipse.org/bugs/show_bug.cgi?id=545189我想你的答案是我能得到的最好的答案......如果是这样的话,赏金将是你的。
  • 您可以从该错误链接回此问题。如果有人可以确认这是一个错误(甚至修复它),他们应该得到赏金。
【解决方案3】:

您的测试项目已经在 RC2 4.11(将于 2019 年 3 月 20 日发布)中运行

您可以通过https://download.eclipse.org/eclipse/downloads/drops4/S-4.11RC2-201903070500/下载候选版本

【讨论】:

  • 我确认使用较新版本的 Eclipse 有效!
【解决方案4】:

解决此类问题的更好方法是转到 pom.xml 中的依赖关系层次结构,在那里您可以找到重复的 jar,有时可能很难找到重复的 jar,因为 jar 本身具有 pom 依赖关系和“依赖关系层次结构”将帮助您处理 Maven 问题 `

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 2020-05-13
    • 1970-01-01
    • 2020-07-31
    • 2019-12-08
    • 2019-01-25
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多