`
smiky
  • 浏览: 254174 次
  • 性别: Icon_minigender_1
  • 来自: 天门
社区版块
存档分类
最新评论

JAVAC命令学习

阅读更多

参考资料:http://download.oracle.com/javase/1.4.2/docs/tooldocs/windows/javac.html

http://download.oracle.com/javase/1.5.0/docs/tooldocs/solaris/javac.html

-cp与-sourcepath在jdk1.4与j.5的分隔符分别为:1.4 分号;    1.5冒号:(但是我在1.5的测结果只有用分号是对的,用冒号报错)

标准选项:

-classpath与-cp作用:搜索类文件的路径,可以用分号(;)来分隔多个信息,它可以包话目录、jar包、zip。在没有指定时,

默认为环境变量,没有环境变量默认为当前目录,一旦指定了值,那么默认的东西都会失效,既想指定-cp,又想包含classpath

只能-cp %classpath%

 

切记:

-cp与-sourcepath都不会去某个文件夹的子目录去查找源文件或类,必须手工一个目录一个目录的添加

-cp不会去查找目录中的jar包,如有一个名为test.jar,它里面有个Test.class,执行java -cp . Test将失败,必须用java -cp test.jar Test才行

如下:

C:\>javac -sourcepath javac;javac/sourcepath javac/Test.java

C:\>java -cp javac;javac/sourcepath Test

需要的类或源文件在javac/sourcepath下面,指定javac目录会找不到对应的类与源文件

 

-d:用于指定class文件存放的目录,如下面的-d bin,class将会放在bin/org/zengge下面,这里的bin必须存在,否则会编译失败

-derpecation:不显示使用己过时的方法的相关信息

-encoding :指定源文件编码,如果没有指定,会使用操作系统默认字符庥。UTF-8的java文件,如果不指定encoding,在中文环境下编

  译会出现乱码

-g:产生debug信息,此时会包含vars,默认只有lines与source信息

-g:(source、lines、vars)分别包含不同的debug信息

-nowarn :去除告警信息

-source : 个人感觉是指定jdk的版本啊,它会支持源码包含断言,如-source 1.4,将会支持j2se1.4的断言,1.3不支持断言,编译器

 默认取用1.3的source行为,说白了就是不支持断言

-sourcepath:指定源文件的搜索路径,默认为classpath与当前目录,它同cp一样,可以用分号(;)来分隔多个信息,它可以包话目录、jar包、zip。

   如果带有包名,那么包名要与路径名对应,就是org.zengge必须为org/zengge

-verbose:显示类的加载信息及类的编译信息,可以用来跟踪编译过程

 

 

JDK1。5后添加的:

-Djava.ext.dirs它会覆盖扩展类,就是jre/lib/ext下面的几个包里面的类将不会被查找

dnsns.jar,localedata.jar,sunjce_provider.jar,sunpkcs11.jar,用它的好处在于一次可以指定多个用于查找类文件的目录,-cp指定的路径

下面的类会被查找,但是jar不会被查找,要想用-cp来找一个jar,只能-cp path/a.jar,当要指定多个jar时,用-cp就太难了,特别是在web开

发时,一个指定几十个上百个包是不可能的,这时用-Djava.ext.dirs来指定包所在的目录就方便很多了,而且它可以用分号来分隔不同的目录

例:

E:\zg\workspace\smartspeed-backup>javac -verbose -encoding UTF-8 -d bin -sourcepath src -Djava.ext.dirs=WebRoot/WEB-INF/

lib;javaeelib src/com/vixtel/commonuser/actions/*.java

 

跨平台选项:

-target:指定生成的class文件工作在指定版本的虚拟机

例:-target 1.3 产生的class文件将运行在1.3及以后版本的虚拟机,如下

E:\zg\workspace\forTest\src\org\zengge>javac -encoding UTF-8 -verbose  MyEclipseKeyGen.java -target 1.4

javac: 目标版本 1.4 与默认的源版本 1.5 冲突

 

-bootclasspath:指定引导类的路径,可以包含路径,jar,zip,用;分隔

-extdirs:指定扩展类的路径,可以包含路径,jar,zip,用;分隔

 

非标准选项:

-X

 

JAVAC查找类型的过程:

1.找到了对应的class,没有源文件,就使用这个class

2.找到了源文件,但是没有class,就编译这个源文件并使用产生的class文件

3.在源文件与class都存在的情况下,先判断class文件是否过期,判断的标准为class文件的产生的日期是否早于源文件,如果class过期了,就重新编译

源文件并使用产生的class

 

例子:

在同一个目录下有两个类及一个目录bin(bin里面放了MyImport.class):

public class MyImport

{

public void test(){

System.out.println("import");

}

}

 

public class Test

{

public static void main(String[] args){

MyImport i = new MyImport();

i.test();

}

}

 

测试一:不指定-classpath与sourcepath

C:\javac>javac -verbose Test.java

[解析开始时间 Test.java]

[解析已完成时间 15ms]

[源文件的搜索路径: [E:\zg\opensource\apache-ant\lib, E:\zg\softInstall\Java\jdk1.5.0_07\lib\dt.jar, E:\zg\softInstall\J

ava\jdk1.5.0_07\lib\tools.jar, E:\zg\opensource\axis\axis-1_4\lib\axis.jar, E:\zg\opensource\axis\axis-1_4\lib\commons-d

iscovery-0.2.jar, E:\zg\opensource\axis\axis-1_4\lib\commons-logging-1.0.4.jar, E:\zg\opensource\axis\axis-1_4\lib\jaxrp

c.jar, E:\zg\opensource\axis\axis-1_4\lib\saaj.jar, E:\zg\opensource\axis\axis-1_4\lib\log4j-1.2.8.jar, E:\zg\opensource

\axis\axis-1_4\lib\xml-apis.jar, E:\zg\opensource\axis\axis-1_4\lib\xercesImpl.jar, .]]

[类文件的搜索路径: [E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jsse.

jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jce.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\charsets.jar, E:\zg\

softInstall\Java\jdk1.5.0_07\jre\lib\ext\dnsns.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\localedata.jar, E:\zg

\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunjce_provider.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunpkcs11.

jar, E:\zg\opensource\apache-ant\lib, E:\zg\softInstall\Java\jdk1.5.0_07\lib\dt.jar, E:\zg\softInstall\Java\jdk1.5.0_07\

lib\tools.jar, E:\zg\opensource\axis\axis-1_4\lib\axis.jar, E:\zg\opensource\axis\axis-1_4\lib\commons-discovery-0.2.jar

, E:\zg\opensource\axis\axis-1_4\lib\commons-logging-1.0.4.jar, E:\zg\opensource\axis\axis-1_4\lib\jaxrpc.jar, E:\zg\ope

nsource\axis\axis-1_4\lib\saaj.jar, E:\zg\opensource\axis\axis-1_4\lib\log4j-1.2.8.jar, E:\zg\opensource\axis\axis-1_4\l

ib\xml-apis.jar, E:\zg\opensource\axis\axis-1_4\lib\xercesImpl.jar, .]]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/Object.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/String.class)]

[正在检查 Test]

[正在装入 .\MyImport.class]

[已写入 Test.class]

[总时间 219ms]

 

从测试一的执行过程来看:在没有指定-classpath与-sourcepath的情况下:

源文件的搜索路径为:classpath环境变量指定的路径、jar和当前目录

类文件的搜索路径:引导类、扩展类、classpath环境变量、当前目录

 

测试二:指定sourcepath

C:\javac>javac -verbose -sourcepath bin Test.java

[解析开始时间 Test.java]

[解析已完成时间 16ms]

[源文件的搜索路径: [bin]]

[类文件的搜索路径: [E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jsse.

jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jce.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\charsets.jar, E:\zg\

softInstall\Java\jdk1.5.0_07\jre\lib\ext\dnsns.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\localedata.jar, E:\zg

\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunjce_provider.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunpkcs11.

jar, E:\zg\opensource\apache-ant\lib, E:\zg\softInstall\Java\jdk1.5.0_07\lib\dt.jar, E:\zg\softInstall\Java\jdk1.5.0_07\

lib\tools.jar, E:\zg\opensource\axis\axis-1_4\lib\axis.jar, E:\zg\opensource\axis\axis-1_4\lib\commons-discovery-0.2.jar

, E:\zg\opensource\axis\axis-1_4\lib\commons-logging-1.0.4.jar, E:\zg\opensource\axis\axis-1_4\lib\jaxrpc.jar, E:\zg\ope

nsource\axis\axis-1_4\lib\saaj.jar, E:\zg\opensource\axis\axis-1_4\lib\log4j-1.2.8.jar, E:\zg\opensource\axis\axis-1_4\l

ib\xml-apis.jar, E:\zg\opensource\axis\axis-1_4\lib\xercesImpl.jar, .]]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/Object.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/String.class)]

[正在检查 Test]

[正在装入 .\MyImport.class]

[已写入 Test.class]

[总时间 219ms]

测试二指定了sourcepath的情况下:

源文件的搜索路径为:-sourcepath指定的目录,这里为当前目录

类文件的搜索路径:引导类、扩展类、classpath环境变量、当前目录

 

测试三:指定classpath

C:\javac>javac -verbose -classpath bin Test.java

[解析开始时间 Test.java]

[解析已完成时间 16ms]

[源文件的搜索路径: [bin]]

[类文件的搜索路径: [E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jsse.

jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jce.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\charsets.jar, E:\zg\

softInstall\Java\jdk1.5.0_07\jre\lib\ext\dnsns.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\localedata.jar, E:\zg

\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunjce_provider.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunpkcs11.

jar, bin]]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/Object.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/String.class)]

[正在检查 Test]

[正在装入 bin\MyImport.class]

[已写入 Test.class]

测试三可以看出,在只指定-classpath不指定sourcepath的情况下:

源文件的搜索路径为:-classpath指定的路径(也就是说这里的-sourcepath被-classpath的值取代了)

类文件的搜索路径:引导类、扩展类、-classpath指定的路径,classpath环境变量的东西没了

 

 

从测试四开始将MyImport.java放入sourcepath

 

测试四(a):指定-classpath与-sourcepath(此时bin里面有MyImport.class,sourcepath里面没有MyImport.java)

C:\javac>javac -verbose -cp bin -sourcepath sourcepath Test.java

[解析开始时间 Test.java]

[解析已完成时间 31ms]

[源文件的搜索路径: [sourcepath]]

[类文件的搜索路径: [E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jsse.

jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jce.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\charsets.jar, E:\zg\

softInstall\Java\jdk1.5.0_07\jre\lib\ext\dnsns.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\localedata.jar, E:\zg

\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunjce_provider.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunpkcs11.

jar, bin]]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/Object.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/String.class)]

[正在检查 Test]

[正在装入 bin\MyImport.class]

[已写入 Test.class]

[总时间 172ms]

测试四(a)结果::

源文件的搜索路径为:-sourcepath指定的路径

类文件的搜索路径:引导类、扩展类、-classpath指定的路径,

 

测试四(b):指定-classpath与-sourcepath(此时sourcepath里面有MyImport.java,bin里面没有MyImport.class)

C:\javac>javac -verbose -cp bin -sourcepath sourcepath Test.java

[解析开始时间 Test.java]

[解析已完成时间 16ms]

[源文件的搜索路径: [sourcepath]]

[类文件的搜索路径: [E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jsse.

jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jce.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\charsets.jar, E:\zg\

softInstall\Java\jdk1.5.0_07\jre\lib\ext\dnsns.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\localedata.jar, E:\zg

\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunjce_provider.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunpkcs11.

jar, bin]]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/Object.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/String.class)]

[正在检查 Test]

[正在装入 sourcepath\MyImport.java]

[解析开始时间 sourcepath\MyImport.java]

[解析已完成时间 0ms]

[已写入 Test.class]

[正在检查 MyImport]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/System.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/io/PrintStream.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/io/FilterOutputStream.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/io/OutputStream.class)]

[已写入 sourcepath\MyImport.class]

[总时间 188ms]

测试四(b)结果::

源文件的搜索路径为:-sourcepath指定的路径

类文件的搜索路径:引导类、扩展类、-classpath指定的路径,

 

 

测试五(a):指定-classpath与-sourcepath(sourcepath里面有MyImport.java,bin里面有MyImport.class且没过期)

C:\javac>javac -verbose -cp bin -sourcepath sourcepath Test.java

[解析开始时间 Test.java]

[解析已完成时间 31ms]

[源文件的搜索路径: [sourcepath]]

[类文件的搜索路径: [E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jsse.

jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jce.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\charsets.jar, E:\zg\

softInstall\Java\jdk1.5.0_07\jre\lib\ext\dnsns.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\localedata.jar, E:\zg

\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunjce_provider.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunpkcs11.

jar, bin]]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/Object.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/String.class)]

[正在检查 Test]

[正在装入 bin\MyImport.class]

[已写入 Test.class]

[总时间 172ms]

源文件的搜索路径为:-sourcepath指定的路径

类文件的搜索路径:引导类、扩展类、-classpath指定的路径,

使用没过期的MyImport.class

 

测试五(b):指定-classpath与-sourcepath(sourcepath里面有MyImport.java,bin里面有MyImport.class且过期)

C:\javac>javac -verbose -cp bin -sourcepath sourcepath Test.java

[解析开始时间 Test.java]

[解析已完成时间 15ms]

[源文件的搜索路径: [sourcepath]]

[类文件的搜索路径: [E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jsse.

jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\jce.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\charsets.jar, E:\zg\

softInstall\Java\jdk1.5.0_07\jre\lib\ext\dnsns.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\localedata.jar, E:\zg

\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunjce_provider.jar, E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\ext\sunpkcs11.

jar, bin]]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/Object.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/String.class)]

[正在检查 Test]

[正在装入 sourcepath\MyImport.java]

[解析开始时间 sourcepath\MyImport.java]

[解析已完成时间 0ms]

[已写入 Test.class]

[正在检查 MyImport]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/lang/System.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/io/PrintStream.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/io/FilterOutputStream.class)]

[正在装入 E:\zg\softInstall\Java\jdk1.5.0_07\jre\lib\rt.jar(java/io/OutputStream.class)]

[已写入 sourcepath\MyImport.class]

[总时间 187ms]

源文件的搜索路径为:-sourcepath指定的路径

类文件的搜索路径:引导类、扩展类、-classpath指定的路径,

此时会找到MyImport.java并编译,接着使用最新的MyImport.class

 

测试五其实可以简化,两个类在一个目录,第一次编译完成后,修改MyImport.java文件,接着再编译,就会出现测试五的结果

 

 

总结:

-classpath默认为:引导类、扩展类、classpath环境变量、当前目录,指定值后为引导类、扩展类、指定的目录

-sourcepath:默认为:classpath环境变量、当前目录,指定值后为指定的目录

 

在只指定-classpath的情况下,-sourcepath的默认值改为-classpath指定的目录

 

在既能找到class又能找到类的情况下:编译器会先判断class是否过期,过期的话就会重新编译java文件

2
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics