【问题标题】:Is there any Java version manager?有 Java 版本管理器吗?
【发布时间】:2013-04-20 21:44:43
【问题描述】:

我曾经在我的Linux 机器上安装了多个JDK,我喜欢从命令行从一个版本切换到另一个版本(我曾经手动更改我的JAVA_HOME):

这是我目前的做法:

我的source~/.paths 在我的.bashrc 中。

.paths 包含我机器上安装的所有JDK

JDK7="~/local/jdk1.7.0_15"
JDK8="~/local/jdk1.8.0"
// I use Jdk 7 by default 
JDK_HOME=$JDK7;     
// including $JDK_HOME/bin to the $PATH

当我想切换到JDK8 时,我将JDK_HOME 变量修改为指向文件中的JDK8,然后我将re-source 指向我的.paths 文件。

我知道IDE 可以轻松管理多个JDK,但我想要一个类似rvm 的解决方案。

  • 还有什么更好的技巧吗?
  • 更好的是,Java 中有 rvm 的等价物吗?

【问题讨论】:

标签: java linux shell build rvm


【解决方案1】:

对于 Linux,您不仅可以使用 update-alternatives 设置 java、javac 和其他二进制文件的路径,还可以设置您的 JAVA_HOME。由于它所做的只是管理链接,因此您可以安装指向 jdk 目录的链接,然后将 JAVA_HOME 设置为指向该链接。例如,“update-alternatives --install /usr/lib/jdk jdk /path/to/jdk8 1”将安装一个指向您的 jdk 目录的链接。然后,您在 .bashrc、.profile 或您用来设置环境变量的任何文件中添加“将 JAVA_HOME 导出到 /usr/lib/jdk”,并且当您使用更新切换时,JAVA_HOME 将指向您以 jdk 名称安装的任何替代项-alternatives --config jdk。如果您已经为 java 可执行文件使用了替代品,则可以在 java 使用时使用 --slave 来制作 jdk。

