理顺JDK和环境变量

一、JDK的安装

1、Java-Package choose

java_version

上述文档翻译:

  • JDK:针对Java开发者(Java developers)。包括了一个完整的JRE附加包工具,该专用JRE附加包的目的是提供开发,调试和模拟Java应用程序。

    JDK:Java SE Development Kit,Java开发环境。

  • Server JRE:针对的是在服务器上运行Java应用程序的管理员。用于在服务器上部署Java应用。包括了在服务器应用上所需要的JVM监控和公共工具,但是不包括浏览器集成(Java 插件)、自动更新、安装。

  • JRE:针对的是在一个桌面环境上运行Java的最终用户。覆盖了大多数的最终用户的需求,包含了在系统上运行Java程序所需要的一切

    JRE:Java Runtime Enviroment,Java运行环境。

2、3种安装包解压后的目录结构及说明

详见: JDK和JRE目录结构

  • JDK目录结构

    - java_dir
      | - jdk1.8.0
           | - bin  
           | - lib  
           | - db
           | - src.zip
           | - jre  // 专用JRE
                | - bin  
                | - lib  
           | ...
         | - jre1.8.0  // 公共JRE
              | - bin  
              | - lib  
    

    针对/java_dir/jdk/ 目录进行说明:

    • bin:存放开发工具的可执行文件。
      • java,解释器
      • javac,编译器
      • javadoc,文档工具,把API注释提取成HTML文档
      • jar,归档工具,把包结构打包成.jar文件
    • lib:开发工具所需要的类库。
      • dt.jar
      • tools.jar
    • db:纯Java开发的数据可 Derby,是一个开源的100%Java开发的关系数据库
    • src.zip:所有java核心库的源代码
    • jre:java运行环境 - JVM
      • bin:存放JVM的执行命令。
        • java,解释器
      • lib:JVM运行所需要的核心类库。
        • rt.jar,引导类。(IDE中API的所在包)

    /java_dir/jre 目录和java_dir/jdk/jre 目录的内容是一样的,都是用来运行Java程序的,即JVM。

  • Server-JRE目录结构

    - server-jre_dir
            | - jdk1.8.0
                 | - bin  
                 | - lib  
                 | - db
                 | - src.zip
                 | - jre  // 专用JRE
                      | - bin  
                      | - lib  
                 | ...
    

  • JRE文件树

    - jre_dir
      | -jre1.8.0  // 公共JRE
          | - bin  
          | - lib
    

3、JDK和JRE的结构辨析

**官方说明: ** JDK和JRE图示 图示说明

JDK_JRE

图示说明:

Java概念图将Java组件技术分级分类。

  • JDK所包含的组件:
    • Java语言
    • 工具和工具API
    • 部署
    • 用户界面工具包
    • 集成库
    • 其他基础库
    • Lang和Util基础库
    • Java虚拟机
  • JRE所包含的组件:
    • 部署
    • 用户界面工具包
    • 集成库
    • 其他基础库
    • Lang和Util基础库
    • Java虚拟机
  • Java SE API 所包含的内容:
    • 用户界面工具包
    • 集成库
    • 其他基础库
    • Lang和Util基础库

**分析: **

官方文档中,可知JDK与JRE相比,独有的部分是Java Language和Tools、Tools API。也就是说,JRE不具备Java应用程序开发的功能。

JDK = Server-JRE + JRE 。

  • 对于最终用户:只需要Java运行环境来运行其电脑上的java程序;因此,只安装JRE就可以了。
  • 对于服务器:需要编译、运行Java应用,而不需要访问Java应用;因此,只使用Server-JRE进行编译、解释。
  • 对于Java开发者:开发Java程序时要编译、解释,同时作为用户要运行其他Java应用;因此使用JDK。
  • 平常所说的Java自动更新,是指公共JRE的更新,以便适应网站的技术更新;而不是JDK的自动更新。

javac和java命令:

jdk/bin 目录下有javac和java命令(编译、解释);而在jdk/jre/binjre/bin 目录下只有java命令(解释)。


二、环境变量(Enviroment variable)的设置及作用

环境变量: 分为用户变量和系统变量。

1、用户变量(user variable)

只对当前用户有效(windows下作用不大,linux下用处大),是为了减低自己所做的修改对他人造成的影响。

一般系统变量的路径排在用户变量之前,如果双方都有的路径,会使用系统变量中的值。

2、系统变量(System variable)

1、JAVA_HOME变量(约定名称,供JDK、其他软件使用)

顾名思义: 这是Java的家,就是JDK文件夹的所在位置(安装路径)。

新建JAVA_HOME路径C:\Program Files\Java\jdk1.8.0_131

作用: 指向JDK的安装目录:

  • 1、像eclipse/intellij等软件可以借助该变量自动定位JDK
  • 2、tomcat等软件只认定这个变量来定位JDK
  • 3、使用变量,修改JDK位置更加灵活(CLASSPATH、PATH的引用)

