【问题标题】:Multiple Java versions running concurrently under WindowsWindows下同时运行多个Java版本
【发布时间】:2008-11-07 09:24:32
【问题描述】:

我们有几个在 Java 5 上运行的应用程序,现在想引入一个基于 Java 6 的应用程序。这两个 Java 版本可以在 Windows 下一起运行吗?

是否有任何控制面板可以为不同的应用程序设置适当的 Java 版本,或任何其他方式来设置,将使用哪个版本的 Java 来运行该特定应用程序?

【问题讨论】:

    标签: java


    【解决方案1】:

    当然,您可以在 Windows 下使用多个版本的 Java。并且不同的应用程序可以使用不同的 Java 版本。您的应用程序是如何启动的?通常你会有一个批处理文件,其中有类似

    java ...
    

    这将使用 PATH 变量搜索 Java 可执行文件。因此,如果 Java 5 首先在 PATH 上,则运行 Java 6 应用程序将遇到问题。然后,您应该修改批处理文件以使用某个 Java 版本,例如通过定义环境变量JAVA6HOME 的值为C:\java\java6(如果Java 6 安装在此目录中)并更改批处理文件调用

    %JAVA6HOME%\bin\java ...
    

    【讨论】:

    • 在 Windows 上,要停止 Java 安装程序替换您现有的(第一次安装的)Java 安装,您必须将 STATIC=1 参数传递给它,即从命令行“jre-6u24-windows-i586-s”运行.exe /STATIC=1"
    • 当我在 Windows 7 64 上执行“jdk-6u27-windows-x64.exe /STATIC=1”时,它没有安装,它只是弹出一个显示 msiexec 用法的弹出窗口.
    • 根据this document from Oracle 实际上是jdk-...exe STATIC=1。我试过了,它奏效了。
    • 伙计们,你们混淆了 JDK 和 JRE。 JRE 确实将STATIC 作为参数,但JDK 也一样吗?
    • @reallyinsane 我无法理解这一点。对于新手来说,答案并不简单。你能把我链接到一个完整的教程吗?
    【解决方案2】:

    我对在 Windows 中跟踪 Java 文件的 CLASSPATH、JAVA_HOME 和 PATH 想法的笨拙感到震惊。我来到这里是因为有多个 JRE,以及如何满足于它。不重复信息,来自一个比我聪明得多的人,我宁愿指向他关于这个问题的文章,对我来说,它完美地解决了它。

    文章作者:Ted Neward:Multiple Java Homes: Giving Java Apps Their Own JRE

    随着 Java 作为服务器端开发语言的指数级增长,已经出现了一种等效语言 Java 开发工具、环境、框架和扩展的指数级增长。 不幸的是,并非所有这些工具都可以在相同的 Java VM 安装下很好地协同工作。一些 需要符合 Servlet 2.1 的环境,有些需要 2.2。有些只能在 JDK 1.2 或更高版本下运行, 一些在 JDK 1.1 下(并且没有更高版本)。有些需要 Swing 1.0 之前的“com.sun.swing”包 天,其他人需要“javax.swing”包名。

    更糟糕的是,即使在企业内部也可以发现这个问题,因为使用开发的系统 由于安装了一些 Java 扩展,六个月前的 Java 可能突然“无法工作” 新的(看似无关的)应用程序版本需要。这会使 Java 的部署复杂化 整个公司的应用程序,并引导客户确切地想知道为什么,五年后 臭名昭著的“Installing-this-app-breaks-my-system”问题始于微软的 DLL 方案, 除此之外,我们还没有取得太大进展。 (事实上​​,新的 .NET 计划实际上是为了解决 刚刚描述的臭名昭著的“DLL-Hell”问题。)

    本文描述了如何配置 Java 安装,以便给定的应用程序接收它自己的, 私有的,JRE,允许多个 Java 环境共存而不驱动客户(或系统 管理员)疯了...

    【讨论】:

    • 我认为上面答案中给出的链接不再存在。我在这里找到了同一篇文章docplayer.net/…
    【解决方案3】:

    我们可以使用 SDKMan 在同一台机器上安装多个版本的 Java 开发工具包。

    关于SDKMan的几点说明:

    1. SDKMan 可免费使用,由开源社区开发。
    2. SDKMan 是用bash 编写的,它只需要在您的系统上存在curlzip/unzip 程序。
    3. SDKMan 可以为 JVM 安装大约 29 个软件开发工具包,例如 Java、Groovy、Scala、Kotlin 和 Ceylon。 Ant、Gradle、Grails、Maven、SBT、Spark、Spring Boot、Vert.x。
    4. 我们无需担心设置_HOMEPATH 环境变量,因为SDKMan 会自动处理它。

    SDKMan 可以在任何基于 UNIX 的平台上运行,例如 Mac OSX、Linux、Cygwin、Solaris 和 FreeBSD,我们可以使用以下命令安装它:

    $ curl -s "https://get.sdkman.io" | bash  
    $ source "$HOME/.sdkman/bin/sdkman-init.sh" 
    

    因为 SDKMan 是用 bash 编写的,并且只需要 curlzip/unzip 出现在您的系统上。您也可以在 Windows 上安装 SDKMan,方法是先安装 CygwinGit Bash for Windows 环境,然后运行上述命令。

    命令sdk list java 将为我们提供可以使用 SDKMan 安装的 java 版本列表。

    安装 Java 8

    $ sdk install java 8.0.201-oracle
    

    安装 Java 9

    $ sdk install java 9.0.4-open 
    

    安装 Java 11

    $ sdk install java 11.0.2-open
    

    卸载 Java 版本

    如果您想卸载任何 JDK 版本,例如 11.0.2-open,您可以执行以下操作:

    $ sdk uninstall java 11.0.2-open
    

    切换当前 Java 版本

    如果要为所有终端和应用程序激活一个版本的JDK,可以使用命令

    sdk default java <your-java_version>
    

    以上命令也会自动更新 PATH 和 JAVA_HOME 变量。你可以阅读我的文章How to Install Multiple Versions of Java on the Same Machine

    【讨论】:

    • 非windows用户使用。
    • @gumuruh 你也可以在 windows 上安装它,因为 SDKMan 是用 bash 编写的,只需要 curl 和 zip/unzip 就可以在你的系统上。您也可以在 Windows 上安装 SDKMan,方法是先安装 Cygwin 或 Git Bash for Windows 环境,然后运行上述命令。
    【解决方案4】:

    应该可以为特定应用程序更改不同的 JAVA_HOME 环境变量设置。

    从命令行或批处理脚本启动时,您可以使用set JAVA_HOME=C:\...\j2dskXXX 更改 JAVA_HOME 环境。

    您可能还需要更改 PATH 环境变量以使用正确的 java 二进制文件。为此,您可以使用set PATH=%JAVA_HOME%\bin;%PATH%

    【讨论】:

      【解决方案5】:

      我使用自己的 java 版本启动 JMeter 时使用了一个简单的脚本

      setlocal
      set JAVA_HOME="c:\java8"
      set PATH=%JAVA_HOME%\bin;%PATH%;
      java -version
      

      拥有一个java“便携” 你可以在这里使用这个方法:

      https://www.whitebyte.info/programming/java/how-to-install-a-portable-jdk-in-windows-without-admin-rights

      【讨论】:

        【解决方案6】:

        完全可以同时安装多个 JRE/JDK 版本。此外,您不必为此做任何特别的事情,因为 Sun 会为每个文件夹(在 Program Files 下)创建一个不同的文件夹。

        没有控制面板来检查哪个 JRE 适用于每个应用程序。基本上,可以工作的 JRE 将是 PATH 环境变量中的第一个。您可以更改它或 JAVA_HOME 变量,或创建特定的 cmd/bat 文件来启动您想要的应用程序,每个应用程序在路径中都有不同的 JRE。

        【讨论】:

        • 我不相信这适用于 Windows。
        • @Casey,你指的是哪一部分?为什么不是真的?
        • This answer 解释了这个问题。 Windows 注册表用于定位 java 的默认版本。
        • 尽管 Java 程序通常可以在新版本的 Java 上运行良好,然后是开发它的版本,但这并不能保证。此外,JAVA_HOME 环境变量在大多数情况下都需要更新。
        【解决方案7】:

        使用“java -version:1.5”等调用 Java 应该使用正确的 Java 版本运行。 (显然把 1.5 替换成你想要的版本。)

        如果 Java 已正确安装在 Windows 上,则它使用的注册表中存储的每个版本都有指向 vm 的路径,因此您无需在 Windows 上弄乱环境版本。

        【讨论】:

        • 我相信这只适用于“公共”JRE。在客户端机器上非常出色,对于不安装公共 JRE 的开发人员来说有点痛苦。比批处理文件好得多。
        【解决方案8】:

        或者使用链接。虽然在运行环境中更新 PATH 相当不愉快,但很容易重新创建指向新版本 JRE/JDK 的链接。所以:

        • 安装要使用的不同版本的 JDK
        • 通过junction 或内置 mklink 命令创建指向该文件夹的链接
        • 设置链接的路径
        • 如果要使用其他版本的java,删除链接,新建一个,PATH/JAVA_HOME/硬编码脚本保持不变

        【讨论】:

          【解决方案9】:

          如果您使用Java Web Start(您可以从任何 URL 启动应用程序,甚至是本地文件系统),它将负责为您的应用程序找到正确的版本。

          【讨论】:

            【解决方案10】:

            使用Java Web Start,你可以安装多个JRE,然后调用你需要的。 在 win 上,您可以制作一个 .bat 文件:

            1- 在线版本: your_JRE_version\bin\javaws.exe> -localfile -J-Djnlp.application.href=.jnlp 文件的url.jnlp> -localfile -J "path_temp_jnlp_file_.jnlp>"

            2- 从缓存启动: your_JRE_version\bin\javaws.exe> -localfile -J "path_of_your_local_jnlp_file.jnlp>"

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-10-12
              • 1970-01-01
              • 2020-12-10
              • 2018-04-27
              • 1970-01-01
              • 1970-01-01
              • 2011-03-20
              相关资源
              最近更新 更多