JDK在archlinux的默认安装目录是/usr/lib/jvm/java-8-jdk
(根据JDK版本不同而改变目录名),当然,我们可以将JDK安装路径设置为JAVA_HOME
。
其实,在/usr/lib/jvm
下共有三个文件夹,准确的说,是一个文件夹和两个文件夹的链接:
lgl@pArch /usr/lib/jvm $ ls -l
总用量 4
lrwxrwxrwx 1 root root 10 Sep 17 00:44 default -> java-8-jdk
lrwxrwxrwx 1 root root 14 Sep 17 00:44 default-runtime -> java-8-jdk/jre
drwxr-xr-x 7 root root 4096 Oct 29 11:17 java-8-jdk
可以看到default
和default-runtime
分别指的是JAVA_HOME
和JAVA_HOME
下的jre
文件夹。
在JDK的安装目录下,一共有这么多东西:
lgl@pArch /usr/lib/jvm/java-8-jdk $ ls -l
总用量 25624
drwxr-xr-x 2 root root 4096 Oct 29 11:17 bin
drwxr-xr-x 4 root root 4096 Oct 29 11:17 db
drwxr-xr-x 3 root root 4096 Oct 29 11:17 include
-rwxr-xr-x 1 root root 5104609 Oct 7 04:00 javafx-src.zip
drwxr-xr-x 4 root root 4096 Oct 29 11:17 jre
drwxr-xr-x 5 root root 4096 Oct 29 11:17 lib
-r--r--r-- 1 root root 159 Oct 7 08:36 README.html
-rw-r--r-- 1 root root 525 Oct 7 08:36 release
-rw-r--r-- 1 root root 21099344 Oct 7 08:36 src.zip
可以看到jre
文件夹(java runtime environment,java运行时需要用到的东西)就在JDK的安装目录下。
那么archlinux是怎么使用javac
和java
的,是把JAVA_HOME
加入PATH
环境变量了吗?
看一下我们的PATH
环境变量:
lgl@pArch ~ $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
可以看到JDK的安装目录并不在里面,在里面的只是JDK安装目录下的bin
文件夹,它只是JDK安装目录的一部分,那么archlinux使用的javac
和java
是通过/usr/lib/jvm/default/bin
找到的吗?我们不妨找一下:
lgl@pArch ~ $ whereis javac
javac: /usr/bin/javac /usr/lib/jvm/java-8-jdk/bin/javac
lgl@pArch ~ $ whereis java
java: /usr/bin/java /usr/share/java /usr/lib/jvm/java-8-jdk/bin/java
每一个都对应了多个地方,那么我们平时用的javac
和java
到底是那一个目录里面的呢?
lgl@pArch ~ $ which javac
/usr/bin/javac
lgl@pArch ~ $ which java
/usr/bin/java
恩,都是/usr/bin
里面的,这个目录里面为什么会有java
的东西呢?我们再仔细看看:
lgl@pArch ~ $ ls -l /usr/bin | grep java
-rwxr-xr-x 1 root root 4610 Nov 2 2014 archlinux-java
lrwxrwxrwx 1 root root 37 Nov 2 2014 java -> /usr/lib/jvm/default-runtime/bin/java
lrwxrwxrwx 1 root root 30 Nov 2 2014 javac -> /usr/lib/jvm/default/bin/javac
lrwxrwxrwx 1 root root 32 Nov 2 2014 javadoc -> /usr/lib/jvm/default/bin/javadoc
lrwxrwxrwx 1 root root 30 Nov 2 2014 javah -> /usr/lib/jvm/default/bin/javah
lrwxrwxrwx 1 root root 30 Nov 2 2014 javap -> /usr/lib/jvm/default/bin/javap
这下真相大白了!原来/usr/bin
里面的javac
和java
(不只是这两个,还有javadoc\javah\javap
)都是链接!他们实际上是来自于/usr/lib/jvm/default/bin/
和/usr/lib/jvm/default-runtime/bin/
下的。而在开头我们已经说过了,default
目录实际上不是目录,而是链接,指向的是我们的JDK安装目录/usr/lib/jvm/java-8-jdk
。而default-runtime
也是我们JDK安装目录下的jre
文件夹。所以说,archlinux用的javac
虽然是通过/usr/bin
找到的javac
,但其实最终还是链接到了我们的JDK安装目录下的bin
里的javac
,java
还是JDK安装目录下的jre
里的java
。
这下我们也明白了为什么使用whereis
查找java
和javac
的时候会出现多个目录,其实除了JDK真正的安装目录,其他的都是链接。
而且,理论上来讲,加入PATH
的/usr/lib/jvm/default/bin
里面只有javac
,java
是运行的时候用到的,应该在jre
目录里,但是实际上,/usr/lib/jvm/default/bin
目录里面也有java
:
lrwxrwxrwx 1 root root 36 Oct 22 08:58 java -> /usr/lib/jvm/java-8-jdk/jre/bin/java
-rwxr-xr-x 1 root root 7941 Oct 7 08:36 javac
可以看到,也是通过链接,链到jre/bin目录里的java的。