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

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

無法使用 Gradle 編譯 Java 庫,可與 IDE 一起使用

無法使用 Gradle 編譯 Java 庫,可與 IDE 一起使用

慕婉清6462132 2022-05-25 10:15:30
當我嘗試通過 Gradle構建項目時遇到了一個奇怪的問題。當我將項目導入 IntelliJ 并通過 IDE 構建/運行測試時,構建工作正常。但是,如果我運行./gradlew test,則構建失敗并且無法解析 JDK 中的符號(如GenericArrayType)。如果我將 IntelliJ 的構建/運行操作委托給 Gradle,我也會在我的 IDE 中看到同樣的問題,所以我的 Gradle 構建似乎有問題,我不知道是什么。其他項目工作正常,所以這似乎是這個特定項目的問題。我已經在不同的機器(一臺運行 Ubuntu 和另一臺運行 macOS)以及不同的 Gradle 版本(4.10.2, 5.1.1)上嘗試過這個,但問題仍然存在。我將源代碼復制并粘貼到另一個已經完美運行的項目中,然后當我運行單元測試時它也開始失敗并出現相同的錯誤。有人可以幫我弄清楚這里出了什么問題嗎?這是我的settings.gradle樣子:rootProject.name = 'types'并且build.gradle:group 'com.vinaysshenoy'version '1.0.0'buildscript {  ext.junit_version = '4.12'  ext.assertj_version = '3.11.1'  ext.jsr305_version = '3.0.2'  repositories {    mavenCentral()  }}apply plugin: 'java-library'java {  sourceCompatibility JavaVersion.VERSION_1_8  targetCompatibility JavaVersion.VERSION_1_8}repositories {  mavenCentral()}dependencies {  implementation "com.google.code.findbugs:jsr305:$jsr305_version"  testImplementation "junit:junit:$junit_version"  testImplementation "org.assertj:assertj-core:$assertj_version"}
查看完整描述

3 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

為了構建項目,請使用完全限定名稱來實現定義的靜態嵌套類的接口com.vinaysshenoy.types.util.Util:


  public static final class ParameterizedTypeImpl implements java.lang.reflect.ParameterizedType { ... }


  public static final class GenericArrayTypeImpl implements java.lang.reflect.GenericArrayType { ... }


  public static final class WildcardTypeImpl implements java.lang.reflect.WildcardType { ... }

此外,如果您不想使用完全限定名稱,則只需將靜態嵌套類提取到頂層即可。


筆記:


當使用JDK編譯器時,項目編譯沒有錯誤:

javac -cp path_to_jsr305-3.0.2.jar -d bin src/main/java/com/vinaysshenoy/types/Types.java src/main/java/com/vinaysshenoy/types/util/Util.java

這個問題似乎與平臺有關。我嘗試在 Windows 10/Oracle JDK 1.8.0_111 上構建項目 - 沒有發現任何問題。但是,該問題完全按照 Ubuntu 16.04/Oracle JDK 1.8.0_201 和 Ubuntu 16.04/OpenJDK 1.8.0_191 上的描述重現。


查看完整回答
反對 回復 2022-05-25
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

解決方案

@Zgurskyi 的回答是一個很好的解決方法,但是,我相信它只能解決實際問題的癥狀(見下文)。這是解決根本問題的另一種恕我直言的更清潔方法:導入com.vinaysshenoy.types.util.Utilfrom com.vinaysshenoy.types.Types non-static的嵌套類型:


diff --git a/src/main/java/com/vinaysshenoy/types/Types.java b/src/main/java/com/vinaysshenoy/types/Types.java

index e3a44d8..92ac237 100644

--- a/src/main/java/com/vinaysshenoy/types/Types.java

+++ b/src/main/java/com/vinaysshenoy/types/Types.java

@@ -17,9 +17,9 @@ package com.vinaysshenoy.types;



 import static com.vinaysshenoy.types.util.Util.EMPTY_TYPE_ARRAY;

-import static com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;

-import static com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;

-import static com.vinaysshenoy.types.util.Util.WildcardTypeImpl;

+import com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;

+import com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;

+import com.vinaysshenoy.types.util.Util.WildcardTypeImpl;

 import static com.vinaysshenoy.types.util.Util.getGenericSupertype;

 import static com.vinaysshenoy.types.util.Util.resolve;

(順便說一句,除了@Zgurskyi,我還可以通過手動javac調用來重現它。我只安裝了一個JDK;也許命令行上的@Zgurskyijavac不是來自Gradle 使用的同一個JDK。)

實際問題

您靜態導入嵌套類(不僅僅是類成員),盡管這永遠不是必需的。我實際上很驚訝這似乎通常有效,但顯然一些 Java 編譯器在某些情況下至少會窒息它。

在您的情況下,Gradle 使用的 Java 編譯器在以下情況下無法正確解析導入(只是對編譯器所做工作的粗略、不是非常技術性的描述):

  1. 在處理 時com.vinaysshenoy.types.util.Util,編譯器會找到 的靜態導入com.vinaysshenoy.types.Types.arrayOf,因此編譯器會查看com.vinaysshenoy.types.Types該類。

  2. com.vinaysshenoy.types.Types具有 的靜態導入com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl,因此編譯器會查看嵌套GenericArrayTypeImpl類。

  3. com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl使用 ( java.lang.reflect.GenericArrayType,但是,此時尚未處理該類型的導入,這會導致“找不到符號”錯誤。

可以說,它也可以被認為是一個 JDK 錯誤,它適用于某些編譯器,但不適用于其他編譯器。


查看完整回答
反對 回復 2022-05-25
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

我檢查了您的項目,并且可以使用gradlew clean build.

我假設gradle 找不到 JDK 安裝,因為

  • 未安裝 JDK(IDE 通常帶有自己的捆綁安裝),或者

  • 環境變量未正確設置(設置并將其JAVA_HOME指向您的 JDK 安裝目錄)。


查看完整回答
反對 回復 2022-05-25
  • 3 回答
  • 0 關注
  • 251 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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