Java 手动编译 javac 的-classpath -sourcepath
来源:互联网 发布:全途打单软件下载 编辑:程序博客网 时间:2024/05/16 15:48
转自:http://blog.csdn.net/caesarzou/article/details/5462189
首先是官方说法:
-classpath:
设置用户类路径,它将覆盖 CLASSPATH 环境变量中的用户类路径。若既未指定 CLASSPATH 又未指定 -classpath,则用户类路径由当前目录构成。(注意:这里的-classpath的路径指的是已经编译好的.class文件)
-sourcepath:
指定用以查找类或接口定义的源代码路径。与用户类路径一样,源路径项用分号 (;) 进行分隔,它们可以是目录、JAR 归档文件或 ZIP 归档文件。如果使用包,那么目录或归档文件中的本地路径名必须反映包名。 (注意:这里的源文件就是还没有经过编译的文件,是源代码)
注意:通过类路径查找的类,如果找到了其源文件,则可能会自动被重新编译。
( 上述两个参量都是为了达到一个目的:当前编译的文件import了其他文件的类,所以编译的时候需要用到它们,可以以已经编译好的类文件的形式,也可是还未编译源文件。只要路径写对就可以。)
官方说法很简洁,但是具体操作起来总觉得不太清晰,我们还是找几个例子,来具体分析一下:
具体例子:
假设我们有如下的目录结构:
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 {
//...
}
也就是说Testbaz对Testfoo有引用。
我们目标是把Testbaz编译到目录classes里面,试用如下的命令:
javac -d classes src/baz/Testbaz.java
命令失败,因为找不到它依赖的Testfoo。我们可以用以下三种方式来实现:
1.我们最容易考虑到的就是编译被依赖的Testfoo类,并将其加入Testbaz的CLASSPATH
javac -d classes src/foo/Testfoo.java
javac -d classes -classpath classes src/baz/Testbaz.java
第二行使用了-classpath,使得编译器在寻找Testfoo类的时候以classes为根目录,根据根目录和package名,类名最终定位了需要用的(已编译出来的)Testfoo类。
2.在编译Testbaz的时候把被依赖的Testfoo类加入SOURCEPATH
javac -d classes -sourcepath src src/baz/Testbaz.java
在编译条件里面加入-verbose可以很清楚的看到,编译器在寻找Testfoo类的时候,以src为根目录,根据根目录和package名,类名最终定位了需要用的(源代码)Testfoo类。
3.把CLASSPATH和SOURCEPATH两者都加进来
javac -d classes src/foo/Testfoo.java
javac -d classes -sourcepath src -classpath classes src/baz/Testbaz.java
两个属性都被加入,编译器首先会判断Testfoo.class和Testfoo.java是否同时存在。如果单独存在,则适应于以上的方法之一。如果同时存在,则判断.class是否是.java的最新编译,如果有差异,则重新编译.java来覆盖.class
有必要补充一下-d参数:
-d参数是很好的把源程序和目标代码分离的参数。-d制定的是目标代码的根目录,源文件的包的结构将以目录形式反映到根目录上。美中不足的是-d需要指定已经存在的目录,不能自动创建。
------------------------------------------------------------------
我的实践和见解:
在用javac文件进行编译的时候一定要把待编译的.java文件的路径写到.java文件为止。而在用java指令执行.class文件的时候,文件路径到达包的上一层就可以了。
比如说:
有文件src/aa/bb/A.java
其中A类在bb这个包里
那么编译的时候写成 javac -d 目标存放目录 src/aa/bb/A.java
运行的时候写成 java src/aa/bb.A
-classpath的路径指的是已经编译好的.class文件(指明到包的前一层,余下的由包来解析目录来找)
源文件就是还没有经过编译的文件,是源代码.(指明到包的前一层,余下的由包来解析目录来找)
- Java 手动编译 javac 的-classpath -sourcepath
- javac参数(-classpath, -sourcepath)详解
- javac参数(-classpath, -sourcepath)详解
- javac参数(-classpath, -sourcepath)详解
- javac参数(-classpath,-sourcepath)详解
- java编译中sourcepath和classpath之我见
- javac 选项sourcepath的解释
- 再说一下Java里面的路径问题,CLASSPATH和SOURCEPATH
- 说一下Java里面的路径问题,CLASSPATH和SOURCEPATH
- Java里面的路径问题,CLASSPATH和SOURCEPATH
- 再说一下Java里面的路径问题,CLASSPATH和SOURCEPATH
- javac -classpath 编译servlet
- 【java】【classpath】【javac】【java】
- javac,java,classpath的各种问题
- javac 和java 使用的 -classpath 参数
- 编译程序(javac)与SOURCEPATH
- javac -classpath的使用
- javac -classpath的使用
- linux 安装supervise服务
- 让自己的开源框架支持cocoapods
- java中必须要掌握的知识
- Eclipse facebook 第三方登录 获取用户信息 附demo
- library not found for -lPods 的解决办法
- Java 手动编译 javac 的-classpath -sourcepath
- C++模板----限制模板只能某些已知类型进行实例化
- bug调试的心态
- 阅读Handler源码笔记
- C/C++中的标准库函数总结
- 简单实现安全卫士火箭上升的雏形
- hbase 建表时分region
- 实现二维码扫描后跳转
- 如何在 Ubuntu 中安装 VMTools