JDK(JavaDevelopmentKit)是SunMicrosystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的JavaSDK(Softwaredevelopmentkit)。
JDK一般有三种版本:
SE(J2SE),standardedition,标准版,是我们通常用的一个版本EE(J2EE),enterpsiseedtion,企业版,使用这种JDK开发J2EE应用程序,ME(J2ME),microedtion,主要用于移动设备、嵌入式设备上的java应用程序
Java开发工具(JDK)是许多Java专家最初使用的开发环境。尽管许多编程人员已经使用第三方的开发工具,但JDK仍被当作Java开发的重要工具。
JDK由一个标准类库和一组建立,测试及建立文档的Java实用程序组成。其核心Java
API是一些预定义的类库,开发人员需要用这些类来访问Java语言的功能。JavaAPI包括一些重要的语言结构以及基本图形,网络和文件I/O。一般来说,JavaAPI的非I/O部分对于运行Java的所有平台是相同的,而I/O部分则仅在通用Java环境中实现。
作为JDK实用程序,工具库中有七种主要程序。
Javac:Java:Java解释器,直接从类文件执行Java应用程序字节代码。appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。Javadoc:根据Java源码及说明语句生成HTML文档。Jdb:Java调试器,可以逐行执行程序,设置断点和检查变量。Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
一、JDK文件结构
本文档给出JDK目录及其所包含的文件的概述。
开发文件和目录
本节对开发Java平台应用程序所要求的文件和目录进行说明。(不要求的目录有:演示程序、Java源代码和C头文件。下一节附加文件和目录将对它们进行论述。)下图列出的是最重要的目录:
附加文件和目录
本节说明演示程序、Java源代码和C头文件的目录结构。下面是目录结构:
jdk1.2_______________|__________________||||src.jardemoincludeinclude-old___|___||appletsjfc|Java2D以上所显示的附加目录为:
二、JDK1.5新特性介绍
“JDK1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each循环,自动装包/拆包,枚举,可变参数,静态导入。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。
下面我们简单介绍一下这些新特性。
1.泛型(Generic)
Collection
编译器会给出一个错误:
add(java.lang.String)injava.util.Collection
2.For-Each循环
For-Each循环得加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为:
voidprocessAll(Collectionc){for(Iteratori=c.iterator();i.hasNext();){MyClassmyObject=(MyClass)i.next();myObject.process();}}
使用For-Each循环,我们可以把代码改写成:
voidprocessAll(Collection
这段代码要比上面清晰许多,并且避免了强制类型转换。
3.自动装包/拆包(Autoboxing/unboxing)
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
自动装包:基本类型自动转为包装类.(int>>Integer)
自动拆包:包装类自动转为基本类型.(Integer>>int)
在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。
inta=3;Collectionc=newArrayList();c.add(a);//自动转换成Integer.
Integerb=newInteger(2);c.add(b+2);
这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer.
4.枚举(Enums)
JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enmu.我们可以这样来定义一个枚举类型。publicenumColor{Red,White,Blue}
然后可以这样来使用ColormyColor=Color.Red.
枚举类型还提供了两个有用的静态方法values()和valueOf().我们可以很方便地使用它们,例如
for(Colorc:Color.values())System.out.println(c);
5.可变参数(Varargs)
util.write(obj1);util.write(obj1,obj2);util.write(obj1,obj2,obj3);…
在JDK1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得不是很有效。如果使用可变参数的话我们只需要一个函数就行了
在引入可变参数以后,Java的反射包也更加方便使用了。对于c.getMethod("test",newObject【0】).invoke(c.newInstance(),newObject【0】)),现在我们可以这样写了c.getMethod("test").invoke(c.newInstance()),这样的代码比原来清楚了很多。
6.静态导入(StaticImports)
要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
importstaticjava.lang.Math.*;…….r=sin(PI*2);//无需再写r=Math.sin(Math.PI);
不过,过度使用这个特性也会一定程度上降低代码地可读性。
功能说明:rmic为远程对象生成stub和skeleton。
补充说明:rmic编译器根据编译后的Java类(含有远程对象实现)名,为远程对象生成stub和skeleton(远程对象是指实现java.rmi.Remote接口的对象)。在rmic命令中所给的类必须是经javac命令成功编译且是完全包限定的类。
命令选项-classpath【路径】指定rmic用于查询类CLASSPATH环境变量。目录用冒号分隔。
-d【目录】指定类层次的根目录。此选项可用来指定stub和skeleton文件的目标目录。
-depend使编译器考虑重新编译从其它类引用的类。一般来说,它只重新编译从源代码引用的遗漏或过期的类。
-g允许生成调试表格。调试表格含有行号和局部变量的有关信息,即Java调试工具所使用的信息。缺省情况下,只生成行号。
-J与-D选项联用,它将紧跟其后的选项(-J与-D之间无空格)传给java解释器。
-keepgenerated为stub和skeleton文件保留所生成的.java源文件,并将这些源文件写到与.class文件相同的目录中,如果要指定目录,则使用-d选项。
-nowarn关闭警告。如果使用该选项,则编译器不输出任何警告信息。
-show显示rmic编译器的GUI(图形用户界面)。输入一个或多个包限定类名(以空格分隔),并按回车键或“显示”按钮,创建stub和skeleton。
-vcompat(缺省值)创建与JDK1.1和1.2stub协议版本都兼容的stub和skeleton。
-verbose使编译器和链接器输出关于正在编译哪些类和正在加载哪些类文件的信息。
-v1.1创建JDK1.1stub协议版本的stub和skeleton。
-v1.2只创建JDK1.2stub协议版本的stub。
rmid
功能说明:rmid启动激活系统守护进程,以便能够在Java虚拟机上注册和激活对象。
语法:rmid【-portport】【-logdir】
补充说明:rmid工具启动激活系统守护进程。必须先启动激活系统守护进程,才能向激活系统注册可被激活的对象或在Java虚拟机上激活可被激活的对象。
命令选项-C<某些命令行选项>指定一个选项,在创建每个rmid的子守护进程(激活组)时,该选项以命令行参数的形式传给该子守护进程。
-port【端口】指定rmid的注册服务程序所使用的端口。激活系统守护进程将ActivationSystem与该注册服务程序中的名称java.rmi.activation.ActivationSystem捆绑在一起。
-stop停止-port选项所指定端口上的当前rmid调用。若未指定端口,则将停止在端口1098上运行的rmid。
rmiregistry
功能说明:rmiregistry命令可在当前主机的指定端口上启动远程对象注册服务程序。
语法:rmiregistry【port】
java.rmi.registry.LocateRegistry类的方法可用于在某台主机或主机和端口上获取注册服务程序操作。java.rmi.Naming类的基于URL的方法将对注册服务程序进行操作,并可用于查询远程对象、将简单(字符串)名称绑定到远程对象、将新名称重新绑定到远程对象(覆盖旧绑定)、取消远程对象的绑定以及列出绑定在注册服务程序上的URL。
serialver
功能说明:serialver命令返回serialVersionUID。
语法:serialver【命令选项】
补充说明:serialver以适于复制到演变类的形式返回一个或多个类的serialVersionUID。不带参数调用时,它输出用法行。
命令选项-show显示一个简单的用户界面。输入完整的类名并按回车键或“显示”按钮可显示serialVersionUID。
jarsigner
功能说明:为Java归档(JAR)文件产生签名,并校验已签名的JAR文件的签名。
语法:jarsigner【命令选项】jar-filealiasjarsigner-verify【命令选项】jar-file
补充说明:jarsigner工具用于两个目的:1:为Java归档(JAR)文件签名2:校验已签名的JAR文件的签名和完整性
命令选项-keystore【url】指定密钥仓库的URL。缺省值是用户的宿主目录中的.keystore文件,它由系统属性“user.home”决定。
-storetype【storetype】指定要被实例化的密钥仓库类型。默认的密钥仓库类型是安全属性文件中"keystore.type"属性值所指定的那个类型,由java.security.KeyStore中的静态方法getDefaultType返回。
-storepass【password】指定访问密钥仓库所需的口令。这仅在签名(不是校验)JAR文件时需要。在这种情况下,如果命令行中没有提供-storepass选项,用户将被提示输入口令。
-keypass【password】指定用于保护密钥仓库项(由命令行中指定的别名标出)的私钥的口令。使用jarsigner为JAR文件签名时需要该口令。如果命令行中没有提供口令,且所需的口令与密钥仓库的口令不同,则将提示用户输入它。
-sigfile【file】指定用于生成.SF和.DSA文件的基本文件名。
-signedjar【file】指定用于已签名的JAR文件的名称。
-verify如果它出现在命令行中,则指定的JAR文件将被校验,而不是签名。如果校验成功,将显示“jarverified”。如果试图校验未签名的JAR文件,或校验被不支持的算法(例如未安装RSA提供者时使用的RSA)签名的JAR文件,则将有如下显示:"jarisunsigned.(signaturesmissingornotparsable)"。
-certs如果它与-verify和-verbose选项一起出现在命令行中,则输出将包括JAR文件的每个签名人的证书信息。
-internalsf过去,JAR文件被签名时产生的.DSA(签名块)文件包含一个同时产生的.SF文件(签名文件)的完整编码副本。这种做法已被更改。为了减小输出JAR文件的整个大小,缺省情况下.DSA文件不再包含.SF文件的副本。但是如果-internalsf出现在命令行中,将采用旧的做法。该选项主要在测试时有用;实际上不应使用它,因为这样将消除有用的优化。
-J【javaoption】将指定的javaoption串直接传递到Java解释器。((jarsigner实际上是解释器的一个“wrapper”)。该选项不应含有任何空格。它有助于调整执行环境或内存使用。要获得可用的解释器选项的清单,可在命令行键入java-h或java-X。
keytool
语法:keytool【命令】
native2ascii
功能说明:将含有本地编码字符(既非Latin1又非Unicode字符)的文件转换为Unicode编码字符的文件。
语法:native2ascii【options】【inputfile【outputfile】】
补充说明:Java编译器和其它Java工具只能处理含有Latin-1和/或Unicode编码(udddd记号)字符的文件。native2ascii将含有其它字符编码的文件转换成含Latin-1和/或Unicode编码字符的文件。若省略outputfile,则使用标准输出设备输出。此外,如果也省略inputfile,则使用标准输入设备输入。
命令选项-reverse执行相反的操作:将含Latin-1和/或Unicode编码字符的文件转换成含本地编码字符的文件。
-encoding【encoding_name】指定转换过程使用的编码名称。缺省的编码从系统属性file.encoding中得到。
appletviewer
功能说明:Javaapplet浏览器。appletviewer命令可在脱离万维网浏览器环境的情况下运行applet。
语法:appletviewer【threadsflag】【命令选项】urls...
补充说明:appletviewer命令连接到url所指向的文档或资源上,并在其自身的窗口中显示文档引用的每个applet。注意:如果url所指向的文档不引用任何带有OBJECT、EMBED或APPLET标记的applet,那么appletviewer就不做任何事情。
命令选项-debug在Java调试器jdb中启动appletviewer,使您可以调试文档中的applet。
-encoding【编码名称】指定输入HTML文件的编码名称。
-J【javaoption】将javaoption字符串作为单个参数传给运行appletviewer的Java解释器。参数不能含有空格。由多重参数组成的字符串,其中的每个参数都必须以前缀-J开头,该前缀以后将被除去。这在调整编译器的执行环境或内存使用时将很有用。
extcheck
功能说明:extcheck检测目标jar文件与当前安装方式扩展jar文件间的版本冲突。
语法:extcheck【-verbose】targetfile.jar
补充说明:extcheck实用程序检查指定Jar文件的标题和版本与JDKTM软件中所安装的扩展是否有冲突。在安装某个扩展前,可以用该实用程序查看是否已安装了该扩展的相同版本或更高的版本。
extcheck实用程序将targetfile.jar文件清单的specification-title和specification-version头与当前安装在扩展目录下所有Jar文件的相对应的头进行比较(缺省扩展目录为jre/lib/ext)。extcheck实用程序比较版本号的方式与java.lang.Package.isCompatibleWith方法相同。若未检测到冲突,则返回代码为0。如果扩展目录中任何一个jar文件的清单有相同的specification-title和相同的或更新的specification-version号,则返回非零错误代码。如果targetfile.jar的清单中没有specification-title或specification-version属性,则同样返回非零错误代码。
命令选项-verbose对扩展目录中的Jar文件进行检查时,列出文件。此外,还报告目标jar文件的清单属性及所有冲突的jar文件。
jar
功能说明:Java归档工具
语法:jar【命令选项】【manifest】destinationinput-file【input-files】
命令选项-c在标准输出上创建新归档或空归档。
-t在标准输出上列出内容表。
-x【file】从标准输入提取所有文件,或只提取指定的文件。如果省略了file,则提取所有文件;否则只提取指定文件。
-f第二个参数指定要处理的jar文件。在-c(创建)情形中,第二个参数指的是要创建的jar文件的名称(不是在标准输出上)。在-t(表(或-x(抽取)这两种情形中,第二个参数指定要列出或抽取的jar文件。
-v在标准错误输出设备上生成长格式的输出结果。
-m包括指定的现有清单文件中的清单信息。用法举例:“jarcmfmyManifestFilemyJarFile*.class”
-0只储存,不进行ZIP压缩。
-M不创建项目的清单文件。
-u通过添加文件或更改清单来更新现有的JAR文件。例如:“jar-uffoo.jarfoo.class”将文件foo.class添加到现有的JAR文件foo.jar中,而“jarumfmanifestfoo.jar”则用manifest中的信息更新foo.jar的清单。
-C在执行jar命令期间更改目录。例如:“jar-uffoo.jar-Cclasses*”将classes目录内的所有文件加到foo.jar中,但不添加类目录本身。
程序示例1:将当前目录下所有CLASS文件打包成新的JAR文件:jarcffile.jar*.class
2:显示一个JAR文件中的文件列表jartffile.jar
3:将当前目录下的所有文件增加到一个已经存在的JAR文件中jarcvffile.jar*
javadoc
功能说明JavaAPI文档生成器从Java源文件生成API文档HTML页。
语法:javadoc【命令选项】【包名】【源文件名】【@files】其中【包名】为用空格分隔的一系列包的名字,包名不允许使用通配符,如(*)。【源文件名】为用空格分隔的一系列的源文件名,源文件名可包括路径和通配符,如(*)。【@files】是以任何次序包含包名和源文件的一个或多个文件。
当Javadoc建立其内部文档结构时,它将加载所有引用的类。由于这一点,Javadoc必须能查找到所有引用的类,包括引导类、扩展类和用户类。
命令选项-overviewi>path/filename指定javadoc应该从path/filename所指定的“源”文件中获取概述文档,并将它放到概述页中(overview-summary.html)。其中path/filename是相对于-sourcepath的相对路径名。
-public只显示公有类及成员。
-protected只显示受保护的和公有的类及成员。这是缺省状态。
-package只显示包、受保护的和公有的类及成员。
-private显示所有类和成员。
-help显示联机帮助,它将列出这些javadoc和doclet命令行选项。
-docletclass指定启动用于生成文档的docle的类文件。该doclet定义了输出的内容和格式。如果未使用-doclet选项,则javadoc使用标准doclet生成缺省HTML格式。该类必须包含start(Root)法。该启动类的路径由-docletpath选项定义。
-docletpathclasspathlist指定doclet类文件的路径,该类文件用-doclet选项指定。如果doclet已位于搜索路径中,则没有必要使用该选项。
-sourcepathsourcepathlist当将包名传递到javadoc命令中时,指定定位源文件(.java)的搜索路径。注意只有当用javadoc命令指定包名时才能使用sourcepath选项--它将不会查找传递到javadoc命令中的.java文件。如果省略-sourcepath,则javadoc使用类路径查找源文件。
-classpathclasspathlist指定javadoc将在其中查找引用类的路径--引用类是指带文档的类加上它们引用的任何类。Javadoc将搜索指定路径的所有子目录。classpathlist可以包括多个路径,彼此用逗号分隔。
-bootclasspathclasspathlist指定自举类所在路径。它们名义上是Java平台类。这个bootclasspath是Javadoc将用来查找源文件和类文件的搜索路径的一部分。在classpathlist中用冒号(:)分隔目录。
-extdirsdirlist指定扩展类所在的目录。它们是任何使用Java扩展机制的类。这个extdirs是Javadoc将用来查找源文件和在文件的搜索路径的一部分。在dirlist中用冒号(:)分隔目录。
-verbose在javadoc运行时提供更详细的信息。不使用verbose选项时,将显示加载源文件、生成文档(每个源文件一条信息)和排序的信息。verbose选项导致打印额外的信息,指定解析每个java源文件的毫秒数。
-localelanguage_country_variant指定javadoc在生成文档时使用的环境。
-encodingname指定源文件编码名,例如EUCJIS/SJIS。如果未指定该选项,则使用平台缺省转换器。
-J【flag】将flag直接传递给运行javadoc的运行时系统java。注意在J和flag之间不能有空格。标准Doclet提供的选项
-ddirectory指定javadoc保存生成的HTML件的目的目录。省略该选项将导致把文件保存到当前目录中。其中directory可以是绝对路径或相对当前工作目录的相对路径。
-version在生成文档中包括@version文本。缺省地将省略该文本。
-author在生成文档中包括@author文本。
-splitindex将索引文件按字母分割成多个文件,每个字母一个文件,再加上一个包含所有以非字母字符开头的索引项的文件。
-windowtitle【title】指定放入HTML
·Linux
SUN的java网站提供windows,linux,solaris三个平台编译好的jdk包,下载解压即可使用。
chown-Rroot:rootjavachmod-R755java
设置环境变量(/etc/profile):
exportJAVA_HOME=/usr/local/javaexportCLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/libexportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
使环境变量生效,并进行测试:
source/etc/profilejava-version
·FreeBSD
这个编译好的jdk包需要FreeBSD4.x兼容包,你也可以自己从ports安装jdk:
mount/cdromcd/cdrom/compat4x/./install.sh
pkg_add-rftp://ftp.freebsdchina.org/pub/china_ports/jdk-1.4.2p7.tbzmv/usr/local/jdk1.4.2/usr/local/java
设置环境变量(~/.cshrc):
setenvJAVA_HOME/usr/local/javasetenvCLASSPATH$JAVA_HOME/lib:$JAVA_HOME/jre/libsetenvPATH$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH