一定要直接安装Java SE Platform(JDK),而不是JRE或者别的。上面一张图已经说明了JDK和JRE的区别。
import java.util.*;
import kafka.message.Message;
import kafka.producer.ProducerConfig;
import kafka.javaapi.producer.Producer;
import kafka.javaapi.producer.ProducerData;
public class ProducerSample {
public static void main(String[] args) {
ProducerSample ps = new ProducerSample();
Properties props = new Properties();
props.put("zk.connect", "127.0.0.1:2181");
props.put("serializer.class", "kafka.serializer.StringEncoder");
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
ProducerData<String, String> data = new ProducerData<String, String>("test-topic", "test-message2");
producer.send(data);
producer.close();
}
}
顾名思义,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的一部分了。基本把代码,库的编译和打包都可视化了。方便是方便,但对锻炼水平不利,不要去用。手动编译更健康。
最后说说J2EE
,J2SE
,J2ME
。他们都是开发平台,也就是JDK,只是规模大小不同,受众不同罢了。
J2SE
:Java 2 Platform Standard EditionJ2EE
:Java 2 Platform Entreprise EditionJ2ME
:Java 2 Platform Micro Edition我们一般用的是J2SE
,顾名思义标准版,专门针对个人电脑平台。本文置顶的结构图就是J2SE内部的模块。J2EE
就大了,企业级的平台,对象也变成了大型服务器。J2ME
最近因为移动终端的兴起被逐渐完善,手机什么的就靠它了。下面这个图是个简单的划分。
JSR
是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。基本都是对特定需求的成熟解决方案。比如JSP, Servlet就是为了解决网络开发的需求创建的一系列标准接口和工具库。其中各个版本的J2EE,J2SE当然也包含在其中。下表列出了历史上一些重要的JSR。JAVA大家庭正在发展壮大。
- Real-Time Specification for Java RTSJ 1.0
- Java Management Extensions (JMX)
- Java Data Objects (JDO)
- Enterprise Java Beans 2.0
- Java Metadata Interface (JMI)
- Java Database Connectivity JDBC 3.0
- Java 2 Platform, Enterprise Edition (J2EE) 1.3
- Java 2 Platform, Standard Edition 1.4 (Merlin)
- Java API for XML Processing (JAXP) 1.1
- Java 2 Platform, Micro Edition (J2ME)
- Java USB API
- 蓝牙Java APIs for Bluetooth
- Java API for XML Registries (JAXR) 1.0
- Java API for XML-Based Remote Procedure Call (JAX-RPC)
- JDOM1.0
- JavaServer Faces (JSF)
- Service Location Protocol (SLP) API for Java
- SDP API
- Java 2 Platform, Enterprise Edition 1.4
- JavaServer Pages 2.0
- Enterprise Java Beans 2.1
- Java Servlet 2.4 Specification
- Java Portlet Specification
- Content Repository API for Java Technology
- A Metadata Facility for the Java Programming Language
- Java 2 Platform, Standard Edition 5.0 (Tiger)
- SIP API for J2ME
- Location API for J2ME
- Mobile 3D Graphics API for J2ME
- Java API for XML Processing JAXP 1.3
- Enterprise Java Beans 3.0
- JDBC 4.0 API Specification
- The Groovy Programming Language
编译的时候每天写一万遍这逆天的绝对路径肯定不是我们想要的。
/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时间。有请我们的演员SayHello.java
同学登场。我把她创建在了~/java/shenwei/test/
目录下面。
再看看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$
但这里我们每次都要告诉电脑-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还是不错的,可以写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老湿怎么能犯这样的错误呢。一定是他的学生弄的吧,不要毁大神英明。