javac、java、jar、javadoc命令详解

hardwork
很多教程都是一开始简单的说下用javac编译HelloWorld.java,紧接着就是Eclipse等IDE的使用,然而学习者并不了解IDE背后的原理究竟是什么,只有真正弄懂了这些基础命令时,那么任何一款IDE都会得心应手。

前面的话

IDE各有不同,也各有优点,但背后的原理只有一个—那就是JDK。本文深度讲解了JDK基本命令的用法,让你不借助于任何IDE也完全可以完成开发的工作,这样,对于IDE的使用和JDK的原理有了更进一步的理解也会是将来使用任何一款IDE能够得心应手和底气十足的保证。

编译类文件——javac命令

一、javac命令的语法结构

javac [options] [sourcefiles] [@files]

  • options: 命令行选项
  • sourcefiles: 一个或多个要编译的源文件
  • @files: 一个或多个对源文件进行列表的文件

二、传递源文件名的两种方法

  • 使用[sourcefiles]: 如果源文件数量少,在命令行上列出文件名即可。

例如:javac MyClass1.java MyClass2.java

也可以使用通配符:javac MyClass*.java

  • 使用[@files]: 如果源文件数量多,则将源文件名列在一个文件中,名称间用空格或回车行来进行分割。然后在javac命令行中使用该列表文件名,文件名前需加@字符。

例如:建立一个文件并命名为”@list.txt”,其中的内容如下:

MyClass1.java
MyClass2.java
MyClass3.java

执行javac @list.txt

三、传递带包名的源文件的方法

对于有包路径的类,可以用相对路径来表示,比如com下的Demo.java,可以使用如下命令编译:javac com\demo.java

四、命令选项

编译器有一批标准选项,目前的开发环境支持这些标准选项,将来的版本也将支持它。还有一批附加的非标准选项是目前的虚拟机实现所特有的,将来可能要变化。非标准选项以-X打头。
以下3个是设置路径的选项:

  • -classpath (类路径):设置用户类路径,它将覆盖CLASSPATH环境变量中的用户类路径。若既未指定CLASSPATH又未指定-classpath,则用户类路径由当前目录构成。

  • -d (编译生成文件目标目录):设置类文件的目标目录。如果某个类是一个包的组成部分,则javac将把该类文件放入反映包名的子目录中,必要时[需手工]创建目录。
    例如:如果指定-d c:\demo 并且该类名叫com.Demo,那么类文件就叫C:\demo\mypackage\HelloWorld.class。若为指定-d选项,则javac将把类文件放到与源文件相同的目录中。

  • -sourcepath (源路径):指定用以查找类或接口定义的源代码路径。与用户类路径一样,源路径选项用分号进行分割,它们可以是目录、jar归档文件或zip归档文件。如果使用包,那么目录或归档文件中的本地路径名必须反映包名。

Tip:通过classpath(类路径)查找类,如果找到了其源文件,则可能会自动被重新编译。

例如,我们可以使用这3个属性来将源码、classpath和目标路径分开

javac -d classes -sourcepath src -classpath classes;lib\Banners.jar \src\farewells\GoodBye.java

这样,就会把src目录下的代码编译到classes目录下,并引用classpath中的类。

以下5个是设置编译属性和性能的选项:

  • -deprecation:显示每种不鼓励使用的成员或类的使用或覆盖的说明。如果没有给出-deprecation选项的话,javac将显示这类源文件的名称,这些源文件使用或覆盖不鼓励使用的成员或类。
  • -encoding:设置源文件指定的编码,例如EUCJIS/SJIS。若未指定-encoding选项,则使用平台默认的转换器。
  • -g:生成所有的调试信息,包括局部变量。在默认情况下,只生成行号和源文件信息。
  • -nowarn:禁用警告信息。
  • -verbose:冗长输出。它包括了每个所加载的类和每个所编译的源文件的有关信息。

除了以上几个常用的选项之外,还有一些联编选项和非标准选项(以-X开头的选项),这些选项不太常用,需要的读者可以查阅Java文档。

更多内容请参考如下链接:

运行类文件——java命令

下面分5个方面来讲解java命令的使用

一、java命令的语法结构

java [options] class [argument]

java [options] -jar file.jar [argument]

  • options:命令行选项
  • class:要调用的类名
  • file.jar:要调用的jar文件名,只与-jar一起使用
  • argument:传给main函数的参数

二、执行一个类文件

执行类文件时,只需要指定类文件的全名即可,全名中包含包名,包路径使用.表示。

例如:编译package\HelloWorld.class类,执行的命令如下:
java mypackage.HelloWorld

三、执行一个jar包

执行jar包时,该包中的MENIFEST.MF文件中必须指定当前包中哪个类是主类,即指定执行入口类,使用属性为Main-Class。
执行方式如下:

java -jar HelloWorld.jar

四、命令选项

java命令有一组标准选项,当前的运行时环境支持这些选项并且将来的版本也将支持它们。还有一组其它的非标准选项是特定于目前的虚拟机实现的,将来可能要有变化。非标准选项以-X开头。

  • -classpath (类路径):指定类的环境变量,同javac中的-classpath选项。
  • -cp (类路径):指定一个用于查找类文件的列表,它由目录、jar归档文件和zip归档文件组成。类路径用分号;分割。指定-classpath或-cp将覆盖CLASSPATH环境变量的所有设置。

    Tips:如果不使用-classpath和-cp,且没有设定CLASSPATH,则用户类路径由当前目录.构成。

  • -D (属性=值):设置系统属性的值。例如:-D hello=world,这样在Java类中就可以取得系统属性hello的值world。

  • -jar:执行封装在jar归档文件中的程序。第一个参数是jar归档文件的名称而不是启动类名。启动类由Main-Class清单头指定。jar文件是所有用户类的源,其它的用户类路径设置将被忽略。

除了以上的几个常用选项外,还有一些以-X开头的非标准选项,用以对执行时的环境进行设置。最常用的是对Java虚拟机的堆大小进行设置,以提高Java运行的内存和运行效率。例如-Xms256m -Xmx256m -XX:NewSize=128m -XX:MaxNewSize=128m,Xms代表默认启动大小,Xmx代表最大大小,NewSize是新建对象的大小,MaxNewSize是新建堆运行增长的最大值,它决定了何时将新的对象置为旧的对象。

在进行Tomcat系统部署时,默认的内存大小为56MB,而通常我们可能需要更多的内存,此时就可以在Tomcat启动命令后使用该参数。Tomcat也是通过java命令来执行一个Java类来启动的。

五、给类传递参数
在Java的命令中还有一个变量argument,该变量用于向目标类main()函数传递输入参数,多个参数用空格分隔。例如:

java mypackage.HelloWorld AAA BBB
在mypackage.HelloWorld的main方法中就可以通过args变量来取得该参数:

1
2
3
4
public static void main(String args[]) {
String str1 = args[0];
String str2 = args[1];
}

类文件打包——jar命令

JAR工具是一个Java应用程序,可将多个文件合并为单个JAR归档文件。JAR是个多用途的存档及压缩工具,它是基于ZIP和ZLIB压缩格式。然而,设计JAR的主要目的是便于将Java Applet或应用程序打包成单个归档文件。将Applet或应用程序的组件(.class文件、图像和声音)合并成单个归档文件时,可以用Java代理(如浏览器)在一次HTTP事务处理过程中对它们进行下载,而不是对每个组件都要求一个新连接,这大大缩短了下载时间。JAR还能压缩文件,从而进一步提高了下载速度。此外,它允许Applet作者对文件中的各个项进行签名,因而可认证其来源。

一、jar命令的语法结构

jar {ctxu}[vfm0M][jar-文件][manifest-文件][-C 目录] 文件名

二、{ctxu}属性

其中{ctxu}是jar命令的子命令,每次jar命令只能包含ctxu中的一个,它们分别表示如下:

  • -c:创建新的jar文件包
  • -t:列出jar文件包的内容列表
  • -x:展开jar文件包的指定文件或者所有文件
  • -u:更新已存在的jar文件包(添加文件到jar文件包中)

三、[vfm0M]选项

[vfm0M]选项可以任选,也可以不选,它们是jar命令的选项参数。

  • -v:生成详细报告并打印到标准输出
  • -f:指定jar文件名,通常这个参数是必需的
  • -m:指定需要包含的MANIFEST清单文件
  • -0:只存储,不压缩,这样产生的jar文件包会比不用该参数产生的体积大,但速度更快
  • -M:不产生所有项的清单(MANIFEST)文件,此参数会忽略-m参数

四、参数

其它参数的意义如下:

  • [JAR文件]:即需要生成、查看、更新或者解开的JAR文件包,它是-f参数的附属参数
  • [manifest 文件]:即MANIFEST清单文件,它是-m参数的附属参数。
  • [-C 目录]:表示转到指定目录下去执行jar命令的操作。它相当于先使用cd命令转到该目录下再执行不带-C参数的jar命令,它只能在创建和更新JAR文件包的时候可用。
  • 文件名:指定一个文件/目录列表,这些文件/目录就是要添加到JAR文件包中的文件/目录。如果指定了目录,那么使用jar命令打包的时候会自动把该目录中的所有文件和子目录打入包中。

五、示例

例1:jar cf HelloWorld.jar mypackage

该命令是将mypackage中的文件打包,没有执行过程的显示,执行结果是在当前目录生成了HelloWorld.jar 文件,如果当前目录已存在HelloWorld.jar ,那么该文件将会被覆盖。

例2:jar cvfm HelloWorld.jar manifest.mf mypackage

根据当前目录中的manifest.mf 并将详细报告输出,其中manifest.mf中的内容如下:

Main-Class: mypackage.HelloWorld

Tip:在冒号后需要有一个空格

例3:jar tf HelloWorld.jar

在HelloWorld.jar 已经存在的情况下,可以查看HelloWorld.jar 中的内容。

例4:jar xvf HelloWorld.jar

将HelloWorld.jar解压到当前目录并显示解压缩的详细信息。

生成API文档——javadoc命令

一、javadoc命令的语法结构

javadoc [命令选项][包名][源文件名][@files]

其中:

  • [包名]为用空格分隔的一系列包的名字,包名不允许使用通配符,如*
  • [源文件名]为用空格分隔的一系列的源文件名,源文件名可包括路径和通配符
  • [@files]是以任何次序包含包名和源文件的一个或多个文件

二、命令选项

javadoc 命令选项包括如下几种可选属性

  • -overview<文件> :读取HTML文件的概述文档。
  • -public :仅显示公共类成员
  • -protected :显示受保护/公共类和成员(默认)
  • -package :显示软件包/受保护/公共类和成员
  • -private :显示所有类和成员
  • -help :显示命令行的选项并退出
  • -doclet<类> :通过替代doclet生成输出
  • -docletpath<路径> :指定查找doclet类文件位置
  • -sourcepath<路径列表> :指定查找源文件的位置
  • -classpath<路径列表> :指定查找用户类文件的位置
  • -exclude<软件包列表> :指定要排除的软件包的列表
  • -subpackages<子软件包列表> :指定要递归装入的子软件包
  • -breakiterator :使用BreakIterator计算第1句
  • -bootclasspath<路径列表> :覆盖引导类加载器所装入的类文件的位置
  • -source<版本> :提供与指定版本的源兼容性
  • -extdirs<目录列表> :覆盖安装的扩展目录的位置
  • -verbose :输出有关Javadoc正在执行的操作的消息
  • -locale<名称> :要使用的语言环境,例如en_US
  • -encoding<名称> :源文件编码名称
  • -quiet :不显示状态消息
  • -J<标志>:直接将<标志>传递给运行时系统

三、示例

例1:

javadoc mypackage\*.java -d javadoc

该命令用于将mypackage包下的类生成api文档,输出目录为javadoc,执行该命令后会输出一系列的执行记录。

结束语

关于jdk基本命令用法还需要不断地应用和实践,谢谢!

坚持原创技术分享,您的支持将鼓励我继续创作