【讨论】:

    【解决方案2】:

    如果您使用 Debian 或派生的 GNU/Linux 发行版,您可以使用更新选项来设置当您键入 java 时当前正在运行的内容。

    尝试输入

        update-alternatives --display java
    

    这将向您展示您有哪些可用的替代品。 这个命令是非破坏性的,也就是说,它不会改变任何东西。

        man update-alternatives
    

    将为您提供该工具的手册。 您可能想要的命令是:

        update-alternatives --config java
    

    这将为您提供一种简单的交互式方式来设置 java 程序。如果要编写脚本,也可以使用 --set。

    当然,如果没有跑男,你不应该相信我,因为人们有时会上网说谎。 ;)

    编辑:我忘了,this link 以一种很好的方式(如果特定于 Vi)引入了更新替代方案。

    【讨论】:

      【解决方案3】:

      我编写了自己的脚本来管理 java 版本。我使用一些需要 Oracle Java 并且通常需要最新版本的网站,所以我不能使用 apt/aptitude,因此不能使用 update-alternatives 或 jdk-manager(它使用 update-alternatives)。

      这是我的脚本。我不是专业开发的,所以它可能是一团糟,但它符合我的目的。它只考虑存储在 /usr/lib/jvm 中的 java 版本。

      #!/bin/bash
      
      # the proper way....
      # + update: update-alternatives only works for versions installed by apt or aptitude
      # ... same for jdk-manager (uses update-alternatives to do the heavy lifting)
      #echo "The proper way is:"
      #echo "$ update-alternatives --config java"
      
      #exit
      
      # the rest is (no longer) depreciated....
      
      echo "The current default java is $(readlink --canonicalize `which java`)"
      
      PS3='Select Java to install: '
      options=( $(find /usr/lib/jvm -iname java) )
      noptions=${#options[@]}
      (( loption=noptions-1 ))
      options[${#options[@]}]="Quit"
      
      select opt in "${options[@]}"
      do
        for i in $(seq 0 $loption); do
           [ "$opt" == "${options[$i]}" ] && \
              javapath=${options[$i]}
        done
        if [ "$javapath" ]; then
          break
        fi
        if [ "$opt" == "Quit" ]; then
              echo "Nothing installed."; 
              exit
        else 
              echo "Invalid option. Try another one.";
              continue
        fi
      done
      
      
      # remove the old link (might be superfluous)
      #rm -vf -- "$link"
      
      # set new link (symbolic, force, verbose)
      sudo ln -sTfv "$javapath" "/usr/bin/java"
      
      default_java_dir=$(echo "$javapath" | grep --only-matching --regexp="\/usr\/lib\/jvm\/[^\/]*")
      sudo ln -sTfv "$default_java_dir" "/usr/lib/jvm/default-java"
      
      java_bin_dir=$(echo "$javapath" | sed 's/[^\/]*$//')
      echo $java_bin_dir
      [ -f "${java_bin_dir}javac" ] && sudo ln -sfv -t "/usr/bin" "${java_bin_dir}javac"
      [ -f "${java_bin_dir}javadoc" ] && sudo ln -sfv -t "/usr/bin" "${java_bin_dir}javadoc"
      [ -f "${java_bin_dir}javafxpackager" ] && sudo ln -sfv -t "/usr/bin" "${java_bin_dir}javafxpackager"
      [ -f "${java_bin_dir}javah" ] && sudo ln -sfv -t "/usr/bin" "${java_bin_dir}javah"
      [ -f "${java_bin_dir}javap" ] && sudo ln -sfv -t "/usr/bin" "${java_bin_dir}javap"
      [ -f "${java_bin_dir}java-rmi.cgi" ] && sudo ln -sfv -t "/usr/bin" "${java_bin_dir}java-rmi.cgi"
      [ -f "${java_bin_dir}java_vm" ] && sudo ln -sfv -t "/usr/bin" "${java_bin_dir}java_vm"
      [ -f "${java_bin_dir}javaws" ] && sudo ln -sfv -t "/usr/bin" "${java_bin_dir}javaws"
      
      find_dir=$(dirname "$java_bin_dir")
      pluginpath=$(find "$find_dir" -name libnpjp2.so)
      
      #exit
      
      echo -n "Install $pluginpath as the Java plugin? [y/N]: "
      read
      response=$(echo $REPLY | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/')
      
      if [ "${response:0:1}" == "Y" ]; then
      
        # directories for plugins
      
        plugin_dirs="/usr/lib/firefox/plugins
                           /usr/lib/firefox-addons/plugins
                           /usr/lib/mozilla/plugins
                           /opt/google/chrome
                           /home/james/.mozilla/plugins"
      
      
        # first, clean out anything we might have improperly installed already
        echo "Using 'sudo' to remove any installed java plugins..."
      
        for pdir in $plugin_dirs; do
           sudo rm --verbose --force "$pdir/libjavaplugin_oji.so" "$pdir/libnpjp2.so" "$pdir/IcedTeaPlugin.so"
        done
      
        # okay, trying brute force and awkwardness....
        echo "Using 'sudo' to install \"$pluginpath\" in several places..."
      
        for pdir in $plugin_dirs; do
           sudo ln --symbolic --verbose --force "$pluginpath" "$pdir"
        done
      fi
      
      exit
      

      【讨论】:

        【解决方案4】:

        现在,我正在使用 jdk-manager,这是一个小 bash 脚本来管理多个 JDKS 安装。

        【讨论】:

          【解决方案5】:

          jdk_switcher 尽管它对于某些 ubuntu 路径是相当静态的 - 应该很容易修改它以从其他路径运行。

          计划让RVM 2 支持切换更多而不是Ruby 版本,您可以阅读更多关于它的信息here

          知道链接的任何人都可以发表评论。

          【讨论】:

          • RVM2 计划看起来很有希望,感谢@mpapis 的提及。
          【解决方案6】:

          我认为没有这样的解决方案。 请参阅此question 以获取带有符号链接的解决方案。

          【讨论】:

            【解决方案7】:

            您可以安装任意数量的 Java 版本。只需安装到您选择的文件夹并使用一些约定。

            如果您想一次性使用特定版本,请使用完整路径运行它(例如):

            >C:\java\jdk-6u35\bin\java.exe
            

            >/java/jdk-6u35/bin/java.exe
            

            如果您想更改为仅使用它,请更改路径以将您想要的版本放在前面。路径可能与上图类似。

            请务必更改 JAVA_HOME 以及包含对 java 位置的引用的任何其他环境设置。

            请注意,有些工具有内部配置来决定使用哪个 java 版本。 Eclipse 就是一个很好的例子。您必须设置一个 JVM 列表,然后为每个项目或所有项目选择一个。

            【讨论】: