簡體   English   中英

IntelliJ 無法識別來自 gradle 項目的某些導入

[英]IntelliJ won't recognize some imports from gradle project

我正在 IntelliJ 中處理 Gradle 項目,但 IntelliJ 無法識別某些包。 當我轉到 Project Structure -> Modules -> <my module> -> Dependencies 時,包含這些包的 jar 文件就在那里。 (我已經用jar tfv <file>檢查了 jar 文件,以確保有問題的類在文件中。)

有問題的類是紅色的,當將鼠標懸停在它們上面時,我收到諸如“無法解析符號‘somepackagename’”或“無法解析符號‘SomeClassName’”之類的錯誤。

但是,gradle 項目從命令行編譯得很好。

我已經嘗試了我能找到的所有現有建議,但到目前為止沒有任何幫助。 首先,我已經嘗試過:

  • 刪除 .idea 文件夾並重新導入
  • 從根 build.gradle 文件重新導入項目
  • 單擊“刷新所有 gradle 項目”按鈕
  • 升級 IntelliJ
  • 單擊“使緩存無效並重新啟動”

我該怎么做才能讓 IntelliJ 識別這些 jar 文件中的包?

我也在多項目 Gradle 構建中遇到了這個問題,它仍然可以用最新的(在撰寫本文時) IntellijIDEA 2020.3.2 看起來像是某種內部緩存問題,因為即使 IDEA 抱怨它無法識別可以成功執行構建的類。

最初我通過使緩存無效並重新啟動 IDEA 來修復它,正如這里所建議的那樣,但后來發現如果我在 Gradle 工具窗口中重新加載項目,它就會消失:

在此處輸入圖片說明

對我來說,它每次都有效。

我有同樣的問題。 我的 IntelliJ 無法識別 build.gradle 中的某些依賴項。 我的猜測是它是一個緩存的東西。 所以我做了以下事情:

  1. 刪除 gradle 緩存目錄。

     rm -rf ~/.gradle/caches
  2. 重新啟動 IntelliJ 並刷新 gradle 依賴項。

這對我有用,似乎是一個簡單的解決方案。

升級后,我剛剛在 Intellij Idea 2019.2.3 上遇到了同樣的問題。 似乎文件 - >“使緩存無效並重新啟動”操作解決了這個問題。

我之前嘗試過的其他操作(重新導入 gradle 項目,刪除 .idea/* 和.ipr/ .iml,重新啟動 intellij)沒有解決問題。

就我而言,

  1. 現有的依賴庫刪除
  2. 漸變刷新!

參考鏈接: https : //youtu.be/0rLZK6hIpm0

確保您確實在正確的位置包含了依賴項

對於 kotlin 示例,在我的 build.gradle.kts 中,我有多個源集,如下所示:

sourceSets{
val jvmTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
            }
        }
        val jsMain by getting {
            dependencies {
                implementation("khttp:khttp:1.0.0")
            }
        }
}

jsMain 將無法訪問 junit,而 jvmTest 將無法訪問 khttp。

簡而言之,如果您有兩個名稱非常相似的源集,那么您就會混淆。

在嘗試了有關此問題的所有不同建議后,似乎可行的是將無法識別的 jar 從我的本地 Gradle 緩存復制到我的項目中的文件夾中。 我還不得不告訴 Gradle 去那里看看。

總之,如果我像這樣更改我的根項目 build.gradle:

allprojects {
    repositories {
        flatDir {
            dirs 'lib'
        }
    }
    ... existing repos ...
}

和子項目的 build.gradle 像這樣:

dependencies {
    ... existing dependencies ...
    compile fileTree(dir: 'lib', include: '*.jar')
}

然后運行以下命令:

jars=($(find /Users/me/.gradle/caches/modules-2/files-2.1/unrecognizedorg/ -name '*.jar'))
for jar in "${jars[@]}" ; do
    cp "$jar" ~/myproject/lib/
done

然后在 IntelliJ 中刷新 Gradle,文件被識別。

當然,然后我遇到了一個問題,即我不想在我的項目中提交一個帶有 jar 的 lib 文件夾,但是有一些方法可以解決這個問題。 如果任何依賴項發生變化,保持這些文件夾是最新的也是一個問題。

我通過創建指向 Gradle 緩存目錄的符號鏈接解決了這個問題:

ln -s /Users/me/.gradle/caches/modules-2/files-2.1/ lib

這樣我就不必復制文件,任何更改都會自動獲取。

更新

在暫時刪除所有變通方法以便我可以評估如何在不提交變通方法(構建腳本更改以及符號鏈接)的情況下使 IntelliJ 工作后,我發現它仍然有效(!)。 也就是說,它現在可以在 IntelliJ 中工作,沒有從不工作的狀態(由我)改變。

我得出的結論是,IntelliJ 的緩存可能已損壞,只有通過符號鏈接讓它識別罐子才能修復。 雖然我沒有嘗試過,但刪除 ~/.gradle/caches 和重新加載項目可能會產生相同的效果。

無論哪種方式,執行上述步驟然后撤消它們似乎都可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM