Java程序运行过程中,“当前路径”是指执行java
命令所在路径,跟Java程序class文件所在路径无关。
比如现在有如下Java源代码文件(文件名为“Main.java”),代码内容如下:
import java.io.File;
public class Main {
public static void main(String[] args) {
File file = new File("a.txt");
// 打印当前路径
System.out.println(file.getAbsolutePath());
}
}
执行javac Main.java
命令,得到“Main.class”文件,将其放在“/home/dsl/data”目录下。“/hom/dsl/data”目录内容如图1所示。
图1
在“/home/dsl/data”目录下执行java -classpath /home/dsl/data Main
命令,得到结果如图2所示。
图2
在“/home/dsl”目录下执行java -classpath /home/dsl/data Main
命令,得到结果如图3所示。
Java程序运行过程中,“绝对路径”是一个固定不变的路径。比如“/home/dsl/a.txt”就是一个绝对路径。
Java程序编译和运行时都需要用到“类路径”。编译时,使用“类路径”来指定编译源代码需要用到的依赖包或者类文件的路径;运行时,使用“类路径”来指定运行程序需要用到的依赖包或者类文件的路径。
“类路径”包括两个部分:1)Java机制自维护管理部分;2)自定义部分。Java机制自维护管理部分包含“the bootstrap class path”和“the extension directory”[1]。自定义部分由命令行选项“-classpath”指定,默认为“.”(即当前路径)。
自定义部分的类路径可通过“System.getProperty(“java.class.path”)”获得。
现在有“Main.java”源代码文件,代码内容如下:
public class Main {
public static void main(String[] args) {
// 打印“类路径”
System.out.println(System.getProperty("java.class.path"));
}
}
执行javac Main.java
命令,得到“Main.class”文件。
接下来,执行java Main
得到如图4所示结果。
图4
执行java -classpath .:/home/dsl
得到如图5所示结果。
现在有一个Java项目,项目结构如图6所示。“Base.java”中只包含了最简单的类定义,“Main.java”的内容如下:
package com.dslztx.java;
import org.apache.log4j.Logger;
public class Main extends Base {
private static final Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) {
logger.info("Hello World");
}
}
在Classpath目录下执行javac -classpath "./src:./lib/log4j-1.2.13.jar" src/com/dslztx/java/Main.java
命令进行编译,编译后目录结构如图7所示。
在编译“Main.java”的过程中会自动编译“Base.java”,生成的“Base.class”的放置路径为“./src/com/dslztx/java/Base.class”,因而需要将“./src”加入类路径,如果替代的将“.”加入类路径,就会去找“./com/dslztx/java/Base.class”是否存在。
执行javac -classpath ".:./lib/log4j-1.2.13.jar" src/com/dslztx/java/Main.java
命令,出现如图8所示错误。
图8
不过要是我们预先编译“Base.java”文件,将得到的“Base.classs”放置到“./com/dslztx/java”目录下面,此时再执行javac -classpath ".:./lib/log4j-1.2.13.jar" src/com/dslztx/java/Main.java
命令,就能够正常编译。
“Main.java”中含有对Log4J包的依赖,在编译时如果不将“./lib/log4j-1.2.13.jar”加入类路径,则会编译出错。
执行javac -classpath "./src:" src/com/dslztx/java/Main.java
命令,出现如图9所示错误。
根据“4.1.1.1、正确编译方式”小节的编译结果运行,跟“4.1.1.1、正确编译方式”小节类似,正确的执行命令为java -classpath "./src:./lib/log4j-1.2.13.jar" com.dslztx.java.Main
,执行结果如图10所示。图10表示虽然程序正确运行了,但是Log4J没有正常工作,这是因为Log4J正常工作需要加载类路径下的“log4j.properties”文件。修改执行命令为java -classpath "./src:./lib:./lib/log4j-1.2.13.jar" com.dslztx.java.Main
,此时运行结果如图11所示,结果是完全正确的。
比如如下形式:
import java.io.File;
public class Main {
public static void main(String[] args) {
File file = new File("a.txt");
System.out.println(file.exists());
}
}
比如如下形式:
import java.io.File;
public class Main {
public static void main(String[] args) {
File file = new File("/home/dsl/a.txt");
System.out.println(file.exists());
}
}
使用类路径加载资源见《Java加载类路径下资源》
通过“-classpath”选项设置Java类路径有一些注意事项,可参见《设置Java类路径的注意事项》
参考文献:
[1]http://superuser.com/questions/592768/how-to-print-the-default-java-classpath-from-the-command-line-in-windows