Java中“路径”浅谈

一、当前路径

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
Java中“路径”浅谈_第1张图片

4.1.1、编译

4.1.1.1、正确编译方式

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

图7
Java中“路径”浅谈_第2张图片

4.1.1.2、错误编译方式1

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

4.1.1.3、错误编译方式2

“Main.java”中含有对Log4J包的依赖,在编译时如果不将“./lib/log4j-1.2.13.jar”加入类路径,则会编译出错。
执行javac -classpath "./src:" src/com/dslztx/java/Main.java命令,出现如图9所示错误。

图9
Java中“路径”浅谈_第3张图片

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

你可能感兴趣的:(语言)