2、CLASSPATH变量(约定名称,专为JDK而使用)

顾名思义: 这是要查找的类/class文件的所在路径,就是执行javac 命令时:要查找的类的位置和相关的类库位置。

已经不需要新建CLASSPATH路径了!!!.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

手工编译.java文件的几种情况:

假设C:\User\14002\Desktop\Print.java 是我们要编译的java源文件。

情况一:Print.java只是继承于Object类,且不需要引入外部.jar文件。

  • 1、绝对路径编译:

    打开DOS,处于任意路径下,输入:javac C:\User\14002\Desktop\Print.java 即可完成编译。

  • 2、相对路径编译:

    进入ODS,进入该文件所在目录后,输入:javac Print.java 即可。

情况二:Print.java继承其他类,或者要引入其他.jar文件。但是都在同一个目录下。

  • 编译方式和情况一相同。

情况三:Print.java继承某个父类,如MyObject.java类。或者引用某个.jar文件,如MyJar.jar。但是都不在同一个目录下。

  • 1、MyObject.class不在当前目录中(C:\test\MyObject.class),需要手动指定该class文件所在目录:

    javac -classpath C:\test\ C:\User\14002\Desktop\Print.java

  • 2、MyJar.jar不在当前目录中(C:\test\MyJar.jar),需要指定位置:

    javac -classpath C:\test\MyJar.jar C:\User\14002\Desktop\Print.java

为什么javac命令能执行?

因为在PAHT路径中配置的%JAVA_HOME%\bin 路径帮助我们找到了该目录下的javac.exe 执行命令。

CLASSPATH路径的作用?

以下内容来自《Java编程思想》。

1、Java 解释器的工作程序如下:

首先,java.exe找到环境变量CLASSPATH。

CLASSPATH 包含了一个或多个目录,它们作为一种特殊的“根”使用,从这里展开对.class 文件的搜索。

从那个根开始,解释器会寻找包名,并将每个点号(句点)替换成一个斜杠,从而生成从CLASSPATH 根开始的一个路径名(所以package foo.bar.baz 会变成foo\bar\baz 或者foo/bar/baz;具体是正斜杠还是反斜杠由操作系统决定)。

随后将它们连接到一起,成为CLASSPATH 内的各个条目(入口)。

以后搜索.class 文件时,就可从这些地方开始查找与准备创建的类名对应的名字。

此外,它也会搜索一些标准目录——这些目录与Java 解释器驻留的地方有关。

2、CLASSPATH是Java编译器(javac.exe)的一个环境变量。

它的作用是指定类搜索路径,它与import、package关键字有关。

当你写下improt java.util.* 时,编译器面对import关键字时,就知道你要引入java.util这个package中的所有类。

但是编译器如何知道你把这个package放在哪里了呢?

所以你首先得告诉编译器这个package的所在位置。如何告诉它呢?就是设置CLASSPATH啦~

如果java.util这个package在c:\jdk\ 目录下,你得把c:\jdk\这个路径设置到CLASSPATH中去!当编译器面对import java.util.* 这个语句时,它先会查找CLASSPATH所指定的目录,并检视子目录java\util是否存在,然后找出名称吻合的已编译文件(.class文件)。如果没有找到就会报错!

当你自己开发一个package时,如果想要用这个package中的类;自然,你也得把这个package所在的目录设置到CLASSPATH中去!

然而,使用JAR 文件时要注意一个问题:必须将JAR文件的名字置于类路径里,而不仅仅是它所在的路径。所以对一个名为grape.jar 的JAR 文件来说,我们的类路径需要包括:CLASSPATH=.;D:\JAVA\LIB;C:\flavors\grape.jar

CLASSPATH的设定,对JAVA的初学者而言是一件棘手的事。所以Sun让JAVA2的JDK更聪明一些。你会发现,在你安装之后,即使完全没有设定CLASSPATH,你仍然能够编译基本的JAVA程序,并且加以执行。

可以看出,CLASSPATH 里将会包含大量备用的搜索路径。

但是,在JDK 1.5之后,就没有必要配置CLASSPATH了:

因为1.5版本以上JDK:

  • 1、它会自动搜索当前路径下的类文件
  • 2、而且使用Java的编译和运行工具时,系统可以自动加载dt.jar(是关于运行环境的类库,主要是swing的包)和tools.jar(是关于一些工具的类库)文件中的Java类

详见: JDK官方安装、配置说明

3、PATH变量

**path变量的作用: **

windows系统根据环境变量中的PATH变量查找命令并执行,如果找不到则出现“XXX不是内部或外部命令,也不是可运行的程序或批处理文件”错误。

path变量名不分大小写,应用程序或DOS界面会遍历path的路径来查找命令并调用。

path变量的应用举例:

path路径的作用是为DOS命令(cmd)预设一大串的可供搜索命令来匹配 的目录路径,比如在命令行想要调用mysql来登录操作或者是使用git。

  • 想在DOS中使用mysql:

mysql.exe的路径为:C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe

我们在PATH中添加一段路径C:\Program Files\MySQL\MySQL Server 5.7\bin;那么,我们在cmd中直接就可以调用mysql -u root -p来进行进行登录了。

因为有对应的PATH路径存在,这条命令实际上找到了路径下的mysql.exe来执行我们的命令。

  • 想在DOS中使用git:

git.exe的路径为:C:\Program Files\Git\cmd\git.exe

我们在PATH中添加的路径值为C:\Program Files\Git\cmd,同理,我们可以使用git 命令来执行。

举一反三

  • 在DOS中启动chrome:

你可以在用户变量中的Path变量中加入chrome浏览器的路径C:\Program Files (x86)\Google\Chrome\Application

那么你在cmd中输入chrome,回车。即可启动chrome浏览器。

因为chrome.exe的路径是:C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

配置JDK需要的PATH路径

顾名思义: path就是路径了,是在开发中调用相关命令如 javacjava 的所在位置。

作用: 是在任何目录下都能调用与java开发相关的命令。

追加PATH路径%JAVA_HOME%\bin;

4、路径配置图解:

- jdk1.8.0  (1、JAVA_HOME)
    | - bin  (3、PATH)
    | - jre
    | - lib
         | - dt.jar     -->  [2、CLASSPATH]
         | - tools.jar  -->  [2、CLASSPATH]  .  -->  [2、CLASSPATH]

注意: 现在已经不需要配置CLASSPATH路径了。

5、MS-DOS下手动编译、执行java文件

Dos界面: 就是windows下的MS-DOS 方式,cmd是command的缩写。可以执行一些命令。

1、在.../user/desktop/ 桌面上生成Print.java 文件:

public class Print {

    public static void main(String[] args){
        for (int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }

}

作用:打印传入的每个参数。

String[] args 的作用是:在Docs界面,把执行.class 文件时附带传进的所有参数(以空格隔开)分别存入args这个字符数组中;之后可以使用args这个数组中的参数。

2、在Dos界面

  • 进入.java文件所在目录。
  • javac 命令编译Print.java 文件,得到Print.class 文件。
  • java 命令执行.class文件,并传入4个参数
  • 输出java程序运行结果
dos

3、JDK的环境变量总结

在windows下:

  • 对于JDK:其实只需要设置PATH路径即可,把xx/jdk/bin 目录追加进去。

    其专用JRE(xx/jdk/jre)可以自动被xx/jdk/bin/ 中的命令调用。

    其公共JRE(xx/jre)自动被注册到系统的注册表当中,供其他应用程序调用。

  • 对于JRE:不需要设置PATH路径,直接使用即可。

    因为JRE在安装时就自动被注册到系统的注册表当中了。

  • 因此,公共JRE会被自动注册到系统的注册表之中,无需配置。

查看系统注册表:

  • 1、Win + R,输入regedit。
  • 2、在[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft] 下有Java相关的注册表记录。

小结论:

  • 不管是在windows下还是linux下,配置PATH变量的目的,都是为了在DOS界面/CMD界面可以直接调用xx/jdk/bin 目录中的java命令,也就是为了在java编程时使用IDEA等工具能正确编译、执行java程序。

    所以PATH变量的目的是用于java开发。

  • 当需要运行Tomcat服务器时,由于Tomcat需要JRE环境,所以它根据系统的环境变量来寻找JRE的位置。详见Tomcat官方安装、配置说明

    • 安装JDK的情况下,设置JAVA_HOME 即可,Tomcat使用JAVA_HOME/jre 的JRE环境。或者设置JRE_HOME 来指定公共JRE的位置。
    • 只安装JRE的情况下,设置JRE_HOME 为JRE所在目录即可。

三、Linux下JDK环境变量的设置

一般来说,我们解压JDK的tar包的位置可能有:

  • /usr/local/ 目录,这里存放用户的应用程序和文件,类似windows的program files 目录。
  • /opt/ 目录,这是给主机额外安装软件的目录。

假设现在的JDK路径为:/opt/java8/jdk1.8.0 目录。

环境变量的配置:

1、所有用户的shell都有权访问的环境变量,这种做法在多人情况下可能带来安全性问题。

1、打开配置文件:vim /etc/profile

2、输入如下内容:

export JAVA_HOME=/opt/java8/jdk1.8.0  # Tomcat运行需要JRE环境
export PATH=$JAVA_HOME/bin:$PATH  # 开发java时需要

# export是把变量导出为全局变量

3、读取、执行配置文件:source /etc/profile

4、查看JDK安装:java -version

2、用户级别的环境变量的控制,也是最靠谱的方法。

如果需要给某个用户权限使用这些环境变量,只需要修改其个人用户家目录下的.bash_profile 文件就可以了。

1、打开用户家目录下的.bash_profile 文件:vim .bash_profile

2、输入以下内容:

# 同上一致

3、重新登录

JDK的卸载:

进入JDK的安装目录的_uninst 目录,在shell终端执行命令:./uninstall.sh 即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容