|     java jdk jre ide   |    

关于JAVA的各种版本

一定要直接安装Java SE Platform(JDK),而不是JRE或者别的。上面一张图已经说明了JDK和JRE的区别。

  1. JRE:Java Runtime Environment
  2. JDK:Java Development Kit

jre 顾名思义,JRE只是个Java运行环境,只包含了java虚拟机,java基础类库。但要开发Java工程,必须是JDK。顾名思义JDK是Java开发工具包,JDK本身包含了JRE,但额外的,你看基本的java,javac编译,jar打包组件,还有jconsole调试控件都只有JDK才有。

简单一句话,就是如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。之前在知乎,看到一个有6年JAVA开发经历的码农还在问JRE和JDK的区别是什么,我也是醉了。真的是民工学了几天if,while,else就可以当程序猿吗?

至于IDE(Integrated Development Environment),比如著名的NetBean还有Eclipse已经不能算Java的一部分了。基本把代码,库的编译和打包都可视化了。方便是方便,但对锻炼水平不利,不要去用。手动编译更健康。

最后说说J2EEJ2SEJ2ME。他们都是开发平台,也就是JDK,只是规模大小不同,受众不同罢了。

  1. J2SE:Java 2 Platform Standard Edition
  2. J2EE:Java 2 Platform Entreprise Edition
  3. J2ME:Java 2 Platform Micro Edition

我们一般用的是J2SE,顾名思义标准版,专门针对个人电脑平台。本文置顶的结构图就是J2SE内部的模块。J2EE就大了,企业级的平台,对象也变成了大型服务器。J2ME最近因为移动终端的兴起被逐渐完善,手机什么的就靠它了。下面这个图是个简单的划分。 javaEnvi

JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。基本都是对特定需求的成熟解决方案。比如JSP, Servlet就是为了解决网络开发的需求创建的一系列标准接口和工具库。其中各个版本的J2EE,J2SE当然也包含在其中。下表列出了历史上一些重要的JSR。JAVA大家庭正在发展壮大。

  1. Real-Time Specification for Java RTSJ 1.0
  2. Java Management Extensions (JMX)
  3. Java Data Objects (JDO)
  4. Enterprise Java Beans 2.0
  5. Java Metadata Interface (JMI)
  6. Java Database Connectivity JDBC 3.0
  7. Java 2 Platform, Enterprise Edition (J2EE) 1.3
  8. Java 2 Platform, Standard Edition 1.4 (Merlin)
  9. Java API for XML Processing (JAXP) 1.1
  10. Java 2 Platform, Micro Edition (J2ME)
  11. Java USB API
  12. 蓝牙Java APIs for Bluetooth
  13. Java API for XML Registries (JAXR) 1.0
  14. Java API for XML-Based Remote Procedure Call (JAX-RPC)
  15. JDOM1.0
  16. JavaServer Faces (JSF)
  17. Service Location Protocol (SLP) API for Java
  18. SDP API
  19. Java 2 Platform, Enterprise Edition 1.4
  20. JavaServer Pages 2.0
  21. Enterprise Java Beans 2.1
  22. Java Servlet 2.4 Specification
  23. Java Portlet Specification
  24. Content Repository API for Java Technology
  25. A Metadata Facility for the Java Programming Language
  26. Java 2 Platform, Standard Edition 5.0 (Tiger)
  27. SIP API for J2ME
  28. Location API for J2ME
  29. Mobile 3D Graphics API for J2ME
  30. Java API for XML Processing JAXP 1.3
  31. Enterprise Java Beans 3.0
  32. JDBC 4.0 API Specification
  33. The Groovy Programming Language

设置环境变量

$PATH

编译的时候每天写一万遍这逆天的绝对路径肯定不是我们想要的。

/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/javac balabala
/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/java balabala

所以要把$JAVA_HOME放到$PATH环境变量里,我们就可以愉快敲代码了。

javac balabala
java balabala

添加$PATH,可以用终端export命令,export就是用来设置或显示环境变量的。但问题是terminal一关,再重新打开内存里$PATH就被清除了。所以我们需要写到bash初始化文件里,每次启动bash都会自动加载环境变量。Linux上是~/.bashrc,Mac上这个地址是~/.bash_profile

#用vim编辑器
vim ~/.bash_profile

~/.bash_profile写下面两行,

#/usr/libexec/java_home是一个返回JAVA_HOME可执行文件
export JAVA_HOME=$(/usr/libexec/java_home)

#拿到JAVA_HOME就插入$PATH
export PATH=$JAVA_HOME:$PATH

运行Hello World

下面是固定节目Hello World时间。有请我们的演员SayHello.java同学登场。我把她创建在了~/java/shenwei/test/目录下面。 helloWorld

再看看SayHello.java文件里的简单代码长这样,就是打出”Hello World!”,大妈都懂。

/*
*
* My "helloWorld" applicaiton in Java.
*
*/

