Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 872|回复: 0

分析并解决Linux发行版的自带OpenJdk和自己安装的OracleJdk新旧版本冲突问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-9-2 10:14:24 | 显示全部楼层 |阅读模式

    解决办法:

    从Oraclejdk 目录里可执行文件链接都复制到自己的LINK目录,然后IDE使用LINK变量下的命令

     本文没有具体解决方法,只有探索思路................................

    如果想替换系统openjdk,请参考:

    Linux(Deepin)下配置java8 - L141210113的专栏 - CSDN博客(不过官网jdk8现在需要登录才能下载,jdk11、12不用登录)

     

    以下为过程思路:

     

     

    发行版系统:Deepin15.9 (为什么?漂亮不折腾)

    一直知道这个情况,但使用正常就没去理他,直到今天:

    VSCode给我报了个错误 

     

    1 cd "/home/××/Documents/0vscode/java/" && javac -encoding UTF-8 MidiDance1.java && java MidiDance1
    2 
    3 Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
    4 Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
    5 Error: LinkageError occurred while loading main class MidiDance1
    6         java.lang.UnsupportedClassVersionError: MidiDance1 has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 54.0
    报错

     

     

     所以解决它...

     百分百确定是Openjdk自带的jre和Oracle的冲突,看这里:

    $ sudo update-alternatives --config java
    [sudo] ×× 的密码:
    链接组 java (提供 /usr/bin/java)中只有一个候选项:/usr/lib/jvm/java-10-openjdk-amd64/bin/java
    无需配置。

    $ ls /usr/lib/jvm/
    default-java   java-10-openjdk-amd64    java-1.10.0-openjdk-amd64    jdk-11.0.2

    其中jdk-11.0.2 是我自己装的OracleJdk目录

     

    可知系统是默认配置一个openjdk的jre环境了

    // 问题应该在这个目录,进去看看
    $ cd /usr/lib/jvm/

    // default这个目录有点默认使用的意味,ls详细看看

    $ ls -l default-java/bin/ 总用量 216 -rwxr-xr-x 1 root root 10520 5月 6 2018 java -rwxr-xr-x 1 root root 10600 5月 6 2018 jjs -rwxr-xr-x 1 root root 10560 5月 6 2018 keytool -rwxr-xr-x 1 root root 10608 5月 6 2018 orbd -rwxr-xr-x 1 root root 10560 5月 6 2018 pack200 -rwxr-xr-x 1 root root 10552 5月 6 2018 rmid -rwxr-xr-x 1 root root 10560 5月 6 2018 rmiregistry -rwxr-xr-x 1 root root 10560 5月 6 2018 servertool -rwxr-xr-x 1 root root 10616 5月 6 2018 tnameserv -rwxr-xr-x 1 root root 107920 5月 6 2018 unpack200

     

    文件权限之后的数字代表类型,1是link文件链接类型,

    也就是说系统默认使用了这个链接,所以也就印证了VSCode里调用的报错。

     那更改java链接就行了?等等,看清楚点比较好

    $ ls -l default-java
    lrwxrwxrwx 1 root root 25 5月   1  2018 default-java -> java-1.10.0-openjdk-amd64

    原来这个default-java才是一个链接

    $ ls -l java-1.10.0-openjdk-amd64
    lrwxrwxrwx 1 root root 21 5月   6  2018 java-1.10.0-openjdk-amd64 -> java-10-openjdk-amd64

    等等....这....看来得把所有主要目录都列出来

    $ ls -l 
    总用量 8
    lrwxrwxrwx 1 root root   25 5月   1  2018 default-java -> java-1.10.0-openjdk-amd64
    drwxr-xr-x 7 root root 4096 1月  24 15:41 java-10-openjdk-amd64
    lrwxrwxrwx 1 root root   21 5月   6  2018 java-1.10.0-openjdk-amd64 -> java-10-openjdk-amd64
    drwxr-xr-x 8  668  668 4096 1月  22 10:47 jdk-11.0.2

    所以看懂了,为什么这么蛋疼的链接呢?那肯定是为了兼容性,查了一下: jdk10 也叫 jdk1.10   (目前 jdkxx 都叫 jdk1.xx)

     Ps. 闲的没事多 ls -l 会有很多发现

     

    然后找出 全局可执行命令“java” 的位置 

    $ type java
    java 是 /usr/bin/java
    
    $ which java
    /usr/bin/java
    
    $ whereis java
    java: /usr/bin/java /etc/java /usr/share/java /usr/lib/jvm/jdk-11.0.2/bin/java /usr/share/man/man1/java.1.gz
    
    $ whereis -b java
    java: /usr/bin/java /etc/java /usr/share/java /usr/lib/jvm/jdk-11.0.2/bin/java
    

     得出位置是/usr/bin/ ,那ls一下

    $ ls -l /usr/bin/ | grep java
    lrwxrwxrwx 1 root root          22 1月  24 15:43 java -> /etc/alternatives/java

    蛋疼得受不了了,继续ls

    $ ls -l | grep java
    lrwxrwxrwx 1 root root  43 1月  24 15:43 java -> /usr/lib/jvm/java-10-openjdk-amd64/bin/java
    lrwxrwxrwx 1 root root  53 1月  24 15:43 java.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/java.1.gz
    lrwxrwxrwx 1 root root  44 1月  24 15:43 jexec -> /usr/lib/jvm/java-10-openjdk-amd64/lib/jexec
    lrwxrwxrwx 1 root root  49 1月  24 15:43 jexec-binfmt -> /usr/lib/jvm/java-10-openjdk-amd64/lib/jar.binfmt
    lrwxrwxrwx 1 root root  42 1月  24 15:43 jjs -> /usr/lib/jvm/java-10-openjdk-amd64/bin/jjs
    lrwxrwxrwx 1 root root  52 1月  24 15:43 jjs.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/jjs.1.gz
    lrwxrwxrwx 1 root root  46 1月  24 15:43 keytool -> /usr/lib/jvm/java-10-openjdk-amd64/bin/keytool
    lrwxrwxrwx 1 root root  56 1月  24 15:43 keytool.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/keytool.1.gz
    lrwxrwxrwx 1 root root  43 1月  24 15:43 orbd -> /usr/lib/jvm/java-10-openjdk-amd64/bin/orbd
    lrwxrwxrwx 1 root root  53 1月  24 15:43 orbd.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/orbd.1.gz
    lrwxrwxrwx 1 root root  46 1月  24 15:43 pack200 -> /usr/lib/jvm/java-10-openjdk-amd64/bin/pack200
    lrwxrwxrwx 1 root root  56 1月  24 15:43 pack200.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/pack200.1.gz
    lrwxrwxrwx 1 root root  43 1月  24 15:43 rmid -> /usr/lib/jvm/java-10-openjdk-amd64/bin/rmid
    lrwxrwxrwx 1 root root  53 1月  24 15:43 rmid.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/rmid.1.gz
    lrwxrwxrwx 1 root root  50 1月  24 15:43 rmiregistry -> /usr/lib/jvm/java-10-openjdk-amd64/bin/rmiregistry
    lrwxrwxrwx 1 root root  60 1月  24 15:43 rmiregistry.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/rmiregistry.1.gz
    lrwxrwxrwx 1 root root  49 1月  24 15:43 servertool -> /usr/lib/jvm/java-10-openjdk-amd64/bin/servertool
    lrwxrwxrwx 1 root root  59 1月  24 15:43 servertool.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/servertool.1.gz
    lrwxrwxrwx 1 root root  48 1月  24 15:43 tnameserv -> /usr/lib/jvm/java-10-openjdk-amd64/bin/tnameserv
    lrwxrwxrwx 1 root root  58 1月  24 15:43 tnameserv.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/tnameserv.1.gz
    lrwxrwxrwx 1 root root  48 1月  24 15:43 unpack200 -> /usr/lib/jvm/java-10-openjdk-amd64/bin/unpack200
    lrwxrwxrwx 1 root root  58 1月  24 15:43 unpack200.1.gz -> /usr/lib/jvm/java-10-openjdk-amd64/man/man1/unpack200.1.gz

    原来bin路径下都是链接,我....

    赶紧必应搜索多几下

     

    linux中如何查看命令所在目录_百度经验



     

    原因找到了,那我们就.... Linux不太可能给你集成你用不到的功能,所以Openjdk应该和系统相关,不能卸载作死...

     

    解决方案:

    我们只是用IDE编程时运行一下,还是在IDE里改吧,

     

    先看一下自己安装的jdk目录

    :/usr/lib/jvm/jdk-11.0.2/bin$ ls -l
    总用量 508
    -rwxr-xr-x 1 668 668  12952 1月  18 13:36 jaotc
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jar
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jarsigner
    -rwxr-xr-x 1 668 668   8672 1月  18 13:36 java
    -rwxr-xr-x 1 668 668   8784 1月  18 13:36 javac
    -rwxr-xr-x 1 668 668   8784 1月  18 13:36 javadoc
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 javap
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jcmd
    -rwxr-xr-x 1 668 668  12888 1月  18 13:36 jconsole
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jdb
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jdeprscan
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jdeps
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jhsdb
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jimage
    -rwxr-xr-x 1 668 668  12880 1月  18 13:36 jinfo
    -rwxr-xr-x 1 668 668   8784 1月  18 13:36 jjs
    -rwxr-xr-x 1 668 668   8784 1月  18 13:36 jlink
    -rwxr-xr-x 1 668 668  12880 1月  18 13:36 jmap
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jmod
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jps
    -rwxr-xr-x 1 668 668   8792 1月  18 13:36 jrunscript
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jshell
    -rwxr-xr-x 1 668 668  12880 1月  18 13:36 jstack
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jstat
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 jstatd
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 keytool
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 pack200
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 rmic
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 rmid
    -rwxr-xr-x 1 668 668   8744 1月  18 13:36 rmiregistry
    -rwxr-xr-x 1 668 668   8736 1月  18 13:36 serialver
    -rwxr-xr-x 1 668 668 117704 1月  18 13:36 unpack200

    和系统Openjdk结构差不多,bin目录下都是可执行文件的链接

    Linux下的softlink和hardlink - yasaken - CSDN博客

     

    具体解决方案:

    从安装的Oraclejdk 目录里找可执行文件链接所在的bin目录,把bin目录下的链接文件copy到自己的javaLinkBin目录下

    把可执行链接都复制到自己的目录:

    /usr/lib/jvm/jdk-11.0.2$  cp bin/* /home/xx/Documents/javaLinkBin/

    然后把IDE里调用jdk的命令都加上完整路径,

    修改IDE里的运行命令如:

    java    改为   /home/xx/Document/javaLinkBin/java

    javac    改为   /home/xx/Document/javaLinkBin/javac

     

    当然更好的方法是设置一个变量,例如

    MY_JDKLINK="/home/xx/Document/javaLinkBin/"

    然后IDE配置写 $MY_JDKLINK/java即可

             -End-

     

     

     

     

    Ps.最近百度挺讨厌的,还我必应主域名,不还就用官方第二域名:https://www2.bing.com     https://www4.bing.com

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 18:47 , Processed in 0.062792 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表