NoSuchMethodError

1、异常

 

 源码运行正常,但是打包成jar后运行提示没有该方法

查看了一下,process的pid方法是jdk9之后添加的方法,jdk8是没有的,但是我看源码的运行环境就是jdk8,运行环境也是jdk8

源码环境

 

 运行环境

 

 很奇怪,同样是jdk8,为什么源码环境可以调用pid方法,但是运行环境不可以

2、发现问题所在

难道Javase1.8不是jdk1.8?

我决定在代码中打印出Java的版本信息

String javaVersion = System.getProperty("java.version");
System.out.println("javaVersion = " + javaVersion);

 源码环境运行打印的结果

运行环境打印出来的结果

 

 

 很明显版本号是不一样的

虽然不知道为什么不一样,但是我现在至少知道如何去解决这个问题了

3、方案一

其实这里并不一定非要用pid来唯一区别是哪个进程,因为pid仅仅只是一个key值,只要是唯一的,传到前端去,前端需要停止进程的时候再把这个唯一的key带回来,就能在map中获取这个进程对象,就能停止进程,唯一值的获取方式非常多,最简单的就是获取uuid即可

4、方案二

既然是因为运行时环境和源码环境不一致,那么就把源码环境拷贝到运行环境中即可

在开发工具中可以轻而易举的看到源码所应用的jdk路径

 

 直接把这个路径拷贝到运行环境中去

 

 

然后在运行jar的前面加上两句,应用自己的jdk环境

set JAVA_HOME=D:\cetcht\project01\jre
set Path=%JAVA_HOME%\bin;%Path%;
java -jar -Dfile.encoding=utf-8 netty-platform.jar --lcx.locations.path=D:/cetcht/project01/media --lcx.datasource.ip=localhost

 

 5、小记

其实在这个过程中,还遇到了一个问题,就是使用拷贝过来的jdk时依然还是报了一个错

一开始写的是下面两句

set JAVA_HOME=D:\cetcht\project01\jre
set Path=%Path%;%JAVA_HOME%\bin;

 

区别仅仅是 path 和 Java_home 的顺序不一致,这个是 Java_home 放在了后面,但就这一个顺序问题,导致了如下问题

 

 这个提示的是编译环境和运行环境不一致

为什么不一致,明明都是用这个jre

原因是path中已经配置了其他的jdk路径,按照优先原则,会先找到path中已经有的jdk,所以这里要先使用临时配的Java_home ,就得把这个路径配置到最前面

那么有人又得有疑惑了,不能直接写成下面这样吗,这样就只有一个jdk,绝对不会找错地方

set JAVA_HOME=D:\cetcht\project01\jre
set Path=%JAVA_HOME%\bin;

 

这样写path就被完全覆盖掉了,但是某些情况下倒也是可以正常运行的,

只是如果代码中还应用到了别的命令,比如应用到了海康等的sdk,这些库文件的路径也是配置在了path中,这样写就找不到命令了

6、单个文件的调试代码

查看编译版本
javac -version

查看运行版本
java -version

编译
set JAVA_HOME=E:\sts\sts-4.9.0.RELEASE\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507\jre
set Path=%JAVA_HOME%\bin;%Path%;
javac -encoding "utf-8" ExecCmd.java
pause

运行
set JAVA_HOME=E:\sts\sts-4.9.0.RELEASE\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_15.0.1.v20201027-0507\jre
set Path=%JAVA_HOME%\bin;%Path%;
java ExecCmd
pause

 

posted @ 2022-02-10 14:42  1156740846  阅读(61)  评论(0编辑  收藏  举报