编者注:这个问题是在2014年提出的,答案可能已经过时了。


我想用最新的JavaFX编程,它需要Java 8。我使用的是IntelliJ 13 CE和Mac OS X 9 Mavericks。我运行了Oracle的Java 8安装程序,文件看起来像是在

/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk

但以前的版本是

/System/Library/Java/JavaFrameworks/jdk1.6....

不知道为什么最新的安装程序把这个放在/Library而不是/System/Library(也不知道有什么区别)。但是/usr/libexec/java_home找不到1.8,所以我找到的所有关于如何设置当前java版本的帖子都不起作用。我已经尝试添加了一个符号链接,使它看起来像1.8在/System/Library中…路径,但没有用。/usr/libexec/java_home -V仍然只列出旧的Java 1.6。

讽刺的是,在“系统首选项”下的“Java”控制面板只显示Java 1.8!

为什么Oracle的安装程序不把它放在它真正应该去的地方?我该如何解决这个问题呢?


当前回答

Oracle在简化Java安装和配置方面的记录很差,但使用Homebrew,最新的OpenJDK (Java 14)可以安装:

brew install --cask adoptopenjdk8

对于依赖于旧版本(通常是Java 8)的许多用例,AdoptOpenJDK项目通过一个额外的步骤使之成为可能。

brew tap adoptopenjdk/openjdk
brew install --cask adoptopenjdk8

现有的Homebrew用户可能会遇到错误:Cask adoptopenjdk8存在于多个点击中,这是由于之前使用不同指令的解决方案。这可以通过使用brew install——cask adoptopenjdk/openjdk/adoptopenjdk8完全指定位置来解决。

其他回答

使用Homebrew安装

在2018年10月3日之前,Homebrew Cask中可用的Java版本确实是Oracle JVM。但是现在,它已经更新为OpenJDK。请确保更新Homebrew,然后您将看到可供安装的最新版本。

1. 如果你还没有安装Homebrew。确保已更新:

brew update

2. 添加桶龙头,如果你还没有(或者你在步骤3中没有看到旧的Java版本):

brew tap homebrew/cask-versions

3.对于AdoptOpenJDK版本,添加tap:

brew tap adoptopenjdk/openjdk

这些桶经常更改其Java版本,并且可能还有其他带有额外Java版本的水龙头。

4. 寻找可安装的版本:

brew search java 

或AdoptOpenJDK版本:

brew search jdk     

5. 检查将要安装的版本的详细信息:

brew cask info java

或AdoptOpenJDK版本:

brew cask info adoptopenjdk

6. 安装特定版本的JDK,如java11、adoptopenjdk8,或者当前只安装java或adoptopenjdk。例如:

**brew cask install java**

**brew cask install java8**

**brew cask install java11**

您也可以使用旧版本的完全限定路径:

brew cask install homebrew/cask-versions/java11

我也有同样的问题要解决,因为我需要安装JDK8来运行Android SDK管理器(因为它似乎与JDK9不太配合)。 然而,我告诉你我是如何解决Mac (Sierra)上的所有问题的。

首先,你需要和cask和jenv一起酿酒。

You can find an useful guide here,Homebrew Cask Installation Guide. Remember to tap 'caskroom/versions' running in the terminal: brew tap caskroom/versions After that, install jenv with: brew install jenv Install whatever version you want with cask brew cask install java8 (or java7 or java if you want to install the latest version, jdk9) The last step is to configure which version to run (and let jenv to manage your JAVA_HOME) jenv versions to list all versions installed on your machine and then activate the one you want with jenv global [JDK_NAME_OF_LIST]

你可以在这个Github Gist brew-java-and-jenv上找到其他有用的信息。在Mac和Jenv网站上安装多个JDK

博士tl;

/Library/Java/JavaVirtualMachines/是要安装JVM的正确位置。这种情况已经持续好几年了。许多年前,其他地点也被使用过,但现在不再使用了。

