在Windows子系统中安装Oracle JDK

91

当我试图在支持Bash的最新Windows 10版本上使用Oracle的JDK Linux版时,当尝试调用java二进制文件时,我的提示符会出现挂起问题。

即使是输入如java -version这样简单的命令,也会出现卡顿的情况,我必须终止进程才能恢复控制。

有人已经解决了这个问题吗?


你需要安装Windows JDK/JRE。安装Ubuntu的命令行界面并不能让Linux JDK/JRE在Windows下运行。 - BillRobertson42
@Bill其实就是希望如此,因为Bash Shell的Windows版本只是一个包装器,为所有本地Ubuntu实用程序提供了Linux兼容的内核接口。那么JDK为什么会有所不同呢? - Saurabh Mishra
我的尝试以apt-get问题结束,尝试解决/proc。Oracle JRE可以很好地提取,但无法运行。 - Revoman
1
@Revoman,请查看 https://github.com/Microsoft/BashOnWindows/issues/49 上的讨论。似乎默认JDK的问题已经解决,您可以尝试使用apt-get安装它。另外,您提到的/proc问题是什么? - Saurabh Mishra
1
@SaurabhMishra,你能否将你选择的答案进行调整,因为现在这是可能的。 - fieldju
显示剩余6条评论
13个回答

93

我想澄清的是,截至2016年12月9日,您肯定可以在Windows 10的Ubuntu Bash上安装Java 8,并且@Karl Horton是正确的。

您需要安装unzip sudo apt-get install unzip

将此脚本复制到Bash for Windows会话中的某个位置,并使其可执行(chmod +x文件名)。如果您不使用基于命令行的编辑器(例如vim),则必须处理Windows行尾。您可以使用dos2unix或您喜欢的方式进行处理。我只是将其粘贴到使用vim的文件中。

 #!/bin/bash

set -ex

# UPDATE THESE URLs
export JDK_URL=http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
export UNLIMITED_STRENGTH_URL=http://download.oracle.com/otn-pub/java/jce/8/jce_policy-8.zip

# Download Oracle Java 8 accepting the license
wget --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" \
${JDK_URL}
# Extract the archive
tar -xzvf jdk-*.tar.gz
# clean up the tar
rm -fr jdk-*.tar.gz
# mk the jvm dir
sudo mkdir -p /usr/lib/jvm
# move the server jre
sudo mv jdk1.8* /usr/lib/jvm/oracle_jdk8

# install unlimited strength policy
wget --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" \
${UNLIMITED_STRENGTH_URL}
unzip jce_policy-8.zip
mv UnlimitedJCEPolicyJDK8/local_policy.jar /usr/lib/jvm/oracle_jdk8/jre/lib/security/
mv UnlimitedJCEPolicyJDK8/US_export_policy.jar /usr/lib/jvm/oracle_jdk8/jre/lib/security/

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/oracle_jdk8/jre/bin/java 2000
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/oracle_jdk8/bin/javac 2000

sudo echo "export J2SDKDIR=/usr/lib/jvm/oracle_jdk8
export J2REDIR=/usr/lib/jvm/oracle_jdk8/jre
export PATH=$PATH:/usr/lib/jvm/oracle_jdk8/bin:/usr/lib/jvm/oracle_jdk8/db/bin:/usr/lib/jvm/oracle_jdk8/jre/bin
export JAVA_HOME=/usr/lib/jvm/oracle_jdk8
export DERBY_HOME=/usr/lib/jvm/oracle_jdk8/db" | sudo tee -a /etc/profile.d/oraclejdk.sh

现在我可以做以下事情

fieldju@DESKTOP-LTL6MIC:~$ java -version
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)                                                

上面脚本中的链接和版本可能在您阅读此文时已过时,因此请直接访问http://www.oracle.com/technetwork/java/javase/downloads/index.html接受许可协议,以便他们的js让您复制新的URL,然后您就可以继续进行了。


5
请加上“需要安装unzip,因为它不是默认安装的”这句话到脚本说明中。 - River
在朋友的电脑上遇到了一个奇怪的主机问题,sudo: unable to resolve host DESKTOP-6PMR0AI - samthebest
现在JDK默认启用了无限制的加密。 - ChrisW
1
兄弟,你就是自动化的大神啊。 :) - Pasha
2
这个脚本非常棒。今天是2020年10月16日,我现在在我的Windows/Ubuntu shell中拥有jdk8。 - MAXdB
缺少一个小但重要的部分。这个脚本可以工作,但如果您已经安装了Java 11或15,则不会更改Java的默认版本。要更改默认版本,请运行“sudo update-alternatives --config java”。 - nsimeonov

69

据@noah-david建议,似乎在2017年8月份已经有了更简单的解决方案。

我能够从“WebUpd8”团队的软件仓库中安装Oracle JDK 8。

这些指示可用于添加该软件仓库:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update

安装方法:

sudo apt-get install oracle-java8-installer 
sudo apt install oracle-java8-set-default

安装完成后

costin@amanta-win:/mnt/c/work$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

costin@amanta-win:/mnt/c/work$ which java
/usr/bin/java

costin@amanta-win:/mnt/c/work$ uname -a
Linux amanta-win 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 
  x86_64 x86_64 x86_64 GNU/Linux

7
同意,这现在是最好的方法。安装oracle-java8-installer需要先添加webupd8team ppa:sudo add-apt-repository ppa:webupd8team/java - kaliatech
添加仓库返回“无法添加PPA:'ppa:~webupd8team / ubuntu / java'。 错误:“〜webupd8team”用户或团队不存在。” - Tim Holt
当我拼写团队名称错误时,@TimHolt也收到了同样的消息。 - Loic Lacomme
也许用户被删除了,因为我也有一个错误,显示它不存在。 - jcubic
11
由于Oracle从2019年4月16日开始更改许可证,这将不再有效-我宁愿使用Zulu或Corretto而不是使用此PPA-请参阅https://www.linuxuprising.com/2019/04/install-latest-openjdk-12-11-or-8-in.html获取有关安装Zulu SDK的详细信息。 - Agraj
我今天尝试了这种方法在WSL上安装Java 14.0.2,它成功了。可以参考以下文章:https://www.linuxuprising.com/2020/03/how-to-install-oracle-java-14-jdk14-on.html - chomprrr

53

我一定是漏了什么...我所做的只是:

sudo apt-get update
sudo apt-get install default-jdk

java -version

输出:

java version "1.7.0_131"
OpenJDK Runtime Environment (IcedTea 2.6.9) (7u131-2.6.9-0ubuntu0.14.04.2)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)

5
这应该是这样的!问题要求使用Oracle JDK,但您正在安装Open JDK。 - Teodor
2
如果您想要安装Oracle JDK,请输入sudo apt-get install oracle-java8-installer。 - Sterling Bourne
此外,这在Windows子系统中不起作用。或者说Linux子系统中的Windows,无论它被称为什么。 - Soren
8
在Windows 10 18.04上的Ubuntu 18.04中,我刚刚运行了sudo apt-get install default-jdk命令,并安装了OpenJDK 11。 - Steffen Roller
默认的 JDK 现在设置为 11,但如果需要安装 JDK 8 呢? - Shilan
这个问题涉及到Oracle JDK,而这个答案没有指出它并没有使用Oracle JDK,而是安装了Open JDK,并且没有解释它们之间的区别。请编辑答案以改进这一点,因为可能有人没有注意到这一点。 - Hassan

9
我使用了@fieldju提供的脚本,但他忽略了一些脚本所依赖的东西,而且复制/粘贴内容会导致Windows换行符(/r)需要替换为Linux换行符。此外,我发现先下载所需的zip文件并将它们与脚本放在一起更加直接。以下是我做的全部内容:
  1. bash 中输入 sudo apt-get install zip unzip 确保 unzip/zip 已安装在您的 bash 控制台上。
  2. oracle网站下载最新的Linux版本Java JDK(我的系统是64位的,所以我选择了“Linux x64”),并将其保存在您可以在 bash 中访问的计算机上的某个文件夹中。注意:不要更改文件名,以确保它与脚本一起工作。
  3. 在与上一个zip文件相同的文件夹中单独下载无限强度策略,同样确保您保持文件名不变。
  4. 将以下脚本复制并粘贴到记事本中,并将其保存为java_install_predownloaded.sh,放在与zip文件相同的文件夹中:

