在Windows上通过命令行设置JVM

25

在调用"java jar jar_name.jar"命令时,是否可以指定要使用的JVM。我在机器上安装了两个JVM。但我不能更改JAVA_HOME,因为这可能会破坏已经运行的代码。

此致敬礼

Stephen

4个回答

48

可以 - 只需显式提供到 java.exe 的路径即可。例如:

c:\Users\Jon\Test>"c:\Program Files\java\jdk1.6.0_03\bin\java.exe" -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)

c:\Users\Jon\Test>"c:\Program Files\java\jdk1.6.0_12\bin\java.exe" -version
java version "1.6.0_12"
Java(TM) SE Runtime Environment (build 1.6.0_12-b04)
Java HotSpot(TM) Client VM (build 11.2-b01, mixed mode, sharing)

对于正在运行的命令行窗口,最简单的方法是:

set PATH=c:\Program Files\Java\jdk1.6.0_03\bin;%PATH%
例如,下面是一个完整的会话,展示了我的默认JVM,然后更改路径,最后是新的JVM:
c:\Users\Jon\Test>java -version
java version "1.6.0_12"
Java(TM) SE Runtime Environment (build 1.6.0_12-b04)
Java HotSpot(TM) Client VM (build 11.2-b01, mixed mode, sharing)

c:\Users\Jon\Test>set PATH=c:\Program Files\Java\jdk1.6.0_03\bin;%PATH%

c:\Users\Jon\Test>java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)

但是这不会改变明确使用JAVA_HOME的程序。

请注意,如果在路径中获取错误的目录(包括不存在的目录),您将不会收到任何错误信息,它实际上会被忽略。


1
哇,这是一个明显的巧合。当我准备发布您答案的前两行时,通知突然弹出了。 - Michael Myers
@Jon Skeet 我该如何在Java程序中实现这个功能?我想要使用32位JRE运行一个.jar文件,我能否从Java代码中设置新进程的JRE路径? - Utku Ufuk
@Utku:当你创建一个进程时,你可以传递可执行文件的完整路径... - Jon Skeet
@Jon Skeet,您能给我举个例子来演示一下吗? - Utku Ufuk
@Utku:如果不是在一个无关问题的评论线程中,那么就不适用。我建议你进行一些研究(例如在Stack Overflow内搜索),如果绝对必要,再提出一个新问题。 - Jon Skeet

2

如果您使用的是通过通常的Windows InstallShield机制安装的带有JVM查找器EXE的Sun VMs,那么您应该能够通过命令行参数来完成这个操作。

输入java -help以获取选项。特别是,请查看:

-version:<value>
              require the specified version to run
-jre-restrict-search | -jre-no-restrict-search
              include/exclude user private JREs in the version search

0

是的,我经常需要安装3个或更多的JVM。例如,我注意到有时JRE与JRE的JDK版本略有不同。

对于Windows上的“打包”问题,我的解决方案通常是这样的:

@echo off
setlocal
@rem  _________________________
@rem
@set  JAVA_HOME=b:\lang\java\jdk\v1.6\u45\x64\jre
@rem
@set  JAVA_EXE=%JAVA_HOME%\bin\java
@set  VER=test
@set  WRK=%~d0%~p0%VER%
@rem
@pushd %WRK%
cd 
@echo.
@echo  %JAVA_EXE%  -jar %WRK%\openmrs-standalone.jar
       %JAVA_EXE%  -jar %WRK%\openmrs-standalone.jar 
@rem
@rem  _________________________
popd
endlocal
@exit /b

我认为很直接。主要的是,setlocal和endlocal为你的应用程序提供了“个人环境”,使其能够完成任何任务 - 即使有其他程序需要运行。


0
如果您有2个JVM的安装版本,请将其放在前面。Linux:export PATH=/usr/lib/jvm/java-8-oracle/bin:$PATH
这样可以消除歧义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接