你可以从几家供应商中选择一个安装程序,在你的Mac上安装Java实现。下载一个安装程序在本地运行,然后丢弃,就像你通常对许多应用程序所做的那样。

你的问题提到了JavaFX/OpenJFX。您可能会发现使用与OpenJFX库绑定的Java实现非常方便,例如BellSoft的LibericaFX或Azul Systems的ZuluFX。

使用安装程序,卢克

对我来说,其他建议Homebrew包管理器的答案似乎有点极端。我相信Homebrew有一些很好的用途。但要简单地运行Java或进行Java编程,安装Homebrew是不必要的额外步骤。为了获得Java而安装Homebrew(包管理器)就像建造一个跑道来停放汽车,而不是使用车道。如果你已经有了,很好,使用它。但是向那些仅仅需要Java的人推荐Homebrew是一个糟糕的建议。

还没有使用Home-brew的用户可以从可信来源下载Mac安装程序。

你有多个来源可以获得一个易于使用的安装程序,将Java安装到你的Mac上。在你的Mac上运行安装程序,就像运行许多其他应用程序一样。

下面是寻找Java 11源代码的流程图,其中一些也提供Java 8。

从供应商那里下载安装程序,比如Adoptium(AdoptOpenJDK.net)。

运行安装程序。

JavaVirtualMachines文件夹现在是正确的

为什么Oracle的安装程序不把它放在它真正应该去的地方?我该如何解决这个问题呢?

没问题。

文件夹/Library/Java/JavaVirtualMachines/是macOS上jvm的新主页。

要安装JVM,请使用下面讨论的安装程序。

要卸载,只需使用Finder从该文件夹中删除JVM。系统将提示您输入系统管理员密码以完成删除。


Java 9 & 10 & 11

早在2010年,苹果与Oracle、IBM、Red Hat、Azul和其他Java供应商一起加入了OpenJDK项目。每个成员都为统一的OpenJDK代码库贡献源代码、测试和反馈。

苹果为其JVM贡献了大部分mac专用代码。现在苹果不再发布自己的mac专用JVM。现在您可以选择JVM供应商,构建来自OpenJDK代码库。

你可以在http://openjdk.java.net上找到源代码

新的发布节奏

请注意,在2017年,Oracle、JCP和OpenJDK已经采用了一种新的快速“发布培训”计划,以可预测的方式定期发布Java版本。

请阅读这篇2018-07 Azul Systems博客文章,Simon Ritter撰写的《消除Java更新困惑》,了解更多细节。

请阅读Java仍然是免费的。

供应商

有关过去和现在JVM实现的详细列表,请参阅Wikipedia的这个页面。

下面是对一些供应商的讨论。有关更多供应商,请参阅上面的流程图

甲骨文JDK

Oracle为包括macOS在内的多个平台提供JDK和JRE安装程序。

在收购Sun的这些年里,Oracle将这两个JVM引擎HotSpot和JRocket最好的部分结合在一起,并将它们合并到OpenJDK项目中,作为他们自己品牌的Java实现的基础。

从2018年开始,他们的新商业计划是在生产中收费提供oracle品牌的Java实现,在开发/测试/演示中免费使用。对以前版本的支持需要付费支持计划。他们已经宣布,他们的品牌发行版将与OpenJDK发行版具有相同的特性。他们甚至将自己的商业插件(如Flight Recorder)捐赠给了OpenJDK项目。

Oracle还发布了一个不支持OpenJDK的版本:http://jdk.java.net/

Oracle开发了一个特殊用途的JDK GraalVM。

祖鲁与叮合一

Azul Systems提供了多种JVM产品。

他们的Zulu系列直接基于OpenJDK,并且是免费的,有可选的付费支持计划。 他们的Zing产品线提供了商业JVM产品,增强了替代技术实现,如专门的垃圾收集器。

他们的两个产品线都提供macOS的安装程序。

