`
xiaosunzhu
  • 浏览: 7579 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

Java资源路径各种情况总结(classpath)

阅读更多

Java获取资源(getResource的方式)的搜寻顺序是:首先是Bootstrap加载的jar包,然后是扩展加载的jar包,最后是我们自己配置的classpath。这个具体步骤就不详细说明了,如有需要请参考查找Classes的官方文档
在实际项目中前两个步骤一般我们不太关心。更多的是需要配置和查找资源文件,如果了解一些关于classpath的知识,就能更准确的找到资源文件。

 

这里总结一些基本的信息:

 

1. 获取classpath

一般来说,可以通过System.getProperty("java.class.path")来获取classpath。
但是有一种情况并不适用,如果程序以jar包方式运行,这样获取的classpath就只有一个,就是运行的jar包文件。但其实classpath并不只有这一个jar包,这只是一个入口jar,真正的classpath还包括该jar包的META-INF/MANIFEST.MF文件中的“Class-Path: ”项。因此该方法并不完全适用。

 

2. classpath的父路径

获取到的classpath并不能确定是绝对路径还是相对路径,取决于配置写的是绝对还是相对路径,获取的时候并不会自动转换为绝对路径。因此需要确定如何得到父路径。

  • 以非jar包运行,此时classpath的父路径是工作目录,取自System.getProperty("user.dir")。
  • 以jar包运行,该jar包配置的“Class-Path: ”的父路径是该jar包所在目录。

3. 配置classpath

如同上面所说,是否是以jar包运行,classpath的情况的不同的,配置方式也有所差异。配置classpath是为了能够找到class文件(包括jar包中)及资源文件,如果配置目录并不会查找目录下的所有jar包,因此凡是在jar包中的资源需要配置jar包。

  • 以非jar包运行,那么就可以使用java的 -cp 或 -classpath 进行配置,后面跟随的是目录或jar文件,并且支持*通配符匹配多个jar文件,多个classpath以系统路径分隔符进行分隔(通过System.getProperty("path.separator")获得,windows是";",linux是":")。
  • 以jar包运行,使用-cp/-classpath是无效的,必须在META-INF/MANIFEST.MF文件中配置“Class-Path: ”项,包括目录或jar文件,这里并不支持*通配符匹配多个jar文件,需要一一配置,多个classpath以空格分隔。

4. classpath查找顺序

遍历classpath的顺序与配置的classpath的顺序完全一致。如果是以jar包运行,因为入口是jar包,在System中获取的classpath也是该jar包,因此会先在该jar包中查找,然后再按顺序遍历查找MANIFEST.MF文件中“Class-Path: ”的配置。

 

由以上特点总结,在配置、或查找资源时,需要注意运行方式。如果以jar包方式运行,而需要读取jar包外的资源,就需要把资源所在的路径(相对路径是相对于jar包所在目录)配置到MANIFEST.MF文件中。

 

有的时候编写可执行jar包项目,需要获取配置文件,此时,我们其实更希望是这样一种查找顺序:先找文件系统中的配置文件,如果存在,则使用该配置文件,如果不存在,则使用打包在jar中的配置。因为打包时为了使用方便,可以把默认配置放在jar包中,但是如果要自定义配置,一般并不会直接修改jar包中的文件,而是需要将配置放在文件系统中,方便修改。所以一般来说,文件系统的classpath应当优先于jar包进行查找。
之前提供的resource-utils库自0.0.5版本开始,提供支持这种配置查找顺序,方便使用配置文件。

分享到:
评论

相关推荐

    Java路径问题最终解决方案 —可定位所有资源的相对路径寻址

    Java路径问题最终解决方案 —可定位所有资源的相对路径寻址 通过相对classpath路径实现自由寻找资源的助手类的源代码

    Java路径的最终解决方案:相对路径寻址

    文中指出尽量不要使用相对于System.getProperty(\\\"user....使用上面 ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

    Java程序设计基础:环境变量配置.pptx

    ClassPath 类路径环境变量 JAVA_HOME 环境变量 Java环境变量 指向JDK安装后的根目录,如“ C:\Program files\Java\jdk1.8.0_20”,Eclipse、NetBeans等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。 Path...

    Java 读取类路径下的资源文件实现代码

    主要介绍了Java 读取类路径下的资源文件实现代码的相关资料,主要实现工具类代码ResourceLoadUtil.java的实例需要的朋友可以参考下

    java 环境配置(2024超全教程)-学习Android第一步就是配置Java的开发环境-供大家学习研究参考

    CLASSPATH:JAVA的库的路径,就是JDK的安装路径下的lib路径。 添加全局变量步骤如下: 右键点在桌面的计算机图标上,在弹出的菜单里选择Properties(属性)。 在弹出的窗口里,左侧边栏,点击Advanced system ...

    Java Platform SE binary-jdk-8u361-Windows-x64.rar

    变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.8.0_311(安装目录版本号路径) 2、「系统变量」双击->Path->编辑环境变量 -> 分别新建3条 C:\Program Files\Java\jdk1.8.0_311\bin C:\Program Files\Java\...

    java虚拟机参数

    > 为类(classes)和资源(resources)的引导启动设置搜索路径 -Xbootclasspath/a:;> 在引导启动classpath参数中添加新的classpath,并设置在classpath的最后。用分号分割。 -Xbootclasspath/p:;> ...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》是作者多年来教学实践的经验总结,汇集了学员在教学过程中遇到的概念、操作、应用或认证考试上的各种问题及解决方案。  《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE...

    JAVA--达内培训笔记

    Java ME --- 微小平台,用在资源受限的平台上 3、(1)跨平台 --- 一次编译,到处运行 (2)简 单 --- 简化C++,取消了指针,对指针进行了上层的封装,它保证能够通过这个指针(引用),来访问有效的内存单元。...

    加载文件资源的三种方式

    加载文件资源的三种方式 ~1.从classpath根目录下加载指定名称的文件 2.从classpath根目录下加载指定名称的文件 3. 从classpath根目录下加载指定名称的文件 4. 获取当前文件的绝对路径

    浏览器插件

    7、 当使用java命令解释一个程序时,一定需要 classpath 环境属性来定位类资源路径; 2、选择题 1、 下面那个是属于解释Java程序所使用到命令?(A) A、 java.exe B、 javac.exe C、 keytool.exe D、 cmd.exe 2、 ...

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入...

    mybatis中文版教程

    推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它...

    基于Mahout协同过滤的MovieRecommender-1电影推荐系统Java源码

    - Classpath文件:1个,定义项目编译路径 项目简述:MovieRecommender-1是一个基于Apache Mahout库实现的协同过滤推荐系统。该系统利用Java语言开发,旨在为用户提供个性化的电影推荐服务。通过分析用户行为和数据...

    sb系列003文章配置学习资源

    其实,这个配置类不需要有太深的理解,只要能知道配置类在get bean 之前就可以了。...#默认路径下,classpath的路径下 #管理员角色的基本信息 role: name: admin descriptio: 管理员 permissionIds: -10 -11 -12

    linux下安装ImageMagick-6.5+JMagick -6.4 经测试成功的

    注:资源包中包含了必要的.tar.gz安装包,ImageMagick-6.5太大了点,自己去官网下载 Jmagick包中的Changelog.txt中有ImageMagick与JMagick版本对应的关系的说明 ) 安装说明: ================================== cd /...

    基于Mahout框架的movieRecommender电影推荐系统源码

    - 类路径配置:1个CLASSPATH文件,用于指定项目所需的类路径。 项目简介:movieRecommender系统是一款基于Apache Mahout框架实现的个性化电影推荐系统。它运用协同过滤算法,通过对用户历史行为数据的分析,为用户...

    resource-utils:Java项目的实用程序,用于获取或准备resourcelibdll ..文件,并适应普通的类,可运行的jar,Web容器等

    从classPath获取文件系统中的绝对路径 将资源从类路径复制到文件系统 UnicodeInputStream 一个适用于unicode文件的InputStream包装器。 提供此工具是因为某些Unicode文件具有BOM表头,但是java base io读取BOM作为...

    64位的jdk1.6_45 for Windows

    该资源是jdk1.6(也加Java6)里的最后一个版本:jdk1.6.45和jre1.6.45,适用于64位的Windows。 1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:F:\Program ...

    基于Mahout协同过滤的MovieRecommender电影推荐系统源码

    项目名称:MovieRecommender - ... - Classpath文件:1个,定义项目类路径 总体而言,MovieRecommender系统通过高效的协同过滤算法,结合易于使用的用户界面,为电影爱好者提供精准的个性化推荐服务,增强用户体验。

Global site tag (gtag.js) - Google Analytics