89

当尝试在支持 bash 的最新 Windows 10 版本上使用 Oracle JDK 的 Linux 版本时,我遇到了一个问题,即每当尝试调用java二进制文件时提示挂起。

输入甚至像java -version挂起这样简单的东西,我必须终止进程才能恢复控制。

有人有这个工作吗?

4

13 回答 13

92

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

您将需要安装解压缩 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,您应该一切顺利。

于 2016-12-10T04:35:12.410 回答
68

正如@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
于 2017-08-10T08:34:46.953 回答
50

我一定错过了什么……我所做的只是:

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)
于 2017-06-01T13:36:48.817 回答
9

我使用了@fieldju 给出的脚本,但他错过了脚本所依赖的一些东西,并且复制/粘贴内容会导致 Windows 行尾/回车(/r)需要替换为 linux 返回。此外,我发现首先下载所需的 zip 并将它们放在脚本旁边要简单得多。这是我所做的完整列表:

  1. bash中,键入sudo apt-get install zip unzip以确保在您的bash控制台上安装了 unzip/zip
  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 行结尾,所以你只需要执行./java_install_predownloaded_unix_final.shbash观看魔术发生。嘿 Presto,您现在已经在 Windows 上的 bash 实例上安装了 java!
于 2017-02-08T10:21:10.127 回答
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. 接受许可

    图片

你完成了!检查您的 java 版本使用java -version和预期的输出应该是这样的:

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)

PS 在撰写本文时,稳定版 Oracle 9 JDK 已经发布,您可能可以调整上面的第 4 步。


参考:https ://poweruphosting.com/blog/install-java-ubuntu/

于 2017-10-24T03:45:01.437 回答
5

我在这里确认 Oracle JDK 版本 8u102、x64 for 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

我还没有机会真正强调这个安装,但这比以前的挂起要好。

于 2016-08-22T01:52:32.677 回答
5

似乎目前在 WSL 的 Build#14316 上安装 JDK8 不起作用。但是尝试安装 JDK7 对我来说效果很好。目前正在探索此安装的限制,并将继续发布。想法来自这里:https ://github.com/Microsoft/BashOnWindows/issues/196

于 2016-04-16T06:11:56.653 回答
4

很多答案都建议安装 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

华尔街日报:

javac.exe MyClass.java
java.exe MyClass

注意 WSL 需要.exe,因为它是 Windows 二进制文件。使用 OpenJDK 的 Linux 发行版时,不需要扩展。

于 2020-07-24T14:11:31.340 回答
2

这对我有用。不过,我不喜欢添加这些奇怪的存储库。Linux起义?如果微软能解决这个问题就好了。

sudo add-apt-repository ppa:linuxuprising/java
sudo apt update
sudo apt install oracle-java10-installer
于 2018-06-14T18:35:59.783 回答
1

它可能适用于 Insider Preview build 14905,但在 Windows 10 Pro build 14393 上挂起。问题的很大一部分是微软使用的是 Ubuntu 14.0.4。14.10 或更高版本可能会更好地支持 Java 8。

于 2016-09-25T18:45:31.647 回答
0

似乎是java oracle版本出现问题,我已经下载了openJDK版本,现在它可以工作了

于 2016-08-03T16:00:46.863 回答
0

我有同样的问题,但我用一个命令解决了它:

sudo apt upgrade

然后运行这 3 个命令:

sudo apt install default-jre
sudo apt install openjdk-11-jre-headless
sudo apt install openjdk-8-jre-headless
于 2019-10-09T12:07:14.883 回答
0

这已经参考了上述所有答案和评论,并试图将其放在一起作为完整的指导。

直接在 WSL2 Linux 中安装 jdk 很简单,因此我们在此处跳过此选项。

将 Windows JDK 与 WSL2 Linux 一起使用/共享是完全可以的,你只需要设置两件事,JAVA_HOMEPATH你的 Linux shell 配置文件中,在我的例子中,~/.bashrc.

第 1 步:检查您的 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

退出 nano 编辑器Ctrl/CMD + X

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

$ 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 定义为使用 jdk 的 Windows 安装

验证这一点:

$ 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. 设置别名来调用 java 就像你直接在 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 ://stackoverflow.com/a/64489793/3107052但是您真的不需要这个,因为这会赢除了告诉你从 Windows 借来的 java 在哪里之外,别无他法。

于 2022-03-03T23:24:26.810 回答