Java 运行时更新卸载旧版本的 JRE 后,Jenkins 无法在 Windows Server 上启动

Java 运行时更新卸载旧版本的 JRE 后,Jenkins 无法在 Windows Server 上启动

我在 Windows Server 2012 上运行 Jenkins 服务器,Java 提示我更新到较新的版本 (jre1.8.0_261 到 jre1.8.0_271),并且在安装过程中它要求卸载旧版本 (出于安全原因),我允许它这样做。当我重新启动 Jenkins 服务时,它无法重新启动。错误日志显示此信息消息:

Starting C:\Program Files\Java\jre1.8.0_261\\bin\java.exe -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "C:\Program Files\Jenkins\jenkins.war" --httpPort=8080 --webroot="C:\Windows\system32\config\systemprofile\AppData\Local\Jenkins\war"

还有这个错误:

Service cannot be started. System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) at winsw.Util.ProcessHelper.StartProcessAndCallbackForExit(Process processToStart, String executable, String arguments, Dictionary2 envVars, String workingDirectory, Nullable1 priority, ProcessCompletionCallback callback, Boolean redirectStdin, LogHandler logHandler, Boolean hideWindow) at winsw.WrapperService.StartProcess(Process processToStart, String arguments, String executable, LogHandler logHandler, Boolean redirectStdin) at winsw.WrapperService.OnStart(String[] args) at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)

信息消息给了我问题的线索:Jenkins 指向此处的旧版本 Java 位置:C:\Program Files\Java\jre1.8.0_261

但是该文件夹是空的,最重要的是没有 bin 文件夹(毫无疑问是由于前面提到的卸载)。

此处的较新版本具有完整的 Java 二进制文件:C:\Program Files\Java\jre1.8.0_271

如何让 Jenkins 指向新的 JRE?

答案1

有一个非常简单的解决方案:找到 Jenkins.xml 文件(对我来说它位于C:\Program Files\Jenkins\jenkins.xml)并编辑它。

找到该<executable>元素并更正它,使其指向新的 JRE 路径,例如,在我的情况下,我更改了

<executable>C:\Program Files\Java\jre1.8.0_261\bin\java.exe</executable>

对此<executable>C:\Program Files\Java\jre1.8.0_271\bin\java.exe</executable>

保存文件并且 Jenkins 现在可以正常启动。

答案2

參閱@杰夫·梅格勒对主要解决方案的回答。

我们通过使用关联mklink /D C:Java\jre1.8 C:\Program Files\Java\jre1.8.0_261并将其放在 中jenkins.xml。我们首先手动安装 jdk,然后停止所有应用程序,重新指向一个链接并启动所有应用程序。然后删除旧 jdk。我们还有一个 8 链接和一个 11 链接。我们在 Linux 端执行相同操作,我们从那里提取了解决方案!

此外,根据 Oracle 的新许可条款,您应该使用类似采用OpenJDK以免违反 Big Red 的条款。

例如:

C:\Tools\Java>echo %JAVA_HOME%
C:\Tools\Java\jdk

C:\Tools\Java>dir
 Volume in drive C is L103437
 Volume Serial Number is 28B0-4574

 Directory of C:\Tools\Java

2020-10-28  12:43 PM    <DIR>          .
2020-10-28  12:43 PM    <DIR>          ..
2020-08-19  11:59 AM    <SYMLINKD>     jdk [jdk1.8]
2020-10-28  12:41 PM    <DIR>          jdk-11.0.9.11-openj9
2020-08-05  12:14 AM    <SYMLINKD>     jdk1.6 [jdk1.6.0_211]
2020-08-05  12:13 AM    <DIR>          jdk1.6.0_211
2020-03-11  01:31 AM    <DIR>          jdk1.8.0_231
2020-10-28  12:40 PM    <DIR>          jdk1.8.0_271
               0 File(s)              0 bytes
               8 Dir(s)  162,629,304,320 bytes free

C:\Tools\Java>mklink /D jdk1.8 jdk1.8.0_231
symbolic link created for jdk1.8 <<===>> jdk1.8.0_231

C:\Tools\Java>java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b32)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b32, mixed mode)

C:\Tools\Java>unlink jdk1.8

C:\Tools\Java>mklink /D jdk1.8 jdk1.8.0_271
symbolic link created for jdk1.8 <<===>> jdk1.8.0_271

C:\Tools\Java>java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b32)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b32, mixed mode)
    
C:\Tools\Java> dir

2020-08-19  11:59 AM    <SYMLINKD>     jdk [jdk1.8]
2020-10-28  12:44 PM    <SYMLINKD>     jdk1.8 [jdk1.8.0_271]
2020-03-11  01:31 AM    <DIR>          jdk1.8.0_231
2020-10-28  12:40 PM    <DIR>          jdk1.8.0_271

在上面的例子中, .JAVA_HOME=C:\Tools\Java\jdkPATH=%JAVA_HOME%\bin;%PATH%jdk符号链接,当前指向jdk1.8,在上面的例子中,它从指向重置1.8.0_2311.8.0_271(请不要忘记包含/D目录链接。

可以jenkins.xml通过以下方式引用可执行文件:
<executable>java.exe</executable>
<executable>%JAVA_HOME%\bin\java.exe</executable>
<executable>C:\Tools\Java\jdk1.8\bin\java.exe</executable>
或者如果您想针对特定版本进行验证:
<executable>C:\Tools\Java\jdk1.8.0_271\bin\java.exe</executable>

相关内容