linux jdk版本隨時(shí)切換版本隨時(shí)切換實(shí)現(xiàn)方法
項(xiàng)目處理問(wèn)題遇到如下情況,引用第三方的jar包報(bào)出ClassDefNotFoundException錯(cuò)誤導(dǎo)致app崩潰,雙方溝通確認(rèn)該類存在且排除工程未clean,代碼混淆導(dǎo)致等原因。
注意到編譯app的時(shí)候提示了很多如下與正常情況下不一樣的信息:
trouble processing:
bad class file magic (cafebabe) or version (0033.0000)
...while parsing com/baidu/mapapi/SDKInitializer.class
...while processing com/baidu/mapapi/SDKInitializer.class
279 warnings
SDKInitializer正是ClassDefNotFoundException報(bào)錯(cuò)的類。
百度搜索出現(xiàn)這個(gè)編譯提示找到了問(wèn)題出現(xiàn)的原因:第三方公司打包這個(gè)jar包使用的jdk1.7版本(大于1.6),而我們編譯app使用的是1.6版本,由于編譯出的字節(jié)碼版本不一致,導(dǎo)致無(wú)法轉(zhuǎn)換成android虛擬機(jī)刻度的字節(jié)碼,因此引用的jar包實(shí)際并未編譯到當(dāng)前apk中,程序運(yùn)行的時(shí)候當(dāng)然就找不到相應(yīng)的類了。
公司編譯服務(wù)器實(shí)際上配置了多個(gè)jdk版本,而且android編譯是在設(shè)置環(huán)境變量的時(shí)候設(shè)置的jdk版本。編譯android4.4使用的是jdk1.6,而編譯android5.0則使用的是jdk1.7,這就涉及到了如何隨時(shí)切換jdk版本。
先來(lái)看看如何設(shè)置jdk環(huán)境變量,百度搜索得到的答案多是修改~/.bashrc或修改/etc/profile文件一次性完成配置。我用vi打開這兩個(gè)文件并未找到相應(yīng)的jdk環(huán)境變量,但是使用java -version確實(shí)能看到默認(rèn)的jdk版本。這就有了疑問(wèn),當(dāng)前默認(rèn)jdk軟件的環(huán)境變量是在哪里配置的?
使用 which java 命令找到當(dāng)前java可執(zhí)行程序的位置
fordreamxin@compiler207:~$ which java
/usr/bin/java
/usr/bin/目錄下存放的多是用戶安裝的軟件
fordreamxin@compiler207:~$ ll /usr/bin/java
lrwxrwxrwx 1 root root 22 Nov 13 06:18 /usr/bin/java -> /etc/alternatives/java*
alternatives是一個(gè)linux下的多版本管理軟件,利用它就可以實(shí)現(xiàn)jdk的版本切換,這點(diǎn)稍后再描述。先來(lái)alternatives目錄地下看看有些什么東西。
fordreamxin@compiler207:/etc/alternatives$ ls java*
java java.1.gz javac javac.1.gz javadoc javadoc.1.gz javah javah.1.gz javap javap.1.gz java_vm javaws javaws.1.gz
fordreamxin@compiler207:/etc/alternatives$ ll java
lrwxrwxrwx 1 root root 36 Nov 13 06:17 java -> /usr/lib/jvm/java-6-sun/jre/bin/java*
原來(lái)該目錄下放置了很多軟件的版本引用,從這里可以找到當(dāng)前軟件版本(jdk)的實(shí)際位置
fordreamxin@compiler207:/etc/alternatives$ ls /usr/lib/jvm/
java-1.7.0-openjdk-amd64 java-6-sun java-6-sun-1.6.0.26 java-7-openjdk-amd64
在/usr/lib/jvm文件夾下時(shí)間存儲(chǔ)了各個(gè)jdk版本的軟件,而alternatives正是通過(guò)修改它的java引用達(dá)到版本切換的目的。
使用alternatives實(shí)現(xiàn)版本切換的方法如下:
1. 查看相應(yīng)的jdk是否在 ubuntu的jdk菜單里,查看:
update-alternatives --config java
update-alternatives --config javac
2.如果沒有在菜單里可以如下方式添加:
update-alternatives --install /usr/bin/java java /usr/lib/jvm/java/jdk1.6.0_12/bin/java 300
update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java/jdk1.6.0_12/bin/javac 300
注意:jdk1.6.0_12 版本不同會(huì)有變動(dòng)
3.sudo update-alternatives --config java
sudo update-alternatives --config javac
選擇序號(hào),回車即可;
4.然后java -version,javac -version查看當(dāng)前jdk版本
但是使用alternatives需要sudo超級(jí)權(quán)限,也就是說(shuō)這種切換是一種全局切換,同修改~/.bashrc或/etc/profile一樣,一次操作,全局有效。如果沒有超級(jí)權(quán)限怎么辦?
設(shè)置環(huán)境變量linux提供了export命令,該命令的修改只對(duì)當(dāng)前終端有效。
fordreamxin@compiler207:/$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
上面的命令顯示了當(dāng)前的環(huán)境變量,也就是~/.bashrc或/etc/profile文件的內(nèi)容,它表示了當(dāng)前所有能夠全局使用的所有軟件或命令的環(huán)境變量,沒有這些變量,我們不能在任意目錄下使用很多命令或軟件,這也是環(huán)境變量的意義所在。
通過(guò)如下命令可以在$PATH的開始或末尾添加jdk的環(huán)境變量(bin目錄下保存了java, javac, javah等可執(zhí)行命令)
export PATH="/usr/lib/jvm/java-7-openjdk-amd64/bin":$PATH
export PATH="$PATH:/usr/lib/jvm/java-7-openjdk-amd64/bin/"
由于執(zhí)行的時(shí)候總是從$PATH的開始搜索可執(zhí)行文件的位置,所以如果環(huán)境變量中已經(jīng)設(shè)置了一個(gè)jdk,那么把新的jdk設(shè)置在PATH的開始才會(huì)有用。
export的具體使用可參考它的使用手冊(cè)。
相關(guān)文章

集成系統(tǒng)級(jí)Claw模式! Deepin 官宣發(fā)布 25.1 版本
deepin操作系統(tǒng)發(fā)布了最新的 25.1 版本更新,該版本基于 deepin 25 正式版積累的多輪內(nèi)測(cè)成果,在 AI 能力、內(nèi)核版本、桌面環(huán)境、文件管理器以及系統(tǒng)安全等方面進(jìn)行了更新2026-04-13
又一代老硬件退場(chǎng)! Linux 內(nèi)核正式放棄Intel 486 CPU
在過(guò)去的幾十年間,CPU 的架構(gòu)已經(jīng)經(jīng)歷了飛速發(fā)展,x86 系列就是其中之一,而 i486 則屬于該系列中的一個(gè),當(dāng)前,i486 的CPU處理器已經(jīng)夠老,從 Linux 7.1 開始將不再有對(duì)2026-04-09
趕緊收藏! 全網(wǎng)最全 Linux 命令總結(jié)
我把 Linux 中最常用、最實(shí)用、最常被問(wèn)到的命令按照實(shí)際使用場(chǎng)景分類整理,方便你快速查閱和記憶,內(nèi)容覆蓋日常運(yùn)維、開發(fā)調(diào)試、性能分析、文件處理、網(wǎng)絡(luò)、安全、系統(tǒng)管2026-04-08
一分鐘內(nèi)檢查L(zhǎng)inux服務(wù)器性能? 9個(gè)性能檢測(cè)常用的基本命令
今天我們來(lái)看看Linux系統(tǒng)中用于性能監(jiān)控的一系列命令,這些命令可以快速查看機(jī)器的負(fù)載情況,詳細(xì)請(qǐng)看下文介紹2026-03-18
從零基礎(chǔ)到精通! 適合高級(jí)用戶的15款Linux發(fā)行版推薦
Linux作為操作系統(tǒng)領(lǐng)域靈活性和可定制性的基石,提供了大量滿足不同用戶需求的發(fā)行版,今天分享適合高級(jí)用戶的15款Linux發(fā)行版2026-03-10
開箱即用? 這4個(gè)高手級(jí)Linux發(fā)行版遠(yuǎn)沒你想象的那么安全易用
如果你正在糾結(jié)用哪個(gè)發(fā)行版?零基礎(chǔ)新手別被“高端”“極客”“聲明式”這些詞沖昏頭腦,先用好用的,再慢慢進(jìn)階2026-03-10
這幾款SSH工具真的夠用了! Linux好用的ssh工具推薦
在Linux上使用SSH,您需要安裝一個(gè)SSH客戶端,今天整理找到的8 款 SSH / 終端工具,從免費(fèi)開源到企業(yè)級(jí)商用,從輕量化命令行到一站式工具箱,每款都做了介紹與對(duì)比,希望能2026-03-09
在Linux系統(tǒng)下有兩種用戶,即高級(jí)用戶root,普通用戶,高級(jí)用戶root可以在系統(tǒng)中做任何事情,普通用戶僅可在Linux系統(tǒng)中做有限的事情,下面我們就來(lái)看看切換方法2026-02-28
揭秘當(dāng)前登錄用戶的身份! Linux中使用logname命令的技巧
logname命令就是這樣一個(gè)簡(jiǎn)單但強(qiáng)大的工具,它能幫助我們輕松獲取當(dāng)前登錄用戶的用戶名,今天,我們就來(lái)深入探索一下這個(gè)命令的工作原理、使用方法和最佳實(shí)踐2026-02-26
在 Linux 系統(tǒng)中,DNS 緩存是一種將域名和 IP 地址映射關(guān)系緩存在本地的機(jī)制,可以加快域名解析速度,并減輕 DNS 服務(wù)器的負(fù)載2026-02-26



