亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Eclipse 被導入所混淆(“可從多個模塊訪問”)

Eclipse 被導入所混淆(“可從多個模塊訪問”)

幕布斯6054654 2022-09-28 10:01:01
引用簡單的.jar文件時,Eclipse 會顯示一個錯誤,指出:可以從多個模塊訪問 java.awt 包:<未命名>,java.桌面例如,當 或 包含在.jar文件中時,就會發生這種情況。javax.awtjavax.swing最簡單的示例如下:package test;import javax.swing.JDialog;public class Test {    public static void main(String[] args) {        new JDialog();    }}將.jar文件添加到僅具有文件夾結構(不需要文件)的類路徑將導致出現錯誤。我使用的是JDK 10/12(兩者都不起作用)。設置編譯器合規性以使整個事情再次工作。在另一臺計算機上,此工作與編譯器合規性設置為 。javax/swing1.8Eclipse 2018-0910我在Eclipse上,在一個(出于測試目的)新安裝的,它工作正常。為什么?2019-03Eclipse 2018-09編輯2020年6月(解決方案)正如答案正確指出的那樣,這是很久以前在Java中內置的限制,直到最近才強加給我們。我在將一個具有數十個依賴項的大項目遷移到Maven時接觸到了它。有2000年左右的圖書館!有“元庫”,它由幾個打包在一起的庫組成。因此,除了確定仍然需要什么(與其他庫一起進入垃圾箱!),更新違反規則的庫或找到它們的替代品之外,沒有其他方法。這花了我很多很多個小時。最后,它成功了,我們有一個不錯的Maven項目可以合作。
查看完整描述

4 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

這是由以下原因引起的

  • 類路徑上的 JAR,其中包含系統庫中也存在的,但java.awt

  • JRE 系統庫位于模塊路徑

在 Java 平臺模塊系統 (JPMS) 中,不允許在多個模塊中使用相同的包。如果使用模塊路徑類路徑,則類路徑上的所有內容都將作為模塊進行處理(在您的情況下,包存在于系統模塊中,并且還通過模塊中類路徑上的 JAR 進行處理)。<unnamed>java.awtjava.desktop<unnamed>

由于 JRE 系統庫無法從模塊路徑移動到類路徑(有關詳細信息,請參閱斯蒂芬·赫爾曼的此答案),因此您只能選擇以下選項:

  • 將編譯器合規性設置為 1.8(如前所述)

  • 重新構建 JAR 以避免 JAR 中的 Java 系統庫包名稱(如果使用反射,則可能需要進行其他代碼更改):

    • 如果您有源代碼,請更改軟件包名稱(例如,將軟件包和子軟件包更改為 和 )并重新創建 JARjavajava_utiljavaxjavax_util

    • 如果您只有文件,則必須先反編譯文件.class.class


查看完整回答
反對 回復 2022-09-28
?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

由于我敢打賭很多人會在模塊化Java中遇到這個問題,所以我會提供幫助并給出真正的答案。

此錯誤發生在以下情況下

  • 您的項目中有依賴項

  • 包含代碼

  • 使用包

  • 也在模塊中

  • 被您的項目引用

如果您的項目已將源代碼兼容性設置為類似于 Java 12 的內容,它將開始強制執行該規則,該規則在 Java 中一直存在:

“不要在自己的代碼中使用屬于 JDK 的包。

不幸的是,多年來,許多開發人員和供應商都這樣做了。不能再那樣做了。

如果您將項目設置為 Java 12 源代碼兼容性,Eclipse 會添加 JDK 模塊,其中包括所有“java.*”和“javax.*”,甚至“jdk.*”、“org.w3c.*”。這些包可能正由依賴項或其傳遞依賴項使用。

如何修復

您需要:

  • 看看它抱怨的是哪個包裹

  • 并展開包資源管理器中的“項目和外部依賴項”節點。

  • 找出哪個依賴項正在使用該包。

  • 然后,您只需從項目中排除該依賴項即可。

或者,您可以獲取該依賴項的源代碼(如果可用),并使用更改的包重新生成 jar。否則,您必須刪除該依賴關系并找到該技術的替代品。疼吧?

如果它是一個可傳遞的依賴項,您通??梢詫⑵渑懦?。以下是基于 Gradle 的項目的示例。

GradleConfig.xml

configurations {
   all*.exclude group: 'xml-apis'}


查看完整回答
反對 回復 2022-09-28
?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

在我的情況下,這是因為我在POM.xml文件中包含了一個依賴項(阿帕奇蒂卡)。


我不得不強制排除在該依賴項導入時包含錯誤的類的模塊:


    <dependency>

        <groupId>org.apache.tika</groupId>

        <artifactId>tika-parsers</artifactId>

        <version>1.24.1</version>

        <exclusions>

            <exclusion>

                <groupId>xml-apis</groupId>

                <artifactId>xml-apis</artifactId>

            </exclusion>

        </exclusions>

    </dependency>

它以這種方式為我工作。


查看完整回答
反對 回復 2022-09-28
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

我認為我對這個問題的了解可能是有用的。

對于 下類,我得到了此錯誤,這些類由依賴于 、 或 等工件的舊 Maven 項目提供。javax.xml.streamxml-apisstax-apigeronimo-stax-api

從技術上講,問題在于其他人已經說過的:這些工件在沒有意識到Java模塊的情況下公開了包(它們是后來發明的),因此包會自動轉到未命名的模塊,這與JDK最新版本中包含的相同包沖突,其中這些包具有自己的模塊名稱(因此相同的包導致兩個不同的模塊, 這是被禁止的。javax.xml.*

也就是說,實際的解決方案本質上是使用 Maven 排除項,從項目中刪除這些依賴項,并讓它改用 JDK 版本。如果您使用的是其他構建系統,請使用等效項。

從理論上講,JDK提供的這些軟件包的最新風格可能是不向后兼容的,在實踐中,我懷疑這些JSR規范多年來變化很大,到目前為止,我還沒有看到它們的替代品出現任何問題。


查看完整回答
反對 回復 2022-09-28
  • 4 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號