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
相关文章推荐
- SpringMVC 常用注解简介
- 设置Java类路径的注意事项
- java中==与equals的比较分析
- Sublime for Java
- 关于在eclipse上搭建Genymotion模拟器的一些常见错误心得
- java 重现CPU乱序执行问题
- java中的闭包
- Java入门二 2 封装
- java中int,float,long,double取值范围,内存泄露
- java中int,float,long,double取值范围,内存泄露
- 回调方法介绍之中国好室友篇(Java示例)
- java类的生命周期分析
- 将java程序打包为一个可执行jar包的另一种方式
- java中abstract详解
- The Java™ Tutorials — Generics :Generic Methods and Bounded Type Parameters 泛型方法和受限类型参数
- 将java程序打包为一个可执行jar包
- java火车站售票系统之多线程并发访问
- java线程安全之死锁问题
- ehcache+spring配置
- java.util.Collection体系源码解读<四>AbstractList源码解读