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

Java中“路径”浅谈

2016-01-26 20:15 736 查看

一、当前路径

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所示。

图3



结论:图1和图2中不同打印结果论证了上述说法。

二、绝对路径

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所示结果。

图5



四、路径用途

4.1、指定编译或者运行需要依赖包或者类文件的路径

现在有一个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");
}
}


图6



4.1.1、编译

[b]4.1.1.1、正确编译方式[/b]

在Classpath目录下执行
javac -classpath "./src:./lib/log4j-1.2.13.jar" src/com/dslztx/java/Main.java
命令进行编译,编译后目录结构如图7所示。

图7



[b]4.1.1.2、错误编译方式1[/b]

在编译“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
命令,就能够正常编译。

[b]4.1.1.3、错误编译方式2[/b]

“Main.java”中含有对Log4J包的依赖,在编译时如果不将“./lib/log4j-1.2.13.jar”加入类路径,则会编译出错。

执行
javac -classpath "./src:" src/com/dslztx/java/Main.java
命令,出现如图9所示错误。

图9



4.1.2、运行

根据“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所示,结果是完全正确的。

图10



图11



4.2、用于加载资源

4.2.1、使用当前路径加载资源

比如如下形式:

import java.io.File;

public class Main {
public static void main(String[] args) {
File file = new File("a.txt");
System.out.println(file.exists());
}
}


4.2.2、使用绝对路径加载资源

比如如下形式:

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());
}
}


4.2.3、使用类路径加载资源

使用类路径加载资源见《Java加载类路径下资源》

通过“-classpath”选项设置Java类路径有一些注意事项,可参见《设置Java类路径的注意事项》

参考文献:

[1]http://superuser.com/questions/592768/how-to-print-the-default-java-classpath-from-the-command-line-in-windows
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: