2.1 JDK

要进行JVM开发,必须安装JDK。JDK包含Java运行时环境(Java Runtime Environment,JRE)、Java编译器以及各种开发工具(本章将介绍其中的一些)。即便你的大部分开发工作都将使用其他语言而不是Java来完成,也强烈建议你安装完整的JDK,因为很多重要的开发工具都必须安装完整的JDK才能运行。另外,你迟早都将用到一些只有JDK才有的工具。

安装较新的用于Raspberry Pi的Linux发行版时,如果使用默认的Raspian安装选项,将自动安装Java SE Embedded 8 JDK,但提供的版本通常不是最新的。其他主要的操作系统默认安装的JDK如何不得而知。本节介绍如下与JDK相关的主题:

  • 安装JDK(Windows、macOS和Linux);
  • 探索JDK;
  • JRE。

2.1.1 安装JDK

这里只介绍如何安装Oracle的JDK 8实现。如果你已安装与Java SE 8平台完全兼容的JDK实现,包括开源的OpenJDK 8或IBM的J9 JDK 8,通常也完全可行,因此你可以跳过本节。

2.1 JDK - 图1 非Oracle的JDK实现并不一定包含本书讨论的所有功能,必要时我们将指出例外情况。

无论你使用的是哪种操作系统,都必须创建一个名为JAVA_HOME的环境变量,并让它指向JDK安装目录(在非开发计算机中为JRE所在的目录)。对于本书涵盖的操作系统(Windows、macOS和Linux),我们将说明如何创建这样的环境变量。很多重要的JVM工具都要用到这个变量,包括构建工具和应用程序服务器。本节将介绍如何完成如下工作:

  • 下载JDK;
  • 在Windows系统中安装JDK;
  • 在macOS系统中安装JDK;
  • 在Linux系统中安装JDK;
  • 下载Javadoc API文档。

  • 下载JDK

Oracle提供的用于Windows、macOS和Linux的JDK实现可从Oracle网站下载。对于有些平台,只有64位的JDK,而对于其他平台,有32位和64位的。

