gradle 踩坑 -- javassist.NotFoundException: broken jar file?: xxx class

問題背景

通過 gradle 構(gòu)建編譯時(shí), 在切換分支或代碼變更較大后, 經(jīng)常出現(xiàn) javassist.NotFoundException: broken jar file? 的編譯失敗錯(cuò)誤, 一直以來只能靠重啟 Android Studio 來解決, 非常痛苦. 最近花了些時(shí)間終于解決了這個(gè)問題.

原因分析過程

* What went wrong:
Execution failed for task ':app:transformClassesWithXXXXJarMergingForDebugQA'.
> javassist.NotFoundException: broken jar file?: com.xx.BaseRecyclerAdapter

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

首先查看相關(guān)源碼分析:

public InputStream openClassfile(String classname)
            throws NotFoundException
    {
        URL jarURL = find(classname);
        if (null != jarURL)
            try {
                java.net.URLConnection con = jarURL.openConnection();
                con.setUseCaches(false);
                return con.getInputStream();
            }
            catch (IOException e) {
                throw new NotFoundException("broken jar file?: "
                        + classname);
            }
        return null;
    }

報(bào)錯(cuò)"broken jar file?" 是由于發(fā)生了IOException, 這個(gè)異常通常跟文件讀取有關(guān)的, 猜測(cè)是打開 jar 文件失敗引起的, 那么這個(gè) jar 文件可能是因?yàn)楸黄渌M(jìn)程占用了. 通過 lsof 命令查看jar文件占用, 過濾出 jar 文件占用的進(jìn)程.

lsof | egrep '\.jar$'

這里列出部分跟當(dāng)前 project 相關(guān)的 jar 占用進(jìn)程信息:

java      23717 luliang  504r      REG                1,4      64883 8625155549 /Users/luliang/git/$myProjectXXX/app/build/intermediates/transforms/TrafficStats/debugQA/111.jar
java      23717 luliang  527r      REG                1,4     422787 8625152311 /Users/luliang/git/$myProjectXXX/app/build/intermediates/transforms/GsonJarTransform/debugQA/56.jar
java      23717 luliang  542r      REG                1,4      22062 8625152326 /Users/luliang/git/$myProjectXXX/app/build/intermediates/transforms/GsonJarTransform/debugQA/71.jar
java      23717 luliang  568r      REG                1,4     475187 8625152557

發(fā)現(xiàn)是pid 為 23717 的 java 進(jìn)程占用了當(dāng)前 project 中多個(gè)編譯時(shí)生成的 jar 文件, 通過命令 kill 23717 殺掉這個(gè)進(jìn)程后, 再重新編譯就正常了.

那這個(gè) java 進(jìn)程到底是誰(shuí)啟動(dòng)的呢? 既然是 java 進(jìn)程,我們可以通過 jps 命令查看:

> jps
23717 GradleDaemon
23847 KotlinCompileDaemon
23963 Jps

可以看出這是一個(gè) gradle 守護(hù)進(jìn)程.

到這里,問題的原因就找到了, 是 gradle 的坑:

gradle 守護(hù)進(jìn)程一直持有 jar 文件句柄, 編譯進(jìn)程無(wú)法打開讀取 jar 文件導(dǎo)致編譯失敗.

以前關(guān)閉 Android Studio 的解決方法能夠生效是因?yàn)? 關(guān)閉 Android Studio 也會(huì)同時(shí)關(guān)閉 gradle 守護(hù)進(jìn)程.

解決方法

  • 方法一(推薦): 在編譯前通過 ./gradlew --stop 命令停止守護(hù)進(jìn)程.

在切換分支或代碼發(fā)生較大變更時(shí), 開發(fā)需要有意識(shí)的執(zhí)行命令停止守護(hù)進(jìn)程.

  • 方法二: 默認(rèn)關(guān)閉守護(hù)進(jìn)程, 修改 gradle 配置:
echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties

缺點(diǎn):

  1. 每次編譯都比較慢, 無(wú)法享有守護(hù)進(jìn)程提高編譯速度的特性;
  2. 僅限命令行執(zhí)行編譯有效, android studio 中Run仍然會(huì)開啟守護(hù)進(jìn)程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末记罚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子壳嚎,更是在濱河造成了極大的恐慌桐智,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烟馅,死亡現(xiàn)場(chǎng)離奇詭異酵使,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)焙糟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來样屠,“玉大人穿撮,你說我怎么就攤上這事』居” “怎么了悦穿?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)业踢。 經(jīng)常有香客問我栗柒,道長(zhǎng)知举,這世上最難降的妖魔是什么雇锡? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任锰提,我火速辦了婚禮芳悲,結(jié)果婚禮上边坤,老公的妹妹穿的比我還像新娘茧痒。我一直安慰自己,他們只是感情好惹苗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布桩蓉。 她就那樣靜靜地躺著劳闹,像睡著了一般本涕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菩颖,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音放祟,去河邊找鬼呻右。 笑死,一個(gè)胖子當(dāng)著我的面吹牛声滥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纽疟,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仰挣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼缠沈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顷锰,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤官紫,失蹤者是張志新(化名)和其女友劉穎州藕,沒想到半個(gè)月后床玻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毁涉,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贫堰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年其屏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缨该。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贰拿。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖壮不,靈堂內(nèi)的尸體忽然破棺而出皱碘,到底是詐尸還是另有隱情询一,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布癌椿,位于F島的核電站,受9級(jí)特大地震影響踢俄,放射性物質(zhì)發(fā)生泄漏缩功。R本人自食惡果不足惜都办,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一嫡锌、第九天 我趴在偏房一處隱蔽的房頂上張望虑稼。 院中可真熱鬧,春花似錦势木、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)且改。三九已至又跛,卻和暖如春笋庄,著一層夾襖步出監(jiān)牢的瞬間效扫,已是汗流浹背直砂。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工静暂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留济丘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓洽蛀,卻偏偏與公主長(zhǎng)得像摹迷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子郊供,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容