我目前在macOS High Sierra上使用Zulu for Java 10.0.1,使用IntelliJ 2018.2和Vaadin 8。我从这个页面下载的。顺便说一句,我在苹果系统首选项应用程序中没有发现任何与java相关的项目。

Adoptium,以前称为AdoptOpenJDK,是由社区领导的构建OpenJDK源代码二进制文件的努力。在Adoptium中,许多其他Java实现供应商都支持这项工作。

您可以选择HotSpot或OpenJ9引擎。 可用于macOS、Linux和Windows以及其他平台的构建。

Eclipse的OpenJ9

OpenJ9项目是JVM引擎的另一种实现,是HotSpot的替代方案。

现在由Eclipse基金会赞助,IBM于2017年捐赠了技术和支持。

对于预构建的二进制文件,它们建议您参考上面提到的AdoptOpenJDK项目。


如何安装

Oracle或Azul提供的安装程序操作起来都非常简单。只要在Mac上运行安装程序,就会出现一个窗口显示安装进度。

完成后,通过以下方法验证JVM安装:

访问/Library/Java/JavaVirtualMachines/文件夹以查看新JVM的项目。 运行一个控制台,如Terminal。然后输入java -version查看JVM的品牌和版本号。

验证成功后,在Finder中卸载.dmg映像。然后丢弃您下载的.dmg文件。

对于在我的本地计算机上运行应用程序,我开始真正喜欢的一个选项是使用Docker。你可以简单地在官方的JDK容器中运行你的应用程序——这意味着你不必担心在本地机器上设置一切(或者为不同的应用程序运行多个不同版本的JDK等)。

虽然这可能不会帮助您解决当前的安装问题,但这是一种解决方案,意味着您可以避开与试图在开发机器上正确运行Java相关的问题的雷区!

好处是:

不需要在您的本地机器上设置任何版本的Java(您只需要在从Docker Hub中取出的容器中运行Java即可) 只需更改容器上的标记,就可以轻松切换到不同版本的Java。 项目依赖项安装在容器中——所以如果你搞砸了你的配置,你可以简单地破坏容器并重新开始。

一个非常简单的例子:

创建Dockerfile:

FROM java:8
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp

这里我们指定运行SDK版本8的Java容器(Java:8 -要使用Java 7,您只需指定:Java:7) 我们将本地目录映射到容器内的目录:/usr/src/myapp

创建一个docker-compose。yml文件:

version: "2"

services:
  java:
    build: .
    volumes:
      - .:/usr/src/myapp

现在,假设我们有这个Java文件:

HelloWorld.java

public class HelloWorld {
    public static void main(String[] args) {        
        System.out.println("Hello, World");
    }
}

所以我们有如下的文件结构:

.
|_ Dockerfile
|_ docker-compose.yml
|_ HelloWorld.java

你可以做各种Java的事情,比如:

编译:

docker-compose run --rm java javac HelloWorld.java 

您应该注意到,HelloWorld.class显示在您的当前目录中(这是因为我们已经将当前目录映射到代码所在的容器内的位置

run:

docker-compose run --rm java java HelloWorld 

注意:第一次运行时,它将获取图像等。这需要一段时间,因为这只是第一次发生 Docker-compose run——从容器内部运行命令 -rm告诉docker在命令运行完成后删除容器 Java是服务/容器的名称(来自我们的docker-compose文件),该命令将对其运行 这一行的其余部分是在容器中运行的命令。

这是一种非常酷的方式,可以为不同的应用程序运行不同版本的Java,而不会使您的本地设置完全混乱:)。

下面是一个稍微复杂一点的例子,它有Maven和一个简单的Spring应用程序

免责声明:

我还没有在IntelliJ这样的IDE中真正尝试过这一点——所以不完全确定这方面的事情将如何工作。虽然看起来docker支持即将到来 下面是一个使用Spring Boot、Zuul和Docker运行微服务的复杂示例

如果你使用它不是为了个人用途,你可能想要使用OpenJDK来避免来自Oracle的任何潜在诉讼。

brew cask install adoptopenjdk8