使用你喜欢的浏览器访问Oracle的Java主页(http://www.oracle.com/java),如下图所示。

2.1 JDK - 图2

要下载JDK,需执行如下步骤。

(1) 本书编写期间,该网页包含一个Java for Developers,单击该按钮将进入Software Downloads部分。

(2) 在列表中找到并单击Java SE(包含JavaFX)。如果它旁边有链接Early Access,请注意不要单击该链接。

(3) 进入Java SE Downloads页面。单击JDK下方的Download按钮。

(4) 根据你使用的操作系统平台和体系结构,找到并单击相应的版本。

(5) 如果你同意了许可条款,将下载相应版本的JDK。

  • 在Windows系统中安装JDK

对于Windows操作系统,JDK有32位和64位的版本。你只需运行下载的可执行文件并按说明做即可。请将JDK安装路径记录下来,因为后面要用到。

请使用默认设置,这将随JDK安装JRE。强烈建议确保JRE和JDK的版本同步,因此使用JDK安装程序安装JRE是最佳选择。Oracle指出JDK始终是在系统级安装的,因此其他所有用户都可使用它。

安装完毕后,需要添加或修改一些环境变量。这里介绍如何在Windows 10中这样做,如果你使用的是其他较新的Windows版本,做法应与之类似。

(1) 右击Windows“开始”按钮并选择“系统”,在出现的窗口中,单击左边的“高级系统设置”。

(2) 这将打开“系统属性”对话框。单击“环境变量”按钮,这将打开如下图所示的“环境变量”对话框:

2.1 JDK - 图3

(3) 在这个对话框底部的“系统变量”部分查找变量JAVA_HOME。如果没有找到,就单击按钮“新建”,否则对既有的JAVA_HOME进行编辑。

(4) 将变量名设置为JAVA_HOME,并将值设置为JDK安装目录的完整路径,再单击“确定”按钮关闭打开的对话框。

(5) 找到既有的变量Path,并在其中添加JDK安装目录下的子目录bin的完整路径;别忘了用字符;将不同的目录分隔。

为验证安装,可执行如下步骤。

(1) 打开一个命令提示符窗口(为此,可单击“开始”按钮,输入cmd并按回车键)。

(2) 输入javac -version并按回车键。

你将看到一个版本号,它与下载的JDK版本相同。如果不是这样,请核实你是否正确地修改了环境变量,并确保你新打开了一个命令提示符窗口,而不是使用以前打开的命令提示符窗口。

  • 在macOS系统中安装JDK

请注意,要安装JDK,使用的macOS版本必须是较新的。在本书编写期间,JDK 8要求macOS版本至少为10.8(Mountain Lion)。

在macOS系统中安装JDK很容易,只需双击下载的映像(.dmg)文件,再在出现的Finder窗口中双击包图标,然后按说明做即可。与Windows系统中一样,在macOS系统中,JDK也是在系统级安装的,因此可供所有用户使用。

安装完毕后,需要确保新安装的JDK是默认使用的JDK。macOS支持同时安装多个JDK版本,你可在不同的版本之间切换,但只有一个版本处于活动状态。要切换到新安装的JDK版本,最简单的办法是打开位于你的Home文件夹中的文件.bash_profile(请注意这个文件名以句点打头),并在其中添加如下行:

  1. export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"

要验证安装,可执行如下操作:

  • 打开一个新的Terminal窗口;
  • 在其中输入javac -version并按回车键。
    显示的版本号应与你下载的JDK版本相同。
  • 在Linux系统中安装JDK

Linux JDK有32位和64位版本,可以如下格式下载它们:

  • 下载压缩的.tar.gz文件,用于手动安装;
  • 下载RPM包管理器(RPM Package Manager)文件(.rpm),用于在支持这种打包格式的Linux中安装JDK。
    Oracle认证了多个可安装JDK的Linux发行版。在本书编写期间,各种Oracle Linux、Red Hat和Ubuntu都通过了认证。即便你使用的不是这些Linux发行版,也并不意味着你的计算机不能运行JDK和JVM,而只是意味着没有得到Oracle的官方支持。

本节只介绍如何在Ubuntu系统中安装JDK。Ubuntu没有提供原生的RPM格式支持,因此如果你使用的是Ubuntu,推荐下载.tar.gz文件。在Linux系统中,虽然并非必须在系统级安装JDK,但这里将这样做。如果你使用的Linux发行版支持RPM或不支持后面用到的一些命令,请参阅Java SE Downloads页面中的链接Installation Instructions。

打开一个新的Terminal窗口,切换到下载的.tar.gz文件所在的目录,并输入如下命令:

  1. su
  2. tar xvfz jdk-VERSION-linux-x64.tar.gz
  3. ls
  4. mv jdk1.VERSION /usr/local/

对这些命令说明如下。

  • 这要求你有系统根密码。如果没有这样的密码,请将su替换为sudo -s,但仅当你有根权限时,命令sudo -s才管用。
  • 必须将VERSION替换为你下载的JDK的版本号。
  • 这里假定平台是64位的(x64),如果你下载的是32位版本,请将x64替换为i586
    请注意,在最后一个命令中,你移动的是从下载的文件.tar.gz解压缩得到的目录(而不是这个文件本身)。另外,VERSION格式的目录不同于下载的文件。请将/usr/local/jdk1.VERSION的完整路径复制到剪贴板或记录下来,因为下一步需要用到。

现在来设置环境变量JAVA_HOME。我们希望Terminal为每位用户自动加载这个环境变量:

  1. nano /etc/profile

滚动到这个文件末尾,并添加如下内容(将JAVA_HOME=后面的内容替换为前面复制到剪贴板中的路径):

  1. JAVA_HOME=/usr/local/jdk1.VERSION
  2. export JAVA_HOME

按Cltrl + X并选择Y来保存所做的修改,再按回车确认文件名。

最后,你需要向Ubuntu注册JDK和JRE命令。通过在Terminal窗口中输入如下命令,将为两个最重要的命令创建合适的符号链接:java(用于运行JVM应用程序)和javac(用于运行Java编译器):

  1. . /etc/profile
  2. update-alternatives --install "/usr/bin/java" "java" $JAVA_HOME/bin/java 1
  3. update-alternatives --install "/usr/bin/javac" "java" $JAVA_HOME/bin/javac
  4. 1

其中第一个命令重新加载修改后的文件/etc/profile,以便能够使用变量JAVA_HOME。请注意这个命令开头的句点。

2.1 JDK - 图4 如果要使用JDK子目录bin中的其他命令,对于每个这样的命令,都必须以根用户的身份在Terminal中执行相应的update-alternatives命令。

执行命令exit两次将Terminal窗口关闭,再重新打开Terminal窗口(这次无需根权限),并输入如下命令来验证安装:

  1. javac -version

如果一切顺利,将出现与下载的JDK版本相同的版本号。

  • 下载API文档

Oracle提供了完整的Java类库API在线文档。对于Java 8,要查看这种文档,可访问https://docs.oracle.com/javase/8/docs/api/

在本地有该文档的副本很有帮助,Oracle认识到了这一点并提供了下载。

  • 访问Java SE Downloads页面(有关如何访问这个页面,请参阅“下载Download”一节)。
  • 找到Additional Resources部分,并单击Java SE 8 Documentation旁边的Download 按钮。
  • 如果你接受许可协议,就可下载相应的ZIP文件。
    将这个文件解压缩到方便的位置,再使用你喜欢的浏览器打开子目录docs中的文件index.html。

2.1 JDK - 图5 如果你要使用工具包JavaFX创建桌面GUI应用程序,也应从这个下载页面下载JavaFX API文档。

2.1.2 探索JDK

JDK最重要的组件如下:

  • java(用于运行编译后的JVM应用程序,即便这种应用程序不是使用Java编写的);
  • javac(Java语言编译器)。

JDK并非只包含这两个组件;本节将介绍JDK的目录结构并概述目录bin中最重要的命令。

  • 目录结构

要熟悉JDK,了解其目录结构大有裨益。下面以图形方式概述了JDK安装目录包含的子目录:

2.1 JDK - 图6

下表更详细地说明了这些子目录。

目录名描述 bin子目录bin包含JDK提供的所有可执行命令,接下来将讨论其中最重要的命令 db与JavaDB组件相关的东西都存储在这里。JavaDB是Oracle支持的数据库项目Apache Derby,这是一个开源的基于文件的关系数据库系统,提供了强大的SQL支持。它完全是使用Java实现的。JDK 9删除了这个组件,但感兴趣的读者依然可以从Derby网站(https://db.apache.org/derby/)下载它 include这个目录是为高级程序员准备的,其中包含供C语言编译器使用的头文件,可在Java代码中使用它们来调用随平台或操作系统而异的原生代码,或反之 jre这里存储了所有与JRE相关的文件,包括Java类库。请注意,目录jre/bin中的所有命令也都包含在JDK安装目录下的子目录bin中 lib这里存储了供一些开发工具使用的库

  • JDK命令

目录bin包含JDK提供的主要的命令行驱动命令。下表列出了其中最重要的命令,但并非所有这些命令都会在本书中做进一步的讨论。

可执行的命令描述 java加载一个JVM实例并启动在命令行中指定的程序,本章后面将更详细地讨论它。在Windows系统中,它将在运行应用程序时打开一个控制台文本窗口 javac这是Java语言编译器 javadoc从Java源代码文件中提取并生成文档,将在下一章简要地讨论 javap对编译后的Java代码进行反汇编,生成类似于Java字节码的易于理解的文本格式 javaw只有Windows版JDK和JRE提供了这个命令,它与命令java相同,但不会打开额外的窗口。如果启动的应用程序有桌面GUI,应用程序仍将在独立的窗口中打开 jar用于创建JAR归档文件、从JAR归档文件中提取数据以及在其中添加文件的工具。JAR归档文件将在本章后面更详细地介绍 jarsigner通过添加数字签名来保护JAR文件。如果JAR文件的数据被修改,但签名没有相应地更新,文件将被视为无效的 jdeps输出编译得到的.class文件或JAR文件的依赖信息 jjs激活Oracle Nashorn的交互式解释器shell。Oracle的JavaScript解释器为Nashorn,将在附录中讨论

请注意,目录bin还包含这里没有列出的其他命令,它们大都仅供高级用户使用。

  • GUI监视工具

子目录bin中包含上表未列出的三个工具,这里有必要说一说。不同于其他命令,这些命令提供了完整的桌面GUI:

  • Java VisualVM;
  • Oracle Mission Control;
  • JConsole。

2.1 JDK - 图7 只有Oracle的JDK实现包含这三个工具。开源实现OpenJDK不包含Oracle Mission Control,而IBM J9 JDK不包含上述任何工具。

(1) Java VisualVM

在8.0版之前,Oracle JDK和OpenJDK都包含Java工具VisualVM。VisualVM是一个开源工具,用于监视所有运行JVM应用程序的JVM实例,你可以通过安装插件来进一步改进其内置功能。如果你使用的是Oracle JDK 9或OpenJDK 9,可以从https://visualvm.github.io/index.html下载这个开源工具。

要使用默认设置启动VisualVM,可执行如下命令:

  1. jvisualvm

这将首先出现一个启动窗口,过段时间后再出现VisualVM主窗口。VisualVM不仅能够连接到网络服务器上运行的JVM实例,还能连接到本地运行的JVM实例。在下面的屏幕截图中,监视的是本地运行的NetBeans IDE实例:

2.1 JDK - 图8

要设置JVM实例以便进行远程监视,需要费点劲,这不在本书的讨论范围内,但JDK文档的VisualVM部分做了详细说明。

2.1 JDK - 图9 实时监控将消耗大量的系统资源。仅当在开发环境中才应考虑对本地进程进行监控。远程监控消耗的服务器资源要少些,但也相当可观。

(2) Oracle Mission Control

较新的Oracle JDK版本都自带了Oracle Mission Control,这也是一个监视JVM实例和应用程序的工具。Oracle Mission Control提供的用户界面比Java VisualVM还好,但很多功能都与VisualVM类似,包括实时监控正在运行的JVM实例和应用程序。

Oracle Mission Control是款专用软件,其许可条款比较复杂。其大部分功能都可在开发和生产环境中免费使用,但其独特的功能Java Flight Recorder只能在开发环境中免费使用。要在生产环境中使用Java Flight Recorder,必须有付费从Oracle获得的许可密钥。

要运行Oracle Mission Control,可执行如下命令:

  1. jmc

通过使用Java Flight Recorder,可记录JVM在指定时段内发生的事件。记录过程结束后,可对记录的所有数据进行分析。Java Flight Recorder的优点在于,开销比Oracle Mission Control和VisualVM的实时监控功能都低得多,因此在生产系统中使用它要安全得多(但别忘了其许可条款)。在下面的屏幕截图中,使用Flight Recorder对NetBeans IDE进程监视了1分钟。

2.1 JDK - 图10

(3) JConsole

JConsole是最古老的监视工具,JDK在很久前就提供了它。相比于JConsole,Java VisualVM和Oracle Mission Control提供的功能都更丰富,GUI也更友好,因此建议你不要使用JConsole,而使用其他工具。

如果你一定要使用JConsole,可使用如下命令来启动它:

  1. jconsole

2.1.3 JRE

如果只想在计算机上运行Java程序,可只安装JRE,这将安装用于启动JVM实例的命令java以及完整的Java类库。JRE用于启动使用Java或其他语言编写的应用程序。

2.1 JDK - 图11

2.1 JDK - 图12 使用默认设置安装JDK时,将同时安装JRE。仅在不需要开发工具的计算机上,才需要单独下载并安装JRE。

使用较旧OS X(在Apple将其重命名为macOS之前)的Mac计算机通常预安装了Java运行时,但现在情况不再如此,因为Oracle已从Apple手工接管了macOS Java SE实现的开发工作。

Oracle网站提供了两个版本的Java SE 8 JRE:

  • JRE
  • Server JRE

JRE用于32位或64位最终用户台式机(请注意,并非所有平台都有32位版本),而Server JRE用于服务器,通常由高级系统管理员安装。Server JRE只能用于64位系统,不包含安装程序和浏览器插件,但包含前面讨论的JVM监视工具。