//package路径很重要,从$CLASSPATH的根目录下,我们shenwei.test.SayHello类的源文件和class文件的地址和package的结构是一致的。
package shenwei.test;

//class open to public users
public class SayHello {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}

有了源文件,接下来就是编译。因为$PATH环境变量我们已经加好了,编译直接用javac命令就好了,然后给出源文件的地址,就能编译了。

# 因为个人Mac初始的$HOME下,也就是/Users/Wei/,所以给绝对路径
javac ~/java/shenwei/test/SayHello.java

编译好之后,系统没说话,但就像上面的图里显示的,同一个文件夹下,亚当SayHello.java文件边上已经静静地躺着他的夏娃SayHello.class

接下来就要运行SayHello.class编译好的文件了。注意package一行,每个项目都有一个类似根目录的概念。JAVA的每一个文件都是一个,package结构就是告诉我们这个类在根目录下的具体位置。

我们的例子里,项目根目录就是~/java,从根目录往下找,package shenwei.test的意思就是告诉我们SayHello类位置在shenwei.test这个包里面。系统就会萌萌地到去找~/java/shenwei/test/SayHello.class文件。

但!问题是电脑并不知道根目录是~/java这件事。需要我们告诉他。所以运行的时候,要大吼一声-classpath ~/java,因为$CLASSPATH变量就是告诉系统我们这个项目的根目录在哪儿,然后根据package定义的结构,顺藤摸瓜,电脑就能找到我们的夏娃SayHello.class小盆友了。

所以代码就是:

# 因为还是在$HOME下,也就是/Users/Wei/
javac -cp ~/java  shenwei/test/SayHello.java
# -cp是-classpath的缩写

然后电脑很友好地表示:

MacBook-Pro-de-Wei:~ Wei$ java -cp ~/java shenwei.test.SayHello
Hello World!
MacBook-Pro-de-Wei:~ Wei$

预设$CLASSPATH

但这里我们每次都要告诉电脑-cp ~/java也很麻烦。考虑到一般我们都是进到项目根目录下工作,也就是

#初始在我个人Mac的$HOME下,也就是/Users/Wei/
MacBook-Pro-de-Wei:~ Wei$ ls
Applications	Library		Pictures	hexo
Desktop		Miu		Public		hexoTrash
Documents	Movies		TIJ4-code	java
Downloads	Music		github		lucene-5.5.0

#一般工作都会进到项目根目录/Users/Wei/java/
MacBook-Pro-de-Wei:~ Wei$ cd ./java/
MacBook-Pro-de-Wei:java Wei$ ls
guest_1	shenwei

这时候就不用写-cp ~/java,而是-cp .就可以了,

MacBook-Pro-de-Wei:java Wei$ java -cp . shenwei.test.SayHello
HELLO World!

所以,如果我们把.预设到$CLASSPATH变量里,大多数时间我们连-cp .都不用写了。于是我又无耻地打开了~/.bash_profile文件,

vim ~/.bash_profile

写下了一行邪恶的代码。这里一般我们把...都加进去。..是上一级目录,也很常用。

#CLASSPATH也可以在~/.bash_profile里预设
export CLASSPATH=.:..:$CLASSPATH

从此基本告别了-cp命令。

MacBook-Pro-de-Wei:java Wei$ java shenwei.test.SayHello
HELLO World!

把ANT也装了吧

手动编译当然是可以的,但项目一大,库一多,就有点吃力了。有个ant还是不错的,可以写build.xml文件。

ant官网有两个版本,binary版,和source版。源代码还要编译,还是直接写binary版好,/bin都编译好了,解压就可以用。我直接解压到/usr/local里:

tar -xzf ~/Downloads/apache-ant-1.9.6 /usr/local/

然后把ant里的可执行文件地址也写入~/.bash_profile里。

#安装ant的时候,下载的Binary包,直接放/usr/local下面
export ANT_HOME=/usr/local/apache-ant-1.9.6

#把ANT_HOME/bin也插入$PATH。里面的可执行命令都可以当command line用了。比如ant build
export PATH=${ANT_HOME}/bin:$PATH

!!注意:ANT_HOME后面ant会调用,千万不能直接写成/usr/local/apache-ant-1.9.6/bin,不然后面会抛出错误。

cannot find class org.apache.tools.ant.launch.launcher

吃饭

接下来就可以尽情享受搭积木的快感了,容我先去吃个饭。回来好好撸《Think In Java, 4th Edition》。

顺便吐个嘈,在装书里配的TIJ4-code练习题答案的时候,撞了墙,Bruce Eckel竟然在build.xml里加了验证JAVA版本的步骤,不是J2SE5统统报错。现在都J2SE8了亲,检查一下不是1.1,1.2,1.3,1.4不就行了吗,干嘛非要1.5。Bruce Eckel老湿怎么能犯这样的错误呢。一定是他的学生弄的吧,不要毁大神英明。