2403
服务端原先使用java8(jdk1.8.0_171)

配置过环境变量,全部指向jdk1.8.0_171

在后续安装了java11、java17后cmd中java -version版本被强制指定为java17,所有低版本服务端全部无法开启
显示
A problem occurred running the Server launcher.java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at cpw.mods.fml.relauncher.ServerLaunchWrapper.run(ServerLaunchWrapper.java:43)
        at cpw.mods.fml.relauncher.ServerLaunchWrapper.main(ServerLaunchWrapper.java:12)
Caused by: java.lang.ClassCastException: class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader (jdk.internal.loader.ClassLoaders$AppClassLoader and java.net.URLClassLoader are in module java.base of loader 'bootstrap')
        at net.minecraft.launchwrapper.Launch.<init>(Launch.java:34)
        at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
        ... 6 more



推测是因为java版本错误导致的,有办法强制启动bat设置服务端可以使用的java吗?试过添加:
SET JavaVersion=".\jdk1.8.0_171\bin\java.exe"
这个启动参数,无效。

这个问题很烦,有效的解决方法试过一个是彻底卸载几个高版本java并重装java8,但是那些高版本java我玩整合包都要用到。


SunsetTown
使用绝对路径
"Java路径"


2403
SunsetTown 发表于 2023-10-8 10:28
在服务器启动bat中使用绝对路径
java.exe 改为 "Java8的路径"
例如:"C:\Program Files\Java\jre-1.8\bin\ja ...

测试了,无效。这个java17很迷,一装上就给自己设置了极高的优先级,无论环境变量的设置还是启动器里用绝对路径全部无效。
我先试了绝对路径无效,才用了本目录路径(把c盘的java复制一份丢到服务端目录),无效。

刚刚测试了把java17通过控制面板卸载后所有设置立即恢复正常了。java-version版本变回了以前设置的1.8.0,启动器也能和以前一样自动选择合适版本的java,无需进行设置,迷。。

SunsetTown
2403 发表于 2023-10-8 10:36
测试了,无效。这个java17很迷,一装上就给自己设置了极高的优先级,无论环境变量的设置还是启动器里用绝 ...

我看看你的bat设置

2403
SunsetTown 发表于 2023-10-8 10:37
我看看你的bat设置

@echo off
set a=0
:restart
title 末日求生 重启次数:%a%
::----设置开服JAVA版本
SET JavaVersion="C:\Program Files\Java\jre1.8.0_171\bin"

java -Xms2000M -Xmx2000M -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:G1MixedGCLiveThresholdPercent=35 -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -Dusing.aikars.flags=mcflags.emc.gs -jar iserver.jar
echo 服务器已经崩溃/关闭
rem 延迟5秒钟
ping 127.0.0.1>nul
set /a a=%a%+1
goto restart

SunsetTown
2403 发表于 2023-10-8 10:39
@echo off
set a=0
:restart
  1. [url=home.php?mod=space&uid=39305]@echo[/url] off
  2. set a=0
  3. :restart
  4. title 末日求生 重启次数:%a%
  5. ::----设置开服JAVA版本
  6. SET JavaVersion="C:\Program Files\Java\jre1.8.0_171\bin\java.exe"

  7. java -Xms2000M -Xmx2000M -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:G1MixedGCLiveThresholdPercent=35 -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -Dusing.aikars.flags=mcflags.emc.gs -jar iserver.jar
  8. echo 服务器已经崩溃/关闭
  9. rem 延迟5秒钟
  10. ping 127.0.0.1>nul
  11. set /a a=%a%+1
  12. goto restart
复制代码

试试这个

2403

无效,指定到bin和指定到java.exe刚刚也都试过了,问题确认了出在电脑的环境上。这个java17安装时会改动电脑的java部署环境,强制指定它,以前的所有设置都无效,很迷

SunsetTown
在cmd里输入输入Java-version看看当前java版本信息

SunsetTown
2403 发表于 2023-10-8 10:44
无效,指定到bin和指定到java.exe刚刚也都试过了,问题确认了出在电脑的环境上。这个java17安装时会改动 ...

实在不行参考
https://blog.csdn.net/m0_54480848/article/details/129605697
修改java环境

2403
SunsetTown 发表于 2023-10-8 10:50
在cmd里输入输入Java-version看看当前java版本信息

在javahome等所有环境变量均指向jdk1.8的情况下依然显示java version "17.0.3.1" 2022-04-22 LTS
在将java17从控制面板执行卸载后立即恢复为我自己设置的java version "1.8.0_171"

这个通过安装程序安装的java17会配置一个权限高于你自己设置的环境变量的东西,具体是什么未知,他本身没有改变环境变量内的东西。卸载后立即恢复正常了。

名副其实
服务端参数添加 -DPaper.IgnoreJavaVersiojn=true 后重试。

非得上变量,四行就能解决的事情非得加可读性,那干脆别用bat了。

@echo off
"绝对路径" 参数 -jar 核心.jar --nogui
pause

示例:

@echo off
"C:/\Program Files/\Java/\jre1.8.0_171/\bin/\java.exe" -Xms2000M -Xmx2000M -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:G1MixedGCLiveThresholdPercent=35 -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -Dusing.aikars.flags=mcflags.emc.gs -jar iserver.jar --nogui
pause
goto 0

2403
2403 发表于 2023-10-8 10:56
在javahome等所有环境变量均指向jdk1.8的情况下依然显示java version "17.0.3.1" 2022-04-22 LTS
在将jav ...

补充两点群内大佬说的,已通过最佳答案的方法解决了所以没测试,如果有人碰到类似问题可以参考。
通过java17安装包安装的java17会改动原先的环境这点被确认了,需要自行注意。
17有可能跟8分别添加path,哪个顺位靠前系统就用哪个的,可以把17添的path往后面排
cmd里打set,出来的那一串变量是有顺位的,系统找java的时候是一个个往后查,先找到哪个就用哪个
如果JAVA_HOME排到已有的java后面,那么JAVA_HOME都不会生效
而且我依然认为应该把脚本里的javaVersion改为JAVA_HOME

名副其实
2403 发表于 2023-10-8 11:07
补充两点群内大佬说的,已通过最佳答案的方法解决了所以没测试,如果有人碰到类似问题可以参考。
通过jav ...

也有一个更简单的方法,全都卸载,然后按照 Java 17 -> Java 11 等其他版本 -> Java 8 的顺序安装
个人真的觉得没有什么必要用环境变量这种奇怪的东西,出了问题你就会像现在一样狼狈。

ddee
虽然但是,上面是完全没有看出来 bat 里设置的 JavaVersion 变量根本没有在具体执行服务器那里用到么。
java -Xms... 应该改称 %JavaVersion% -Xms... 才对啊!

对于多版本的管理,我这里有个workaround,你可以直接把对应版本的 java.exe 改名成例如 java8.exe,这样子在调用的时候把脚本改称 java8 ... 就行了,亲测可行。

2403
名副其实 发表于 2023-10-8 11:24
也有一个更简单的方法,全都卸载,然后按照 Java 17 -> Java 11 等其他版本 -> Java 8 的顺序安装
个人真 ...

你说的也试过了,结果是java17依然有相当高的权重,无论是先在前面安装还是再后面安装都是不明原因强制使用java17,唯一的办法是将其卸载。至于jdk环境变量是因为某些编译软件要用到才部署的。