您的位置:首页 > 编程语言 > Java开发

JDK Tools and Utilities--- Basic Tools(二)

2017-02-04 00:00 85 查看
Basic Tools(二)

从官网互获取的一部分tools描述

Standard JDK Tools and Utilities

Basic Tools (appletviewer, extcheck, jar, java, javac, javadoc, javah, javap, jdb, jdeps)
Security Tools (keytool, jarsigner, policytool, kinit, klist, ktab)
Internationalization Tools (native2ascii)
Remote Method Invocation (RMI) Tools (rmic, rmiregistry, rmid, serialver)
Java IDL and RMI-IIOP Tools (tnameserv, idlj, orbd, servertool)
Java Deployment Tools (javapackager, pack200, unpack200)
Java Web Start Tools (javaws)
Java Troubleshooting, Profiling, Monitoring and Management Tools (jcmd, jconsole, jmc, jvisualvm)
Java Web Services Tools (schemagen, wsgen, wsimport, xjc)
Experimental JDK Tools and Utilities

NOTE - The tools described in this section are unsupported and experimental in nature and should be used with that in mind. They might not be available in future JDK versions.

Monitoring Tools (jps, jstat, jstatd)
Troubleshooting Tools (jinfo, jhat, jmap, jsadebugd, jstack)
Scripting Tools (jrunscript)

博客 Basic Tools(一)中介绍了前面四个的命令用法,现在开始从第五个开始。

javac命令

