javac参数(-classpath, -sourcepath)详解

简介:

首先是官方说法:

-classpath:

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

 

-sourcepath:

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

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

 

    官方说法很简洁,但是具体操作起来总觉得不太清晰,我们还是找几个例子,来具体分析一下:

具体例子:

    假设我们有如下的目录结构:

    src-|

         |-foo-|

                  |-Testfoo.java

         |-baz-|

                   |-Testbaz.java

    classes-|

其中Testfoo.java:

package foo;

public class Testfoo {

//....

}

其中Testbaz.java:

package baz;

import foo.Testfoo;

public class Testbaz {

//...

}

也就是说TestbazTestfoo有引用。

我们目标是把Testbaz编译到目录classes里面,试用如下的命令:

javac -d classessrc/baz/Testbaz.java

命令失败,因为找不到它依赖的Testfoo。我们可以用以下三种方式来实现:

1.我们最容易考虑到的就是编译被依赖的Testfoo类,并将其加入TestbazCLASSPATH

javac -d classessrc/foo/Testfoo.java

javac -d classes -classpathclasses src/baz/Testbaz.java

第二行使用了-classpath,使得编译器在寻找Testfoo类的时候以classes为根目录,根据根目录和package名,类名最终定位了需要用的(已编译出来的)Testfoo类。

 

2.在编译Testbaz的时候把被依赖的Testfoo类加入SOURCEPATH

javac -d classes -sourcepath srcsrc/baz/Testbaz.java

在编译条件里面加入-verbose可以很清楚的看到,编译器在寻找Testfoo类的时候,以src为根目录,根据根目录和package名,类名最终定位了需要用的(源代码)Testfoo类。

 

3.CLASSPATHSOURCEPATH两者都加进来

javac -d classessrc/foo/Testfoo.java

javac -d classes -sourcepath src-classpath classes src/baz/Testbaz.java

两个属性都被加入,编译器首先会判断Testfoo.classTestfoo.java是否同时存在。如果单独存在,则适应于以上的方法之一。如果同时存在,则判断.class是否是.java的最新编译,如果有差异,则重新编译.java来覆盖.class

 

有必要补充一下-d参数:

-d参数是很好的把源程序和目标代码分离的参数。-d制定的是目标代码的根目录,源文件的包的结构将以目录形式反映到根目录上。美中不足的是-d需要指定已经存在的目录,不能自动创建。










本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/1772920,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
IDE Java Linux
classpath和jar3-15
classpath和jar3-15
|
5月前
|
Java Android开发
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
解决Android编译报错:Unable to make field private final java.lang.String java.io.File.path accessible
792 1
|
5月前
|
前端开发 Java 编译器
classpath中存在多个jar存在同限定名的class classloader会如何加载
总之,合理组织类路径和使用现代化的构建工具,可有效避免类加载冲突,保证应用的稳定运行。
182 8
|
8月前
|
Java Scala
idea报错“Static methods in interface require -target:jvm-1.8”
idea报错“Static methods in interface require -target:jvm-1.8”
75 0
日常报错 - NO constructor found in matching [java.lang.String]解决方法
日常报错 - NO constructor found in matching [java.lang.String]解决方法
555 0
|
安全 Java Linux
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
73 0
|
Java
IDEA 启动服务报错:Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun 解决方案
IDEA 启动服务报错:Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun 解决方案
2558 1
|
Java
Java Error: The public type HelloWorld must be defined in its own file
Java Error: The public type HelloWorld must be defined in its own file
184 0
|
Java 关系型数据库 MySQL
15. 成功解决:java: Can't generate mapping method with primitive return type.
今天启动 SpringBoot 项目时,报了如下错误:`java: Can't generate mapping method with primitive return type.`
1084 0
|
Java
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
jar的MANIFEST.MF配置了Class-Path, java -classpath设置无效
253 0