linux jdk版本随时切换版本随时切换实现方法

  发布时间:2016-10-18 16:56:41   作者:佚名   我要评论
这篇文章主要介绍了linux jdk版本随时切换版本随时切换实现方法的相关资料,需要的朋友可以参考下

项目处理问题遇到如下情况,引用第三方的jar包报出ClassDefNotFoundException错误导致app崩溃,双方沟通确认该类存在且排除工程未clean,代码混淆导致等原因。

注意到编译app的时候提示了很多如下与正常情况下不一样的信息:

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报错的类。
 
百度搜索出现这个编译提示找到了问题出现的原因:第三方公司打包这个jar包使用的jdk1.7版本(大于1.6),而我们编译app使用的是1.6版本,由于编译出的字节码版本不一致,导致无法转换成android虚拟机刻度的字节码,因此引用的jar包实际并未编译到当前apk中,程序运行的时候当然就找不到相应的类了。
 
公司编译服务器实际上配置了多个jdk版本,而且android编译是在设置环境变量的时候设置的jdk版本。编译android4.4使用的是jdk1.6,而编译android5.0则使用的是jdk1.7,这就涉及到了如何随时切换jdk版本。
 
先来看看如何设置jdk环境变量,百度搜索得到的答案多是修改~/.bashrc或修改/etc/profile文件一次性完成配置。我用vi打开这两个文件并未找到相应的jdk环境变量,但是使用java -version确实能看到默认的jdk版本。这就有了疑问,当前默认jdk软件的环境变量是在哪里配置的?
 
使用 which java 命令找到当前java可执行程序的位置
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是一个linux下的多版本管理软件,利用它就可以实现jdk的版本切换,这点稍后再描述。先来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*

原来该目录下放置了很多软件的版本引用,从这里可以找到当前软件版本(jdk)的实际位置

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文件夹下时间存储了各个jdk版本的软件,而alternatives正是通过修改它的java引用达到版本切换的目的。
使用alternatives实现版本切换的方法如下:

1. 查看相应的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 版本不同会有变动

3.sudo update-alternatives --config java
sudo update-alternatives --config javac
选择序号,回车即可;
4.然后java -version,javac -version查看当前jdk版本

 

但是使用alternatives需要sudo超级权限,也就是说这种切换是一种全局切换,同修改~/.bashrc或/etc/profile一样,一次操作,全局有效。如果没有超级权限怎么办?

设置环境变量linux提供了export命令,该命令的修改只对当前终端有效。

fordreamxin@compiler207:/$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
上面的命令显示了当前的环境变量,也就是~/.bashrc或/etc/profile文件的内容,它表示了当前所有能够全局使用的所有软件或命令的环境变量,没有这些变量,我们不能在任意目录下使用很多命令或软件,这也是环境变量的意义所在。
通过如下命令可以在$PATH的开始或末尾添加jdk的环境变量(bin目录下保存了java, javac, javah等可执行命令)

export PATH="/usr/lib/jvm/java-7-openjdk-amd64/bin":$PATH

export PATH="$PATH:/usr/lib/jvm/java-7-openjdk-amd64/bin/"
由于执行的时候总是从$PATH的开始搜索可执行文件的位置,所以如果环境变量中已经设置了一个jdk,那么把新的jdk设置在PATH的开始才会有用。

export的具体使用可参考它的使用手册。

相关文章

  • Linux神奇漏洞:长按回车键70秒 即可轻松拿到Root权限

    Linux被爆出神奇漏洞,如果你重复93次输错密码,或者持续按回车键大概70秒,就能够获得root initramfs (initial RAM filesystem) shell。关键是,这个漏洞攻击的成功率非常
    2016-11-18
  • Linux中zip压缩和unzip解压缩命令详解

    这篇文章主要介绍了zip/unzip压缩解压缩命令的使用方法及参数的说明,需要的朋友可以参考下
    2013-09-22
  • linux下磁盘分区详解 图文

    linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从a—d)因为IDE硬盘最多四个,SCSI,SATA,USB硬盘为sdx(x为a—z)),硬盘主分区最多为4个,不用说大
    2012-07-10
  • gzip和gunzip 解压参数

    Linux压缩保留源文件的方法: gzip –c filename > filename.gz Linux解压缩保留源文件的方法: gunzip –c filename.gz > filename gunzip的用法 &nb
    2009-03-10
  • linux ln 命令使用参数详解(ln -s 软链接)

    这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文
    2014-04-04
  • rpm 命令|rpm 安装|rpm 卸载|rpm 使用|rpm 删除

    在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是Red Hat Package Manager(简称RPM)。
    2017-09-25
  • linux查看目录大小及硬盘大小

    linux查看目录大小及硬盘大小的命令: # du -ks   ---in all # du -k     ---every last du和df命令都被用于获得文件系统大小的信息:df用于
    2009-03-10
  • Ubuntu下Eclipse的安装方法(图文详解)

    今天终于找到了一篇很好得文章,在Ubuntu下面怎么很方便的安装eclipse,太好了,下面分享一下
    2013-11-14
  • linux 如何结束进程

    首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: # kill -pid 注释:标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,
    2009-03-10
  • Linux下GitLab如何安装部署

    本文为大家详细的介绍Linux系统下GitLab如何安装部署,gitlab 一般作为内部私有系统使用,若公司使用 git 分布代码,每次从 github 上 pull 则非常慢,使用 gitlab 则方便很多
    2016-11-21

最新评论