linux jdk 版本切换

本贴最后更新于 2419 天前,其中的信息可能已经物是人非

项目处理问题遇到如下情况,引用第三方的 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 的具体使用可参考它的使用手册。

原链接:https://www.cnblogs.com/fordreamxin/p/4287706.html

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1081 引用 • 3459 回帖 • 241 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 429 回帖 • 5 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 102 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 169 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 698 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    148 引用 • 3769 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 565 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 42 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 8 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 101 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    926 引用 • 937 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 617 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖 • 2 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 54 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 598 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
  • danl
    98 关注
  • 笔记

    好记性不如烂笔头。

    308 引用 • 787 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    263 引用 • 664 回帖
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 5 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 444 关注