深入探究Java项目中的classpath

深入探究Java项目中的classpath
1. 引言

在Java编程的过程中,经常涉及到对本地资源的读取。比如,SSM框架中,通过Spring框架需要读取其对应的配置文件来实现对SpringBean的实例化。Mybatis框架需要读取配置文件来获取数据库相关的参数。SpringMVC也需要读取配置文件,获得前端控制器的配置参数。

在普通的Java项目中,也需要读取配置文件来提高对程序的维护性。一个常见的资源读取类ResourceBundle,常用来这个类主要用来解决国际化和本地化问题。当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包(大多数情况下也就是.properties文件)中加载它。这样可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。

所有的资源读取情况,都需要涉及到路径的概念。这里面有一个关键的路径,便是classpath。

所谓的classpath,指的是类路径, 不管是SSM框架还是SpringBoot框架下,classpath就是指类路径。也就是java程序编译后后.class文件的所在的路径。

2.Java程序源目录 与 classpath.

众所周知,Java是一种半编译半解释型的语言。由程序员开发的.java程序,需要经过javac编译为.class字节码文件,最后有Java虚拟机将字节码解释为二进制机器码。其过程如下:

Java 程序运行过程

由于Java项目最终都需要经过编译为字节码文件。所以,在我们开发过程中的包含.java文件的目录路径,与程序最终的包含.class文件的目录路径是有所不同的。程序最终基于路径读取资源文件,都是在包含.class文件的目录中读取的。为了保证编程过程中路径的正确读取,我们需要了解Java源程序中的的目录结构 与 编译后的目录结构的映射关系。

2.1 Java源程序的目录结构

在常见的Java项目,主要分为普通的Java项目和JavaWeb项目。一般而言,JavaWeb项目较普通的Java项目的目录结构只有少许不同:

对比两者的目录结构如下:

图一 Java项目图二 JavaWeb项目
普通Java项目目录javaWeb目录结构

从上图可以看出,JavaWeb项目比普通的Java项目多了一个webapp文件夹,该文件夹主要是存放一些前端的页面信息。且两个项目中,带有金黄色标志的的res/resources文件都是用来存放开发环境下的资源文件的。

2.2 本地环境下的Java程序的classpath.

在一个普通的的java项目中,.java格式的源文件最终会被打包为.class格式的文件,经过类加载器的加载,运行在Java虚拟机中。

一个Java程序,会由自动化构建工具对所有的源码进行构建,默认会最终生成一个target目录。 该目录存放项目构建后的文件和目录,jar包,war包和编译后的class文件。一个普通的的Java程序与一个JavaWeb项目编译之后的Target目录结构如下:

图一普通的的Java程序图二 JavaWeb项目
普通Java项目的Target目录JavaWeb项目的target目录

观察到上图图2中,出现了一些配置文件mybatis.xml等.这些文件对应在源文件src/main/resources下。所以可以推断,resources目录下的文件,最终会被打包至target/classes.

之所以两种项目最后均会生成target目录,是因为idea中,默认将项目模块的编译结果输出到target目录中。打开idea的project structure 设置,可以看到如下页面:

编译输出路径设置PNG

所以,在默认的情况下,Java项目中的classpath路径,就是target/classes.

2.3 Java项目与JavaWeb项目的classpath区别。

一般而言,Java项目主要面向桌面程序的应用,主要是awt、swing这类的编码,不包括JSP等前台页面的代码,大部分是CS架构的工程和一些jar包。JavaWeb项目是BS架构的系统,是网页的编码,像Jsp、Servlet、Struts这类的, JavaWeb项目部署到服务器上,任何用户都可以通过浏览器来访问。两者的classpath的主要区别如下:

  • 编译后路径不同

Java Project和Web Project其实都是Java语言的应用,只是应用场合不同罢了,那么他们的本质区别到底是编译后路径位置不同!在Java项目中,.classpath文件,是在每个项目的目录下存在的。该项目定义了编译后的路径。这个编译后的路径,便是本文中所说的classpath.

下面展示了一个Web项目的.classpath文件,xml代码如下:

1. <?xml version="1.0" encoding="UTF-8"?>
2. <classpath>
3.       <classpathentry kind="src" path="src"/>
4.       <classpathentry kind="src" path="resources"/>
5.       <classpathentry kind="src" path="test"/>
6.       <classpathentry kind="uu" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
7.       <classpathentry kind="lib" path="lib/servlet-api.jar"/>
8.       <classpathentry kind="lib" path="webapp/WEB-INF/lib/struts2-core-2.1.8.1.jar"/>
9.       ……
10.     <classpathentry kind="output" path="webapp/WEB-INF/classes"/>
11. </classpath>

在xml文档包含一个根元素,就是classpath类路径。子元素是classpathentry,kind属性区别了种类信息。src表示源码,uu是JRE容器的相关信息。lib表示是项目依赖的第三方类库,output表示src编译后的位置。

由于Web项目是要发布到服务器上的,服务器读取的是类文件和页面文件,而不管源文件。在服务器中,是忽略WEB-INF上一级目录的,而直接从WEB-INF目录开始读。所以,最终的运行,跟我们在开发环境中中命名为webapp还是webRoot无关。

3.Java程序开发目录与部署目录的对比。

Java源程序文件最终会被编译到目标文件。而这个目标文件,就是我们说的classpath.如果我们知道了源文件中的什么目录,最终会被编译到classes文件,便可以将需要从classpath中读取的文件信息放置到这些目录之中。

一个Web工程的目录映射图表示如下:

映射图

从上图可知,一个Web工程,最终生成的编译结过,以项目名Chicken为根目录,所有的源文件
对应的.class文件,会被放置WEB-INF/classes文件中(由于Web程序是被部署到Web容器中,所以项目的。classes文件必须被放置在WEB-INF/classes中。可通过 Project Structure来设置.class文件的位置)。实际上,源文件中的Resources文件也会被映射到WEB-INF/classes文件。

4.总结

对于web工程,classpath:实际上指的是/WEB-INF/classes目录!

  • classpath对应源程序中的src文件夹和resources文件夹。

对于普通Java项目,classpath:实际上指的是/target/classes目录!

  • classpath对应源程序中的src文件夹。
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JAVA项目CLASSPATH是一个重要的环境变量,用于指定JAVA程序运行时需要加载的类和资源文件的路径。如果CLASSPATH设置不正确,会导致无法找到类文件或资源文件,从而引发程序运行异常。以下是关于JAVA项目CLASSPATH路径的详解: 1. CLASSPATH的设置 在命令行设置CLASSPATH的方法如下: ``` java -classpath <path1>:<path2>:<path3> <classname> ``` 其,`<path1>`、`<path2>`、`<path3>`表示类文件或资源文件所在的路径,多个路径之间用冒号分隔。`<classname>`表示要执行的类名。 在Eclipse等开发工具,可以在项目的配置设置CLASSPATH。 2. CLASSPATH的顺序 当JAVA程序需要加载一个类或资源文件时,会按照CLASSPATH指定的顺序依次在各个路径查找文件。如果找到了就直接加载,否则就继续查找下一个路径,直到找到该文件或查找完所有路径为止。 因此,在设置CLASSPATH时,需要注意路径的顺序。一般来说,应该将当前项目的路径放在最前面,以确保程序能够正确地加载项目的类和资源文件。 3. CLASSPATH的写法 在设置CLASSPATH时,路径的写法有以下几种: - 绝对路径:例如`/usr/local/java/lib`,表示在根目录下的`/usr/local/java/lib`路径查找文件。 - 相对路径:例如`./lib`,表示在当前路径下的`./lib`路径查找文件。 - 通配符:例如`./lib/*.jar`,表示在当前路径下的`./lib`路径查找所有以`.jar`结尾的文件。 4. CLASSPATH的常见问题 在JAVA项目,常见的CLASSPATH路径问题有以下几种: - 类文件或资源文件不存在:如果CLASSPATH指定的路径不存在要加载的类文件或资源文件,会导致程序运行异常。 - CLASSPATH顺序设置不正确:如果CLASSPATH指定的顺序不正确,可能会导致程序加载的类文件或资源文件不是期望的那个,从而引发程序运行异常。 - CLASSPATH路径包含空格:如果CLASSPATH路径包含空格,需要使用双引号将路径括起来,否则可能会导致程序无法正确加载类文件或资源文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值