当前位置: 首页 > news >正文

classpath对获取配置文件的影响

Java中经常要用到各种配置文件xxx.properties来控制程序的运行或进行国际化等
但是也常常遇到配置文件放置路径找不到的问题,这里以java.uitl.ResourceBundle为例,
小结一下:
1.Classloader搜索的路径是classpath指定的
2.搜索文件时走的路径顺序是按照各目录或jar文件在classpath中的出现位置顺序来的
3.配置文件相对路径的参考root就是classpath中指定的目录或jar文件包起点

例如:位于package cn.flipme.util中的Resource要读取cache目录里的config.properties
我们可以这样写:

package cn.flipme.util;

import java.util.ResourceBundle;


public class Resource {
    public static void main( String[] args )
    {
        ResourceBundle rb=ResourceBundle.getBundle("cache.config");
        System.out.println(rb.getString("name"));
    }
}

这时我们把cache目录放在src目录下面,或者用Maven的话在src/main/resources目录下面,
不管怎么样编译后都会移到classes目录下, 执行就能顺利获取到config文件:

classes-|
        -cache-|
            -config.properties
        -cn-|
            -flipme-|
                -util-|
                    -Resource.class
                    

现在我们把这个工程打包成jar,假设叫resource.jar,存放在dist目录下,
可以通过在cmd里cd到 dist目录下并输入以下命令来执行包里的Resource.class

 java -cp resource.jar cn.flipme.util.Resource

注意类Resource前面必须写上完整的包路径
Ok,到现在为止一切都按部就班,执行上面的命令 Resource正常运行,读取resource.jar里面的cache/config.properties文件,并输出相应的name属性。

那么,如果我们想改变配置文件的内容是否需要修改源文件里的config.properties然后重新打包成jar呢?
显然这样做太麻烦也不太合理,你可以在jar外面配置一个新的config.properties让jar里的Resource去读取。

问题来了,新的config应该放在哪里呢?
答案是随便,你爱放哪里都可以,只要保证它呆在某个目录的cache/目录下,并且在-cp里指定放到地方。

最简单的就是放在dist目录里,也就是和.jar同级的目录,dist/cache/config.properties
执行:java -cp .;resource.jar cn.flipme.util.Resource
这次读取的就是新的config,而不是jar里面的config
请注意到以上命令中的.;这非常重要,因为它告诉java从当前目录里找文件
还有一点非常重要,那就是.;出现的位置是在resource.jar前面,所以顺序优先了,
当java从.目录也就是当前目录里找到了cache/config.properties就停止搜索了。

为了验证顺序的重要性,你不妨试试:
执行:java -cp resource.jar;. cn.flipme.util.Resource
你会发现 ;. 放到resource.jar后面时读取的config就是jar包里的那个config

好了,搞清楚以上两点之后,可以再试试在别的地方放置config文件,比如D:\test\cache\config.properties
执行:java -cp D:\test;resource.jar cn.flipme.util.Resource
同样的读取到的就是D盘里刚刚配置的新config。

就到这里吧,发现自己太唐僧了

相关文章:

  • Delphi XE里面 SharedActivityContext 提示错误
  • Android 带你从源码的角度解析Scroller的滚动实现原理
  • ODI调用WebService----OdiInvokeWebService
  • OK335xS GPMC nand device register hacking
  • WebService的缓存机制
  • Linux压缩打包方法连载之三:bzip2, bzcat 命令
  • 用MonoDevelop开发Linux游戏
  • Android 服务类Service 的详细学习
  • Android获取返回键的点击事件
  • 赢得Docker挑战最佳实践
  • 小蚂蚁学memcache笔记—php操作memcache(2)
  • ipv6现状,加英文的中括号访问, ipv6测试http://test-ipv6.com
  • git学习------git commit命令的默认编辑器的修改
  • 新浪、万网前系统架构师高俊峰:统一监控报警平台架构设计思路
  • HTLM5 WebSocket权威指南
  • 【前端学习】-粗谈选择器
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 5、React组件事件详解
  • CAP理论的例子讲解
  • HTTP--网络协议分层,http历史(二)
  • iOS小技巧之UIImagePickerController实现头像选择
  • log4j2输出到kafka
  • Markdown 语法简单说明
  • 开发基于以太坊智能合约的DApp
  • 力扣(LeetCode)21
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端技术周刊 2019-02-11 Serverless
  • 设计模式 开闭原则
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 《天龙八部3D》Unity技术方案揭秘
  • #大学#套接字
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (TOJ2804)Even? Odd?
  • (汇总)os模块以及shutil模块对文件的操作
  • (学习日记)2024.01.09
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @Bean注解详解
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [20181219]script使用小技巧.txt
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [ffmpeg] 定制滤波器
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [Interview]Java 面试宝典系列之 Java 多线程