4 回答

TA貢獻1812條經驗 獲得超5個贊
這是由以下原因引起的
類路徑上的 JAR,其中包含系統庫中也存在的包,但
java.awt
JRE 系統庫位于模塊路徑上
在 Java 平臺模塊系統 (JPMS) 中,不允許在多個模塊中使用相同的包。如果使用模塊路徑和類路徑,則類路徑上的所有內容都將作為模塊進行處理(在您的情況下,包存在于系統模塊中,并且還通過模塊中類路徑上的 JAR 進行處理)。<unnamed>
java.awt
java.desktop
<unnamed>
由于 JRE 系統庫無法從模塊路徑移動到類路徑(有關詳細信息,請參閱斯蒂芬·赫爾曼的此答案),因此您只能選擇以下選項:
將編譯器合規性設置為 1.8(如前所述)
重新構建 JAR 以避免 JAR 中的 Java 系統庫包名稱(如果使用反射,則可能需要進行其他代碼更改):
如果您有源代碼,請更改軟件包名稱(例如,將軟件包和子軟件包更改為 和 )并重新創建 JAR
java
java_util
javax
javax_util
如果您只有文件,則必須先反編譯文件
.class
.class

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'}

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>
它以這種方式為我工作。

TA貢獻1796條經驗 獲得超10個贊
我認為我對這個問題的了解可能是有用的。
對于 下類,我得到了此錯誤,這些類由依賴于 、 或 等工件的舊 Maven 項目提供。javax.xml.stream
xml-apis
stax-api
geronimo-stax-api
從技術上講,問題在于其他人已經說過的:這些工件在沒有意識到Java模塊的情況下公開了包(它們是后來發明的),因此包會自動轉到未命名的模塊,這與JDK最新版本中包含的相同包沖突,其中這些包具有自己的模塊名稱(因此相同的包導致兩個不同的模塊, 這是被禁止的。javax.xml.*
也就是說,實際的解決方案本質上是使用 Maven 排除項,從項目中刪除這些依賴項,并讓它改用 JDK 版本。如果您使用的是其他構建系統,請使用等效項。
從理論上講,JDK提供的這些軟件包的最新風格可能是不向后兼容的,在實踐中,我懷疑這些JSR規范多年來變化很大,到目前為止,我還沒有看到它們的替代品出現任何問題。
添加回答
舉報