javac命令用与编译java源码文件,其语法格式如下:
javac [ options ] [ sourcefiles ] [ @files ]
参数可按任意次序排列。
options                       命令行选项。
sourcefiles                 一个或多个要编译的源文件(例如 MyClass.java)。
@files                           一个或多个对源文件进行列表的文件。
有两种方法可将源代码文件名传递给 javac:
一种是通过sourcefiles参数,直接给出要编译的源文件
如果源文件数量少,可以用这种方式,在命令行上列出文件名即可。文件与文件之间用空格非分开就可以了。
实例1
javac -d classes src\com\robin\Hello.java src\com\robin\People.java src\com\hubin\Util.java。
其实这里的源码文件每个都是单独的参数,如果文件路径包括有空格,可以用双引号把该文件名括起来。
比如上面的命令可以写成下面的样子:
示例2
javac -d classes "src\com\robin\Hello.java" "src\com\robin\People.java" "src\com\hubin\Util.java"
在没使用分号的情况下,对相同路径下的Java源码文件可以使用统配符,比如示例1可以写成:
示例3
javac -d classes src\com\robin\*.java src\com\hubin\Util.java
一种是通过@files参数
为缩短或简化javac命令,可以把要编译的java源文件名列在一个文件,文件名之间用空格或回车进行分割。然后在javac命令行中,可以用'@' 字符加上包含有要编译java源文件名的文件名来指定要编译的java源文件。因为javac当遇到以 `@' 字符,它就会对该字符后的文件所列出的所有java源文件进行编译。这种形式适用于java源文件很多的情况。
比如,我们把示例1要编译的源文件名包含在src.txt文件中。
示例4
src.txt文件:
src\com\robin\Hello.java src\com\robin\People.java
src\com\hubin\Util.java
然后运行如下的javac命令:
javac -d classes @src.txt
当然我们可以在src.txt中用双引号把单个要编译的java源码文件括起来,
但是这时路径直接的分隔符“\”就要写成"\\"的形式了。
示例5
src.txt文件
"src\\com\\robin\\Hello.java" "src\\com\\robin\\People.java"
"src\\com\\hubin\\Util.java"
这时javac命令仍然同示例3.
命令选项options
路径
-d 目录
该选项用于指定生成的class目标文件的目录。如果某个类是一个包的组成部分,则 javac 将把该类文件放入反映包名的子目录中,必要时创建目录。比如,示例1中的class目标目录就放在classes下,Hello.class和People.class位于classes\com\robin下,Util.class位于classes\com\hubin目录下。
若未指定 -d 选项,则 javac 将把类文件放到与源文件相同的目录中。
注意: -d 选项指定的目录不会被自动添加到用户类路径中。
-bootclasspath,-extdirs,-classpath和-cp
JDK在编译一个java源文件时,搜索类文件的方式和顺序如下:
  Bootstrap classes,Extension classes,User classes
  Bootstrap默认的是JDK自带的jar或zip文件,它包括jre\lib下rt.jar等文件,JDK首先搜索这些文件.
可以通过-bootclasspath来设置它。文件之间用分号";"进行分割。
  Extension默认的是位于jre"lib"ext目录下的jar文件,JDK在搜索完Bootstrap后就搜索该目录下的jar文件.
可以通过-extdirs来设置。文件之间用分号";"来进行分割
  User classes搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。
  -cp 和 -classpath 是同义词,参数意义是一样的。classpath参数太长了,所以提供cp作为缩写形式
  它们用于告知JDK搜索目录名、jar文档名、zip文档名,用分号";"进行分隔。
  例如当你自己开发了公共类并包装成一个common.jar包,在使用 common.jar中的类时,就需要用-classpath common.jar 告诉JDK从common.jar中查找该类,否则JDK就会抛出java.lang.NoClassDefFoundError异常,表明未找到类定义。
  使用-classpath后JDK将不再使用CLASSPATH中的类搜索路径,如果-classpath和CLASSPATH都没有设置,则JDK使用当前路径(.)作为类搜索路径。
  推荐使用-classpath来定义JDK要搜索的类路径,而不要使用环境变量 CLASSPATH的搜索路径,以减少多个项目同时使用CLASSPATH时存在的潜在冲突。例如应用1要使用a1.0.jar中的类G,应用2要使用 a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包,当a1.0.jar,a2.0.jar都在CLASSPATH中,JDK搜索到第一个包中的类G时就停止搜索,如果应用1应用2的虚拟机都从CLASSPATH中搜索,就会有一个应用得不到正确版本的类G。
示例6:javac -classpath lib\Util.zip -d classes src\com\robin\*.java
或 javac -cp lib\Util.zip -d classes src\com\robin\*.java
示例7:javac -classpath classes -d classes src\com\robin\*.java
或javac -cp classes -d classes src\com\robin\*.java
如果需要指定各个JAR文件具体的存放路径,相同路径有多个可使用通配符。
-sourcepath java源码文件路径
在编译时,JDK需要两方面的路径,一个是查找java源码文件的路径,一个是查找class(类)文件的路径。
关于class文件的路径上文已经已经介绍过,可以通过-bootclasspath,-extdirs,-classpath和-cp来设定。java源码文件的路径则可以通过
-sourcepath来设定,默认情况下-sourcepath和-classpath的路径一样。在编译的过程中,若需要相关java类的则首先在sourcefiles或@files列出的java源码文件中查找并编译,如果没找到,就在-sourcepath指定的路径中查找java源码文件,这时无论找没找到都会继续在类路径中进行查找。如果在sourcepath中找到了java源码文件,但是在类路径中没有找到了相关的类,或找的类位于包文件(jar或zip)中,
或找的类并不是在包文件中,但源码文件比该类文件新,这时会对源码文件进行编译,而且编译生成的类文件将会和你指定要进行编译的java源码所生成的类文件位于同一根目录。否则,除了即没找到java源码文件也没找到相关类就编译失败外,直接载入相关类就可以了。因此你得至少要指定一个要编译的java源文件。它并不是指定sourecfiles或@files中指定的要编译的java源码文件的根目录。与类路径一样,java源码路径项用分号 (;) 进行分隔,它们可以是class文件的根目录、JAR 归档文件或 ZIP 归档文件。
示例8:
javac -sourcepath src -d classes src\com\robin\Hello.java
示例9:
javac -cp lib\Util.zip -sourcepath src -d classes src\com\robin\*.java
关于编译器编译java源码的详细过程可开启-verbose进行参看,关于-verbose的详细内存请参照《javac命令详解(下)》
-source和-target
-source 版本
当你从sun安装了某个版本的JDK,而其实该JDK却包含多个版本的编译器。-source参数就是指定用哪个版本的编译器对java源码进行编译。如果你的java源码不符合该版本编译器的规范的话,当然就不能编译通过。
-target 版本
该命令用于指定生成的class文件将保证和哪个版本的虚拟机进行兼容。我们可以通过-target 1.2来保证生成的class文件能在1.2虚拟机上进行运行,但是1.1的虚拟机就不能保证了。因为java虚拟机的向前兼容行,1.5的虚拟机当然也可以运行通过-target 1.2让生成的class文件。
每个版本编译器的默认-target版本是不太一样的,
比如:
JDK1.2版本编译器支持-target 1.1,-target 1.2,-target 1.3,-target 1.4,-target 1.5,-target 1.6,它默认的就是1.1
JDK1.4版本编译器只支持-target 1.4 和-target 1.5
JDK1.5版本编译器就只支持-target 1.5
示例10
javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.1 -d classes src\com\robin\*.java
javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.3 -d classes src\com\robin\*.java
javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.4 -d classes src\com\robin\*.java
javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.5 -d classes src\com\robin\*.java
javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.6 -d classes src\com\robin\*.java
示例11
javac -cp lib\Util.zip -sourcepath src -source 1.4 -target 1.4 -d classes src\com\robin\*.java
javac -cp lib\Util.zip -sourcepath src -source 1.4 -target 1.5 -d classes src\com\robin\*.java
-deprecation
如果java源码中使用了的不鼓励使用的类或类的Field或类的方法或类的方法覆盖,那么如果使用了该参数,将显示关于此的的详细信息,否则只有个简单的Note.
示例12:
D:\project\test>javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.6 -
d classes src\com\robin\*.java
Note: src\com\robin\Hello.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

D:\project\test>javac -cp lib\Util.zip -sourcepath src -deprecation -d classes s
rc\com\robin\*.java
src\com\robin\Hello.java:11: warning: [deprecation] destroy() in java.lang.Threa
d has been deprecated
t.destroy();
^
1 warning
-encoding
设置源文件编码名称,例如UTF-8。若未指定 -encoding 选项,则使用平台缺省的编码方式。
-g
生成所有的调试信息,包括局部变量。缺省情况下,只生成行号和源文件信息。
-g:none
不生成任何调试信息。
-g:{关键字列表}
只生成某些类型的调试信息,这些类型由逗号分隔的关键字列表所指定。有效的关键字有:
source
源文件调试信息
lines
行号调试信息
vars
局部变量调试信息
-nowarn
禁用警告信息。
-verbose
冗长输出。开启该参数,你将看到编译器编译java源码的详细过程。
比如,示例13:
D:\project\test>javac -cp lib\Util.zip -sourcepath src -verbose -d classes src\c
om\robin\*.java
[parsing started src\com\robin\Hello.java]
[parsing completed 31ms]
[parsing started src\com\robin\People.java]
[parsing completed 0ms]
[search path for source files: src]
[search path for class files: C:\jdk1.6.0\jre\lib\resources.jar,C:\jdk1.6.0\jre\
lib\rt.jar,C:\jdk1.6.0\jre\lib\sunrsasign.jar,C:\jdk1.6.0\jre\lib\jsse.jar,C:\jd
k1.6.0\jre\lib\jce.jar,C:\jdk1.6.0\jre\lib\charsets.jar,C:\jdk1.6.0\jre\classes,
C:\jdk1.6.0\jre\lib\ext\dnsns.jar,C:\jdk1.6.0\jre\lib\ext\localedata.jar,C:\jdk1
.6.0\jre\lib\ext\sunjce_provider.jar,C:\jdk1.6.0\jre\lib\ext\sunmscapi.jar,C:\jd
k1.6.0\jre\lib\ext\sunpkcs11.jar,lib\Util.zip]
[loading src\com\hubin\Util.java]
[parsing started src\com\hubin\Util.java]
[parsing completed 0ms]
[loading java\lang\Object.class(java\lang:Object.class)]
[loading java\lang\String.class(java\lang:String.class)]
[checking com.robin.Hello]
[loading java\lang\Thread.class(java\lang:Thread.class)]
[wrote classes\com\robin\Hello.class]
[checking com.robin.People]
[wrote classes\com\robin\People.class]
[checking com.hubin.Util]
[wrote classes\com\hubin\Util.class]
[total 578ms]
D:\project\test>javac -cp lib\Util.zip -sourcepath src -verbose -d classes src\com\robin\*.java
[parsing started src\com\robin\Hello.java]
[parsing completed 16ms]
[parsing started src\com\robin\People.java]
[parsing completed 0ms]
[search path for source files: src]
[search path for class files: C:\jdk1.6.0\jre\lib\resources.jar,C:\jdk1.6.0\jre\
lib\rt.jar,C:\jdk1.6.0\jre\lib\sunrsasign.jar,C:\jdk1.6.0\jre\lib\jsse.jar,C:\jd
k1.6.0\jre\lib\jce.jar,C:\jdk1.6.0\jre\lib\charsets.jar,C:\jdk1.6.0\jre\classes,
C:\jdk1.6.0\jre\lib\ext\dnsns.jar,C:\jdk1.6.0\jre\lib\ext\localedata.jar,C:\jdk1
.6.0\jre\lib\ext\sunjce_provider.jar,C:\jdk1.6.0\jre\lib\ext\sunmscapi.jar,C:\jd
k1.6.0\jre\lib\ext\sunpkcs11.jar,lib\Util.zip]
[loading src\com\hubin\Util.java]
[parsing started src\com\hubin\Util.java]
[parsing completed 0ms]
[loading java\lang\Object.class(java\lang:Object.class)]
[loading java\lang\String.class(java\lang:String.class)]
[checking com.robin.Hello]
[wrote classes\com\robin\Hello.class]
[checking com.robin.People]
[wrote classes\com\robin\People.class]
[checking com.hubin.Util]
[wrote classes\com\hubin\Util.class]
[total 172ms]
D:\project\test>javac -cp lib-classes -sourcepath src -verbose -d classes src\com\robin\*.java
[parsing started src\com\robin\Hello.java]
[parsing completed 47ms]
[parsing started src\com\robin\People.java]
[parsing completed 0ms]
[search path for source files: src]
[search path for class files: C:\jdk1.6.0\jre\lib\resources.jar,C:\jdk1.6.0\jre\
lib\rt.jar,C:\jdk1.6.0\jre\lib\sunrsasign.jar,C:\jdk1.6.0\jre\lib\jsse.jar,C:\jd
k1.6.0\jre\lib\jce.jar,C:\jdk1.6.0\jre\lib\charsets.jar,C:\jdk1.6.0\jre\classes,
C:\jdk1.6.0\jre\lib\ext\dnsns.jar,C:\jdk1.6.0\jre\lib\ext\localedata.jar,C:\jdk1
.6.0\jre\lib\ext\sunjce_provider.jar,C:\jdk1.6.0\jre\lib\ext\sunmscapi.jar,C:\jd
k1.6.0\jre\lib\ext\sunpkcs11.jar,lib-classes]
[loading lib-classes\com\hubin\Util.class]
[loading java\lang\Object.class(java\lang:Object.class)]
[loading java\lang\String.class(java\lang:String.class)]
[checking com.robin.Hello]
[wrote classes\com\robin\Hello.class]
[checking com.robin.People]
[wrote classes\com\robin\People.class]
[total 656ms]
非标准选项
-X
使用该参数,可以显示所有的非标准选项的有关信息。
示例14:
C:\Documents and Settings\hubin>javac -X
-Xlint                     Enable recommended warnings
-Xlint:{all,cast,deprecation,divzero,empty,unchecked,fallthrough,path,serial,f
inally,overrides,-cast,-deprecation,-divzero,-empty,-unchecked,-fallthrough,-pat
h,-serial,-finally,-overrides,none}Enable or disable specific warnings
-Xbootclasspath/p:<path>   Prepend to the bootstrap class path
-Xbootclasspath/a:<path>   Append to the bootstrap class path
-Xbootclasspath:<path>     Override location of bootstrap class files
-Djava.ext.dirs=<dirs>     Override location of installed extensions
-Djava.endorsed.dirs=<dirs>Override location of endorsed standards path
-Xmaxerrs <number>         Set the maximum number of errors to print
-Xmaxwarns <number>        Set the maximum number of warnings to print
-Xstdout <filename>        Redirect standard output
-Xprint                    Print out a textual representation of specified typ
es
-XprintRounds              Print information about rounds of annotation proces
sing
-XprintProcessorInfo       Print information about which annotations a process
or is asked to process
-Xprefer:{source,newer}    Specify which file to read when both a source file
and class file are found for an implicitly compiled class

These options are non-standard and subject to change without notice.
-Xline:{关键字列表}
通过该命令我们将看到你java源码文件的一些危险代码,关键字有:{all,cast,deprecation,divzero,empty,unchecked,fallthrough,path,serial,f
inally,overrides,-cast,-deprecation,-divzero,-empty,-unchecked,-fallthrough,-path,-serial,-finally,-overrides,none},没有"-"前缀的表示开启,有的该前缀的表示关闭,all表示开启所有,none表示都不开启。
示例16:
D:\project\test>javac -cp lib\Util.zip -sourcepath src -Xlint:all -d classes src\com\robin\*.java
src\com\robin\Hello.java:11: warning: [deprecation] destroy() in java.lang.Threa
d has been deprecated
t.destroy();
^
src\com\robin\Hello.java:12: warning: [divzero] division by zero
int i=1/0;
^
2 warnings
-Xstdout <filename>
javac命令信息输出流的默认将在当前控制台进行显示,我们可以用该参数进行重新定义。
比如,示例17:
D:\project\test>javac -cp lib\Util.zip -sourcepath src -verbose -Xstdout 1.log -
d classes src\com\robin\*.java
这样我们在1.log文件中将看到;
[parsing started src\com\robin\Hello.java]
[parsing completed 16ms]
[parsing started src\com\robin\People.java]
[parsing completed 0ms]
[search path for source files: src]
[search path for class files: C:\jdk1.6.0\jre\lib\resources.jar,C:\jdk1.6.0\jre\lib\rt.jar,C:\jdk1.6.0\jre\lib\sunrsasign.jar,C:\jdk1.6.0\jre\lib\jsse.jar,C:\jdk1.6.0\jre\lib\jce.jar,C:\jdk1.6.0\jre\lib\charsets.jar,C:\jdk1.6.0\jre\classes,C:\jdk1.6.0\jre\lib\ext\dnsns.jar,C:\jdk1.6.0\jre\lib\ext\localedata.jar,C:\jdk1.6.0\jre\lib\ext\sunjce_provider.jar,C:\jdk1.6.0\jre\lib\ext\sunmscapi.jar,C:\jdk1.6.0\jre\lib\ext\sunpkcs11.jar,lib\Util.zip]
[loading com\hubin\Util.class(com\hubin:Util.class)]
[loading java\lang\Object.class(java\lang:Object.class)]
[loading java\lang\String.class(java\lang:String.class)]
[checking com.robin.Hello]
[wrote classes\com\robin\Hello.class]
[checking com.robin.People]
[wrote classes\com\robin\People.class]
[total 204ms]
-Xmaxerrs <number>
设置最多显示多少条编译错误
-Xmaxwarns <number>
设置最多显示多少条编译警告
其他一些Xlint选项暂时还不知道什么意思,一般也用得比较少,就打住了。
-J选项
将选项传给 javac 调用的 java 启动器。例如, -J-Xms48m 将启动内存设为 48 兆字节。虽然它不以 -X 开头,但它并不是 javac 的‘标准选项’。用 -J 将选项传给执行用 Java 编写的应用程序的虚拟机是一种公共约定。
其他一些javac命令选项暂时还不知道什么意思,一般也用得比较少,就打住了。
另外附前面的示例所用的java源码文件:
src\com\robin\Hello.java文件
package com.robin;
import com.hubin.Util;
public class Hello{
native String getHelloStringFromJni();
People p=new People();
final static String str=Util.getString();
Hello()
{
Thread t=null;
t.start();
t.destroy();
int i=1/0;
long l=10;
int n=(int)l;
}
}
src\com\robin\Peole.java文件
package com.robin;
public class People
{
String name;
}
src\com\hubin\Util.java文件
package com.hubin;
public class Util{
public final static String getString()
{
return "Hi";
}
}


javadoc命令

【javadoc命令的用法】
1.java源文件里,注释以/**开始 并以*/结束,里面可以包含普通文件,HTML标记和javaDoc标记。这些将构成javaDoc文档。
2.javadoc命令只能处理java源文件中在类声明,接口声明,成员方法声明,成员变量声明及构造方法声明之前的注释,忽略位于其它地方的注释。如 局部变量前的注释,即使符合规范也会被javadoc命令忽略。
3.常见的javadoc标记
@version 指定版本信息
@since 指定最早出现在那个版本
@author 指定作者
@see 生成参考其它javaDoc文档的链接
@link 生成参考其它javadoc文档的链接,它和@see标记的区别在于@link标记能够嵌入到注释语句中,为注释语句中的特定词汇生成链接。
@deprecated 用来标明被注释的类,变量或方法已经不提倡使用,在将来的版本中可能被废弃。
@param 描述方法的参数
@return 描述方法的返回值
@throws 描述方法抛出的异常,指明抛出异常的条件
4.javadoc命令既可以处理包,也可以处理java源文件.
javadoc [option] [packagenames] [sourcefiles]
javadoc命令的主要选项:
-public 仅为public访问级别的类及类的成员生成javaDoc文档
-proteceted 仅为public和protected访问级别的类及类的成员生成javadoc文档.
(默认选项)
-package 仅为public,protected和默认访问级别的类及类的成员生成
javaDoc文档
-private 为public,protected,默认和private访问级别的类及类的成员生成javadoc文档
-version 解析@version标记
-author 解析@author标记
-splitindex 将索引分为每个字母对应一个索引文件
-sourcepath <pathlist> 指定java源文件的路径
-classpath <pathlist> 指定classpath
-d <directory> 指定javaDoc文档的输出目录
javadoc命令的几个选项的用法:
-public,-protected,-package和-private这4个选项用于指定输出那些访问级别的类和成员的javaDoc文档.其中protected为默认选项。
-version和-author选项指定在javaDoc文档中包含由@version和@author标记指示的内容。这两个选项不是默认选项。在默认情况下,javadoc命令会忽略注释中的@version和@author标记,因此生成的javaDoc文档中不包含版本和作者信息。


javah命令

javah

生成实现本地方法所需的 C 头文件和源文件。C 程序用生成的头文件和源文件在本地源代码中引用某一对象的实例变量。.h 文件含有一个 struct 定义,该定义的布局与相应类的布局平行。该 struct 中的域对应于类中的实例变量。
头文件名以及在头文件中所声明的结构名都来源于类名。如果传给 javah 的类是在某个包中,则头文件名和结构名前都要冠以该包名。下划线 (_) 用作名称分隔符。

缺省情况下,javah 为每个在命令行中列出的类都创建一个头文件,且将该文件放在当前目录中。用 -stubs 选项创建源文件。用 -o 选项将所有列出类的结果串接成一个单一文件。

新的平台相关方法接口(Java 平台相关代码接口 (JNI))不需要头文件信息或 stub 文件。javah 仍可用于生成 JNI 风格的本地方法所需的本地方法函数原型。javah 在缺省情况下生成 JNI 风格的输出并将结果放在 .h 文件中。

javah_g 是 javah 的非优化版本,适合于与 jdb 之类的调试程序一起使用。

选项
-o 输出文件
将命令行中列出的所有类的头文件或源文件串接到输出文件中。-o 或 -d 两个选项只能选择一个。
 
-d 目录
设置 javah 保存头文件或 stub 文件的目录。-d 或 -o 两个选项只能选择一个。
 
-stubs
使 javah 从 Java 对象文件生成 C 声明。
 
-verbose
指明长格式输出,并使 javah 将所生成文件的有关状态的信息输出到标准输出设备中。
 
-help
输出 javah 用法的帮助信息。
 
-version
输出 javah 的版本信息。
-jni
使 javah 创建一输出文件,该文件包含 JNI 风格的本地方法函数原型。这是缺省输出,所以 -jni 的使用是可选的。
 
-classpath 路径
指定 javah 用来查询类的路径。如果设置了该选项,它将覆盖缺省值或 CLASSPATH 环境变量。目录用分号分隔。因此,路径的一般格式是:
.;<您的路径>
例如:

.;C:\users\dac\classes;C:\tools\java\classes
-bootclasspath 路径
指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,位于 jre\lib\rt.jar 和jre\lib\i18n.jar 中。
 
-old
指定应当生成旧 JDK1.0 风格的头文件。
 
-force
指定始终写输出文件。


javap命令

javap,是JDK自带的反汇编工具,用于将Java字节码文件反汇编为Java源代码。

javap的用法如下:

用法: javap <options> <classes>
可能的选项包括:
-help  --help  -?        打印用法信息
-version                 版本信息
-v  -verbose             打印附加信息
-l                       打印行号和本地变量表
-public                  仅显示public类和成员
-protected               显示protected/public类和成员
-package                 显示package/protected/public类和成员(默认值)
-p  -private             显示所有的类和成员
-c                       反汇编代码
-s                       打印内部类型签名
-sysinfo                 显示将被处理的类的系统信息(路径,大小,日期,MD5 哈希值)
-constants               显示static final常量
-classpath <path>        指定查找用户类文件的位置
-bootclasspath <path>    覆盖由引导类加载器所加载的类文件的位置
我们通常以如下形式使用javap:

1、不带任何可选参数(如果字节码文件就位于当前工作目录,可以不写类的包名):

#实际上等同于javap -package Person
javap Person
2、反汇编指定目录下的字节码文件:

javap -classpath D:/java/lib cn.softown.Person
3、反汇编字节码文件为JVM可以识别、执行的字节码命令:
javap -c Person
以下是可选参数的详细说明:
-classpath <pathlist>
手动指定用户class字节码文件的存放目录,javap程序将在此目录下查找class文件,多个路径以英文分号分隔。例如:javap -classpath D:\java\test Person(即使DOS窗口的当前工作目录为其他任意路径,该命令均可正确执行)。
-s
打印变量的内部类型签名,例如:javap -classpath D:\java\test -s Person。
-extdirs <dirs>
指定javap搜索已安装的java扩展的位置,默认的java扩展的位置为jre\lib\ext。例如:javap -classpath D:\java\test -extdirs D:\java\myext Person
-bootclasspath <pathlist>
指定使用Java底层类加载器(bootstrap class loader)加载的字节码文件的位置。例如:javap -classpath D:\java\test -bootclasspath D:\java\core Person
-verbose
打印方法参数和本地变量的数量以及栈区大小。
-J<flag>
传递运行时标识参数给javap,例如javap -J-version,可以有多个命令,中间以空格隔开。


jdb命令

jdb,意即Java Debugger,主要用来帮助我们查找并修复Java程序中的bug。

用法摘要

jdb的用法摘要如下:

jdb [ options ] [ class ] [ arguments ]
options
命令行选项,详见下面的介绍。
class
开始调试的类名称。
arguments
传递给class的main()方法的参数。
描述

Java调试器,jdb,是一个Java类的简单调试器。它是Java平台调试器体系结构的一个演示,该体系结构提供对本地或远程JVM的检查和调试。

开始一个jdb会话

我们有许多种方式来启动一个jdb会话。最常用的方法是jdb以待调试的应用程序的main类来运行一个新的JVM。在命令行中,我们可以替换命令中的java为jdb,从而实现该目的。例如,如果你的应用程序main类为MyClass,你可以使用如下jdb命令来调试它:

jdb MyClass
当使用这种方式启动时,jdb将调用另一个带任意指定参数的JVM,加载指定的类,并在执行这些类的第一个指令之前停止VM。

使用jdb的另一种方式是将其附加到已经运行的JVM中,想要使用jdb调试的JVM必须使用下列选项参数来启动。这些选项参数会加载过程调试库,并指定创建哪种连接。

-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
例如,下列命令将会运行MyClass应用程序,并允许jdb稍后连接它。
java -agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=n MyClass
你可以使用如下命令将jdb附加到JVM:
jdb -attach jdbconn
注意,在这个例子中,我们并没有在jdb命令中中指定"MyClass",因为jdb连接到的是一个现有的虚拟机,而不是运行一个新的虚拟机。我们有许多种方式可以将调试器连接到虚拟机,而jdb支持所有的这些方式。Java平台调试器体系结构有一个与这些连接选项相关的附加文档。关于启动一个J2SE 1.4.2或更早版本的虚拟机,并与jdb进行搭配使用的相关信息,请查看1.4.2文档。
基本的jdb命令

以下是基本的jdb命令列表。Java调试器支持jdb帮助命令列出的其他命令。
help, or ?
最重要的jdb命令,用于显示带简要说明的公认的命令列表。
run
在启动jdb,并且设置任何必要的断点之后,你可以使用此命令来启动待调试的应用程序的执行。只有使用jdb运行待调试的应用程序时(与附加到现有的虚拟机的做法相反),该命令才可用。
cont
在一个断点、异常或者步骤之后,继续待调试的应用程序的执行。
print
显示Java对象和原生值。 对于原生类型的变量或字段而言,将会打印实际的值;对于对象而言,将打印一个简单的描述。请查看下方的dump命令以获取关于对象的更多信息。
注意: 为了显示本地变量,包含的类必须使用javac -g 选项进行编译。

print支持多种包含方法调用的简单Java表达式,例如:

print MyClass.myStaticField
print myObj.myInstanceField
print i + j + k (i, j, k are primities and either fields or local variables)
print myObj.myMethod() (if myMethod returns a non-null)
print new java.lang.String("Hello").length()
dump
对于原生值而言,该命令等同于print。对于对象而言,它会打印对象中每个定义的字段的当前值。静态字段和实例字段均包含在内。
threads
列出当前正在运行的线程,并打印出每个线程的名称和当前状态,以及可用于其他命令的索引值。例如:

4. (java.lang.Thread)0x1 main      running
在这个示例中,线程的索引为4,该线程是java.lang.Thread的一个实例,线程名称为"main",该线程正在运行。

thread
选择一个线程作为当前线程。许多jdb命令都是基于当前线程的设置。该线程可以用上面threads命令中描述的索引值来指定。
where
不带参数的where将输出当前线程的堆栈信息。where all 将输出当前线程组中所有线程的堆栈信息。where threadindex 将输出指定索引的线程的堆栈信息。
如果当前线程被挂起(通过诸如一个断点的事件或挂起命令来实现),使用print和dump变量将打印本地变量和字段。向上向下命令可以选择当前的栈帧。

断点

在jdb中,我们可以在指定行号或方法的第一个指令处设置断点,例如:

stop at MyClass:22 (在MyClass第22行源代码的第一个指令处设置一个断点)
stop in java.lang.String.length (在java.lang.String.length方法的开始位置设置一个断点)
stop in MyClass.<init> (<init>标识MyClass的构造函数)
stop in MyClass.<clinit> (<clinit>标识MyClass的静态初始化代码)
如果一个方法被重载,你也必须指定它的参数类型,以便于断点能够选择适当的方法。例如:MyClass.myMethod(int,java.lang.String),或者MyClass.myMethod()。

我们可以使用语法类似于clear MyClass:45的clear命令来删除断点。使用不带参数的clear命令可以显示当前设置的所有断点列表。使用cont命令可以继续向下执行。

步进

step命令用于向前执行到当前栈帧或被被调用方法的下一行,next命令用于向前执行到当前栈帧的下一行。

异常

如果发生了一个没有被catch语句捕获的异常,虚拟机通常会打印该异常的追踪信息并退出程序。当运行于jdb之下时,无论如何,抛出的异常都会被控制返回到jdb上,然后,你可以使用jdb来诊断异常的原因。

使用catch命令让待调试的应用程序在其他抛出异常的位置暂停,例如:catch java.io.FileNotFoundException或catch mypackage.BigTroubleException。指定类(或子类)实例的任何异常都将在异常的抛出位置暂停应用程序。

ignore命令用于取消上一个catch命令的作用效果。

注意:ignore命令不会导致待调试的虚拟机忽略指定的异常,而是仅作用于调试器。

命令行选项

当你使用在命令行中使用jdb时,jdb接受大多数与java命令相同的选项参数,包括-D,-classpath,和-X<option>等。

jdb接受如下额外选项:

-help
显示帮助信息。
-sourcepath <dir1:dir2:...>
指定源代码文件的搜索路径。如果此选项未指定,则默认为"."。
-attach <address>
使用默认的连接机制,将调试器附加到之前运行的虚拟机上。
-listen <address>
使用标准器连接器在指定的地址等待正在运行的虚拟机进行连接。
-listenany
使用标准连接器在任何可用的地址等待正在运行的虚拟机进行连接。
-launch
当启动jdb时,立即启动待调试的应用程序。此选项不需要使用运行命令。待调试的应用程序将会运行,然后在加载初始化应用类之前暂停。 此时,你可以设置任何必要的断点,然后使用cont来继续执行。
-listconnectors
列出在此虚拟机上可用的连接器。
-connect <connector-name>:<name1>=<value1>,...
使用命名的连接器和列出的参数值连接目标虚拟机。
-dbgtrace [flags]
打印正在调试的jdb的相关信息。
-tclient
以Java HotSpot虚拟机(客户端)模式运行应用程序。
-tserver
以Java HotSpot虚拟机(服务器)模式运行应用程序。
-Joption
传递选项参数给Java虚拟机,并用于运行jdb。(Java虚拟机程序的选项参数使用运行命令来传递。) 例如,-J-Xms48m 设置启动内存为48MB。
其他选项支持连接调试器的替代机制和虚拟机调试。Java平台调试器体系结构提供了关于连接方案的附加文档。

转发到被调试的进程的选项参数

-v -verbose[:class|gc|jni]
启用冗余模式。
-D<name>=<value>
设置系统属性。
-classpath <directories separated by ":">
列出用于查找类的目录。
-X<option>
非标准的目标虚拟机选项。


jdeps命令(jdk8新加入的一个工具)

jdeps [options] classes ...

options
Command-line options. See Options.

classes
Name of the classes to analyze. You can specify a class that can be found in the class path, by its file name, a directory, or a JAR file.

Description
The jdeps command shows the package-level or class-level dependencies of Java class files. The input class can be a path name to a .class file, a directory, a JAR file, or it can be a fully qualified class name to analyze all class files. The options determine the output. By default, jdeps outputs the dependencies to the system output. It can generate the dependencies in DOT language (see the -dotoutput option).

Options
-dotoutput <dir>
Destination directory for DOT file output. If specified, jdeps will generate one dot file per each analyzed archive named <archive-file-name>.dot listing the dependencies, and also a summary file named summary.dot listing the dependencies among the archives.

-s
-summary
Prints dependency summary only.

-v
-verbose
Prints all class-level dependencies.

-verbose:package
Prints package-level dependencies excluding dependencies within the same archive.

-verbose:class
Prints class-level dependencies excluding dependencies within the same archive.

-cp <path>
-classpath <path>
Specifies where to find class files.

See also Setting the Class Path.

-p <pkg name>
-package <pkg name>
Finds dependencies in the specified package. You can specify this option multiple times for different packages. The -p and -e options are mutually exclusive.

-e <regex>
-regex <regex>
Finds dependencies in packages matching the specified regular expression pattern. The -p and -e options are mutually exclusive.

-include <regex>
Restricts analysis to classes matching pattern. This option filters the list of classes to be analyzed. It can be used together with -p and -e which apply pattern to the dependencies.

-jdkinternals
Finds class-level dependences in JDK internal APIs. By default, it analyzes all classes specified in the -classpath option and in input files unless you specified the -include option. You cannot use this option with the -p, -e, and -s options.

Warning: JDK internal APIs may not be accessible in upcoming releases.

-P
-profile
Shows profile or the file containing a package.

-apionly
Restricts analysis to APIs, for example, dependences from the signature of public and protected members of public classes including field type, method parameter types, returned type, and checked exception types.

-R
-recursive
Recursively traverses all dependencies.

-version
Prints version information.

-h
-?
-help
Prints help message for jdeps.

Examples
Analyzing the dependencies of Notepad.jar.

$ jdeps demo/jfc/Notepad/Notepad.jar

demo/jfc/Notepad/Notepad.jar -> /usr/java/jre/lib/rt.jar
<unnamed> (Notepad.jar)
-> java.awt
-> java.awt.event
-> java.beans
-> java.io
-> java.lang
-> java.net
-> java.util
-> java.util.logging
-> javax.swing
-> javax.swing.border
-> javax.swing.event
-> javax.swing.text
-> javax.swing.tree
-> javax.swing.undo
Use -P or -profile option to show on which profile that Notepad depends.

$ jdeps -profile demo/jfc/Notepad/Notepad.jar
demo/jfc/Notepad/Notepad.jar -> /usr/java/jre/lib/rt.jar (Full JRE)
<unnamed> (Notepad.jar)
-> java.awt                                           Full JRE
-> java.awt.event                                     Full JRE
-> java.beans                                         Full JRE
-> java.io                                            compact1
-> java.lang                                          compact1
-> java.net                                           compact1
-> java.util                                          compact1
-> java.util.logging                                  compact1
-> javax.swing                                        Full JRE
-> javax.swing.border                                 Full JRE
-> javax.swing.event                                  Full JRE
-> javax.swing.text                                   Full JRE
-> javax.swing.tree                                   Full JRE
-> javax.swing.undo                                   Full JRE
Analyzing the immediate dependencies of a specific class in a given classpath, for example the com.sun.tools.jdeps.Main class in the tools.jar file.

$ jdeps -cp lib/tools.jar com.sun.tools.jdeps.Main
lib/tools.jar -> /usr/java/jre/lib/rt.jar
com.sun.tools.jdeps (tools.jar)
-> java.io
-> java.lang
Use the -verbose:class option to find class-level dependencies or use the -v or -verbose option to include dependencies from the same JAR file.

$ jdeps -verbose:class -cp lib/tools.jar com.sun.tools.jdeps.Main

lib/tools.jar -> /usr/java/jre/lib/rt.jar
com.sun.tools.jdeps.Main (tools.jar)
-> java.io.PrintWriter
-> java.lang.Exception
-> java.lang.Object
-> java.lang.String
-> java.lang.System
Use the -R or -recursive option to analyze the transitive dependencies of the com.sun.tools.jdeps.Main class.

$ jdeps -R -cp lib/tools.jar com.sun.tools.jdeps.Main
lib/tools.jar -> /usr/java/jre/lib/rt.jar
com.sun.tools.classfile (tools.jar)
-> java.io
-> java.lang
-> java.lang.reflect
-> java.nio.charset
-> java.nio.file
-> java.util
-> java.util.regex
com.sun.tools.jdeps (tools.jar)
-> java.io
-> java.lang
-> java.nio.file
-> java.nio.file.attribute
-> java.text
-> java.util
-> java.util.jar
-> java.util.regex
-> java.util.zip
/usr/java/jre/lib/jce.jar -> /usr/java/jre/lib/rt.jar
javax.crypto (jce.jar)
-> java.io
-> java.lang
-> java.lang.reflect
-> java.net
-> java.nio
-> java.security
-> java.security.cert
-> java.security.spec
-> java.util
-> java.util.concurrent
-> java.util.jar
-> java.util.regex
-> java.util.zip
-> javax.security.auth
-> sun.security.jca                                   JDK internal API (rt.jar)
-> sun.security.util                                  JDK internal API (rt.jar)
javax.crypto.spec (jce.jar)
-> java.lang
-> java.security.spec
-> java.util
/usr/java/jre/lib/rt.jar -> /usr/java/jre/lib/jce.jar
java.security (rt.jar)
-> javax.crypto
Generate dot files of the dependencies of Notepad demo.

$ jdeps -dotoutput dot demo/jfc/Notepad/Notepad.jar
jdeps will create one dot file for each given JAR file named <filename>.dot in the dot directory specified in the -dotoutput option, and also a summary file named summary.dot that will list the dependencies among the JAR files

$ cat dot/Notepad.jar.dot
digraph "Notepad.jar" {
// Path: demo/jfc/Notepad/Notepad.jar
"<unnamed>"                                        -> "java.awt";
"<unnamed>"                                        -> "java.awt.event";
"<unnamed>"                                        -> "java.beans";
"<unnamed>"                                        -> "java.io";
"<unnamed>"                                        -> "java.lang";
"<unnamed>"                                        -> "java.net";
"<unnamed>"                                        -> "java.util";
"<unnamed>"                                        -> "java.util.logging";
"<unnamed>"                                        -> "javax.swing";
"<unnamed>"                                        -> "javax.swing.border";
"<unnamed>"                                        -> "javax.swing.event";
"<unnamed>"                                        -> "javax.swing.text";
"<unnamed>"                                        -> "javax.swing.tree";
"<unnamed>"                                        -> "javax.swing.undo";
}

$ cat dot/summary.dot
digraph "summary" {
"Notepad.jar"                  -> "rt.jar";
}


参考博客:http://blog.csdn.net/hudashi/article/details/7058999
http://www.cnblogs.com/fjhh/p/5370642.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: