`

关于JAVA项目中CLASSPATH路径详解

 
阅读更多

在dos下编译java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候。classpath就是存放.class等编译后文件的路径。

javac:如果当前你要编译的java文件中引用了其它的类(比如说:继承),但该引用类的.class文件不在当前目录下,这种情况下就需要在javac命令后面加上-classpath参数,通过使用以下三种类型的方法 来指导编译器在编译的时候去指定的路径下查找引用类。

(1).绝对路径:javac -classpath c:/junit3.8.1/junit.jar Xxx.java
(2).相对路径:javac -classpath ../junit3.8.1/Junit.javr Xxx.java
(3).系统变量:javac -classpath %CLASSPATH% Xxx.java (注意:%CLASSPATH%表示使用系统变量CLASSPATH的值进行查找,这里假设Junit.jar的路径就包含在CLASSPATH系统变量中)

javac 绝对路径的使用:

javac:假设你要编译的类文件名叫:HelloWorld.java,其完全路径为:D:/java/HelloWorld.java。但你所在的当前目录是:C:/Documents and Settings/peng>。如果想在这里执行编译,会有什么结果呢?

(1).C:/Documents and Settings/peng> javac HelloWorld.java 这时编译器会给出如下的错误提示信息:
error: cannot read: HelloWorld.java
这是因为默认情况下javac是在当前目录下查找类文件,很明显这个路径不是我们存放类文件的地方,所以就会报错了

(2).C:/Documents and Settings/peng>javac D:/java/HelloWorld.java
这时编译成功。
所以,只要你执行javac命令的目录不是类文件存放的目录,你就必须在javac命令中显式地指定类文件的路径。

java -classpath的使用:

java:假设我们的CLASSPATH设置为:D:/peng/java/pro ,在该目录下有三个文件:HelloWorld.java / HelloWorldExtendsTestCase / HelloWorldExtendsHelloWorld。这三个文件的类声明分别如下:

HelloWorld.java :public class HelloWorld
HelloWorldExtendsHelloWorld.java :public class HelloWorldExtendsHelloWorld extends HelloWorld
HelloWorldExtendsTestCase.java:public class HelloWorldExtendsTestCase extends junit.framework.TestCase

假设我们已经按照上面关于javac -classpath和javac 绝对路径的使用,顺利地完成了三个文件地编译。现在我们在C:/Documents and Settings/peng>目录下执行这三个.class文件

(1).C:/Documents and Settings/peng>java HelloWorld
Hello World

可以看到执行成功。为什么我们在
C:/Documents and Settings/peng>执行命令,JVM能够找到D:/peng/java/pro/HelloWorld.class文件呢?这是因为我们配置了系统变量CLASSPATH,并且指向了目录:D:/peng/java/pro 。所以JVM会默认去该目录下加载类文件,而不需要指定.class文件的绝对路径了。

(2).C:/Documents and Settings/peng>java HelloWorldExtendsHelloWorld
Hello World

可以看到执行成功了。HelloWorldExtendsHelloWorld继承了HelloWorld类,所以在执行时JVM会先查找在CLASSPATH下是否存在一个HelloWorld.class文件,因为我们已经成功编译了HelloWorld类了,所以可以成功执行HelloWorldExtendsHelloWorld.class

(3).C:/Documents and Settings/peng>java HelloWorldExtendsTestCase
Exception in thread "main" java.lang.NoClassDefFoundError: junit/framework/TestCase
可以看到程序抛出异常了,提示找不到junit.framework.TestCase文件。为什么同样在:/peng/java/pro下,HelloWorldExtendsHelloWorld.class就可以成功执行,而这个就不行了呢?这是因为: junit.framework.TestCase.class文件并不存在于当前目录下,所以为了能够让程序成功运行,我们必须通过指定CLASSPATH的方式,让JVM可以找到junit.framework.TestCase这个类,如(4):
(4). C:/Documents and Settings/peng>java -classpath %CLASSPATH% HelloWorldExtendsTestCase
Hello World
总结:
(1).何时需要使用-classpath:当你要编译或执行的类引用了其它的类,但被引用类的.class文件不在当前目录下时,就需要通过-classpath来引入类
(2).何时需要指定路径:当你要编译的类所在的目录和你执行javac命令的目录不是同一个目录时,就需要指定源文件的路径(CLASSPATH是用来指定.class路径的,不是用来指定.java文件的路径的)


JAVA获取classpath路径:

ClassLoader提供了两个方法用于从装载的类路径中取得资源:

public URLgetResource(String name);
public InputStreamgetResourceAsStream(String name);

这里name是资源的类路径,它是相对与“/”根路径下的位置。getResource得到的是一个URL对象来定位资源,而getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据。
但是真正使用的不是ClassLoader的这两个方法,而是Class的 getResource和getResourceAsStream方法,因为Class对象可以从你的类得到(如YourClass.class或 YourClass.getClass()),而ClassLoader则需要再调用一次YourClass.getClassLoader()方法,不过根据JDK文档的说法,Class对象的这两个方法其实是“委托”(delegate)给装载它的ClassLoader来做的,所以只需要使用 Class对象的这两个方法就可以了。

因此,直接调用this.getClass().getResourceAsStream(String name);获取流,静态化方法中则使用ClassLoader.getSystemResourceAsStream(String name); 。

下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。

1.this.getClass().getResource("")
得到的是当前类class文件的URI目录。不包括自己!
如:file:/D:/workspace/jbpmtest3/bin/com/test/

2.this.getClass().getResource("/")
得到的是当前的classpath的绝对URI路径
如:file:/D:/workspace/jbpmtest3/bin/

3.this.getClass().getClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径
如:file:/D:/workspace/jbpmtest3/bin/

4.ClassLoader.getSystemResource("")
得到的也是当前ClassPath的绝对URI路径
如:file:/D:/workspace/jbpmtest3/bin/

5.Thread.currentThread().getContextClassLoader().getResource("")
得到的也是当前ClassPath的绝对URI路径
如:file:/D:/workspace/jbpmtest3/bin/

6.ServletActionContext.getServletContext().getRealPath(“/”)
Web应用程序中,得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。
如:file:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/WebProject


注意点:

1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径。这是一颗定时炸 弹,随时可能要你的命。

2.尽量使用URI形式的绝对路径资源。它可以很容易的转变为URI,URL,File对象。

3.尽量使用相对classpath的相对路径。不要使用绝对路径。使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

4.绝对不要使用硬编码的绝对路径。因为,我们完全可以使用ClassLoader类的getResource("")方法得到当前classpath的绝对路径。如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!

获得CLASSPATH之外路径的方法:
URL base = this.getClass().getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/
String path = new File(base.getFile(), "……/……/……/"+name).getCanonicalPath(); //就可以得到/home/popeye/testjava/name

另外,如果从ANT启动程序,this.getClass().getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。

PS:以上内容很多来自转载和自己的部分总结。
分享到:
评论

相关推荐

    java项目中获取路径详解

    Java 项目中获取路径详解 在 Java 项目中,获取路径是非常重要的,因为它关系到项目的正确运行。特别是在 Java Web 项目中,获取路径变得更加复杂。下面我们将详细讨论 Java 项目中获取路径的方法和注意事项。 ...

    JavaWeb项目中classpath路径详解

    JavaWeb项目中classpath路径详解 在JavaWeb项目中,classpath路径是一个非常重要的概念,它直接影响着项目的正确运行和资源的加载。classpath路径是指WEB-INF文件夹下的classes目录,它是存放各种资源配置文件、...

    java项目中的各种路径详解[参考].pdf

    在Java项目中,路径管理是至关重要的,尤其是在处理文件、资源配置和网络请求时。本文将深入探讨Java项目中涉及的几种路径类型及其使用方法。 首先,我们来看Web项目中的相对路径。在HTML部分,JSP文件可以使用相对...

    JAVA获取CLASSPATH路径的方法详解

    本文将详细解析如何在Java中获取`CLASSPATH`路径,并介绍相关的方法和技术。 首先,`ClassLoader`类是Java中负责加载类和资源的核心组件。它提供了两个方法来获取资源: 1. `public URL getResource(String name)`...

    Path和classpath配置详解

    在Java编程环境中,路径(Path)和类路径(Classpath)是两个至关重要的概念,它们对程序的编译和运行起着决定性的作用。本文将深入解析这两个概念,并结合源码和工具,帮助你理解它们的工作原理。 首先,让我们来...

    java中path和classpath的设置

    ### Java中的Path与Classpath设置详解 在Java开发过程中,正确配置环境变量是十分重要的一步。其中,`path`和`classpath`是最为关键的两个环境变量,它们直接影响到Java程序能否正常编译和运行。 #### 一、Path 的...

    java的classpath的终结者(不会让你失望)

    ### Java的Classpath详解及其重要性 在Java编程的学习与实践中,环境配置是入门的关键步骤之一,其中最为棘手的问题之一便是如何正确设置`classpath`。`classpath`不仅影响着程序能否正常编译和运行,还关系到...

    java classpath 配置详细讲解

    ### Java Classpath 配置详解 #### 一、前言 对于初学Java的朋友而言,配置Java环境常常是一项艰巨的任务,尤其是如何正确设置`classpath`。这篇文章将通过一系列实际操作来详细阐述`classpath`的配置过程,帮助...

    Java零基础 - classpath环境变量详解.md

    ### Java零基础 - classpath环境变量详解 #### 1. classpath环境变量的定义与作用 **classpath** 是一个环境变量,在Java编程中扮演着极其重要的角色。它指定了Java虚拟机(JVM)搜索和加载类文件(class files)的...

    详解Java中-classpath和路径的使用

    在实际项目中,通常会将库和自定义类文件组织在特定的目录结构或JAR文件中,然后通过`-classpath`或`CLASSPATH`来指定这些库的路径,确保程序能正常编译和运行。此外,现代IDE(如IntelliJ IDEA和Eclipse)通常会...

    java classloader classpath 张孝祥

    类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath`)则是指明了这些`.class`文件的位置。本文主要围绕Java类加载器和类路径展开讨论,以加深对Java运行时...

    java路径详解

    Java路径详解主要涉及Java编程中如何正确处理和访问文件或资源的路径问题。在Java中,路径的解析和使用对于程序的正常运行至关重要,尤其是在处理类路径(ClassPath)资源时。以下是一些关键知识点: 1. **路径类型...

    java文件路径获取

    ### Java 文件路径获取方法详解 #### 一、引言 在Java开发中,经常会遇到需要获取文件路径的情况,尤其是在处理配置文件、图片等资源时。本文将详细介绍Java中获取文件路径的各种方法及其应用场景,帮助开发者更好...

    基于获取JAVA路径,包括CLASSPATH外的路径的方法详解

    在Java编程中,获取Java路径以及CLASSPATH外部的路径是非常关键的操作,尤其当需要加载类、资源文件或进行系统级操作时。这篇文章主要探讨了几种获取这些路径的方法。 首先,我们来看一下如何获取Java路径。Java...

    java中package用法详解

    ### Java中Package用法详解 #### Package的基本概念 在Java编程语言中,`package`是一种重要的组织工具,用于管理类和接口,防止命名冲突,并帮助开发者更好地组织代码。`package`类似于Unix或Linux中的文件系统...

    Java路径问题

    本文将深入探讨Java路径问题,包括如何解决Java安装和使用过程中的常见路径问题,以及如何有效地管理类路径(classpath)。 #### 一、Java路径基础 Java路径主要涉及两种类型:类路径(classpath)和系统路径。类路径...

    java动态添加外部jar包到classpath的实例详解

    在Java中,classpath是指Java虚拟机(JVM)在搜索类文件时所遵循的路径。在Java应用程序中,我们可以通过配置classpath来指定要加载的jar包。在传统的开发方式中,我们通常是将需要的jar包添加到项目的classpath中,...

    classpath 和path

    当运行Java程序时,JVM会根据`classpath`中定义的路径来加载所需的类文件。如果类文件不在`classpath`中指定的路径下,那么将无法成功加载这些类,导致程序运行失败。 #### 二、配置方法 不同的操作系统有不同的...

Global site tag (gtag.js) - Google Analytics