脚本:

#!/bin/bash

# Extract the archive
tar -xzvf jdk-*.tar.gz

# mk the jvm dir
sudo mkdir -p /usr/lib/jvm
# move the server jre
sudo mv jdk1.8* /usr/lib/jvm/oracle_jdk8

# install unlimited strength policy
mv UnlimitedJCEPolicyJDK8/local_policy.jar /usr/lib/jvm/oracle_jdk8/jre/lib/security/
mv UnlimitedJCEPolicyJDK8/US_export_policy.jar /usr/lib/jvm/oracle_jdk8/jre/lib/security/

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/oracle_jdk8/jre/bin/java 2000
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/oracle_jdk8/bin/javac 2000

sudo echo "export J2SDKDIR=/usr/lib/jvm/oracle_jdk8
export J2REDIR=/usr/lib/jvm/oracle_jdk8/jre
export PATH=$PATH:/usr/lib/jvm/oracle_jdk8/bin:/usr/lib/jvm/oracle_jdk8/db/bin:/usr/lib/jvm/oracle_jdk8/jre/bin
export JAVA_HOME=/usr/lib/jvm/oracle_jdk8
export DERBY_HOME=/usr/lib/jvm/oracle_jdk8/db" | sudo tee -a /etc/profile.d/oraclejdk.sh

这段代码是修改版,基于 @fieldju 的版本,假设 zip 文件已经下载并与该 .sh 文件在同一文件夹中。

  1. 因为该文件带有 Windows 回车符,您需要确保将其替换,所以在 bash 中导航到保存了 java_install_predownloaded.sh 的位置,然后运行以下命令:

    sed 's/^M$//' java_install_predownloaded.sh > java_install_predownloaded_unix.sh

我还运行了以下内容,以确保没有来自 Windows 的行尾:

sed 's/\r$//' java_install_predownloaded_unix.sh > java_install_predownloaded_unix_final.sh

  1. 运行这两行命令后,文件夹中将会出现一个名为 java_install_predownloaded_unix_final.sh 的文件,这是我们“清理”后的版本,不包含 Windows 行尾,所以您只需在 bash 中执行 ./java_install_predownloaded_unix_final.sh,就能看到魔法发生了。嘿,您现在已经在 Windows 上的 bash 实例中安装了 Java!

顺便说一下,如果您使用vim或您选择的基于命令行的编辑器创建脚本,则不会添加Windows行结尾符。但是,如果您使用记事本或其他基于Windows的编辑器,则需要注意这些问题。我刚刚重新安装了Windows,并不得不参考自己的帖子来恢复我的开发环境。 :) - fieldju

6
在Bash(Windows 10)上进行Oracle JDK 8新安装的步骤如下:
  1. sudo apt-get install python-software-properties

  2. sudo add-apt-repository ppa:webupd8team/java

  3. sudo apt-get update

  4. sudo apt-get install oracle-java8-installer

  5. 接受许可证

    Image

完成了!使用java -version检查您的Java版本,预期输出应如下所示:
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

附言:在撰写本文时,稳定版本的Oracle 9 JDK已发布,您可能需要微调上述第4步。


5
我在这里确认,Oracle JDK Version 8u102, x64适用于Linux的安装程序可以正常安装在2016年8月16日发布的Windows 10 Insider Build 14905上。 在接受许可后,可以从此处下载
C:\>systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
OS Name:                   Microsoft Windows 10 Pro Insider Preview
OS Version:                10.0.14905 N/A Build 14905

我遵循了这里的说明:wikiHow Oracle Java Install
$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

$ javac -version
javac 1.8.0_102

我还没有真正测试过这个安装,但是这比以前的卡顿要好。


我还没有尝试过你的安装说明,但是从webupd8team/java ppa安装它并不起作用。 - cheolho minale

5

1
我的猜测是它与Java 8中默认运行时的新JavaFX UI有关。Java 7也支持JavaFX,但该jar文件不会被默认加载。 - 11101101b
作为对于面临相同问题的人们的最新状态更新,这个问题似乎已经通过Windows更新得到了解决。我现在可以无问题地运行oracle-jdk8。 - John Jones

5
很多答案都建议安装Linux JDK,即使他们已经有了完好的Windows JDK。WSL的美妙之处在于它可以防止你像这样做一些事情,因为文件系统是可互操作的。只要考虑到文件扩展名(如下所述),你只需在特定情况下安装两者。
简单方法
你可以通过将以下代码行添加到你的.bashrc文件中来完成这个简单的过程,假设你的Windows环境变量已正确设置并且已安装WSL:
# Shared environment variables
export JAVA_HOME=/mnt/d/Java/jdk11.0.4_10

请确保更改目录以指向您的JDK文件夹。在我的情况下,它位于D:\Java\jdk11.0.4_10,在WSL中为/mnt/d/Java/jdk11.0.4_10

另外,由于您正在使用Windows二进制文件,在从WSL bash shell运行时必须指定文件类型:

示例

调用Windows JDK 来自:

CMD

javac MyClass.java
java MyClass

WSL:

javac.exe MyClass.java
java.exe MyClass

注意:由于WSL是一个Windows二进制文件,因此需要.exe。当使用OpenJDK的Linux版本时,不需要任何扩展名。


2

这对我很有用。虽然,我不喜欢添加这些奇怪的仓库。Linuxuprising?如果微软能够修复这个问题就太好了。

sudo add-apt-repository ppa:linuxuprising/java
sudo apt update
sudo apt install oracle-java10-installer

1

根据以上所有答案和评论,我们试着把它们结合起来形成一份完整的指南。

在WSL2 Linux中直接安装JDK非常简单,因此我们跳过这个选项。

可以完全使用/共享Windows JDK与WSL2 Linux,只需要在Linux shell配置文件(例如我的~/.bashrc)中设置两个东西:JAVA_HOMEPATH

步骤1:检查Windows Java位置

默认情况下,Windows Java安装在此处(版本可能不同):C:\Program Files\Java\jdk1.8.0_321

在WSL2中,可以通过以下格式访问此Windows文件位置:/mnt/c/Program Files/Java/jdk1.8.0_321

因此,

步骤2:将其加载到您的shell配置文件中,

编辑此文件,

$ sudo nano ~/.bashrc

在底部添加以下内容:

export JAVA_HOME="/mnt/c/Program Files/Java/jdk1.8.0_321"
export PATH=$JAVA_HOME/bin:$PATH
export alias java='java.exe'
export alias javac='javac.exe'

通过 Ctrl/CMD + O 保存,然后按 Enter

通过 Ctrl/CMD + X 退出 nano 编辑器

刷新配置文件以加载添加的变量,使用

$ source ~/.bashrc

完成了。您现在可以通过执行

$ java -version

来验证它是否正常工作。它会给你类似于以下的输出:

java version "1.8.0_321"
Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)

摘要

在这里你总共做了三件事情:

  1. 将你的$JAVA_HOME设置为使用Windows上安装的jdk

验证方法如下:

$ echo $JAVA_HOME
/mnt/c/Program Files/Java/jdk1.8.0_321
  1. 定义了一个用户范围的 $PATH 变量,让应用程序知道在哪里找到 Java 编译器

验证方法如下:

$ echo $PATH
/mnt/c/Program Files/Java/jdk1.8.0_321/bin:...
  1. 设置别名以便像在Linux上直接调用java一样调用它,而不是使用java.exe

验证方法:

$ java -version
java version "1.8.0_321"
Java(TM) SE Runtime Environment (build 1.8.0_321-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode)

不幸的是,这会让你执行类似于which java的操作。为了像本机Linux软件一样执行此操作,您可能需要按照此处的进一步步骤(未经验证): https://dev59.com/uV4d5IYBdhLWcg3wAOVw#64489793 但实际上您并不需要这样做,因为这只能告诉您从Windows借来的java在哪里,没有其他作用。


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