资讯专栏INFORMATION COLUMN

classpath对获取配置文件的影响

xumenger / 380人阅读

摘要:,到现在为止一切都按部就班,执行上面的命令正常运行,读取里面的文件,并输出相应的属性。那么,如果我们想改变配置文件的内容是否需要修改源文件里的然后重新打包成呢显然这样做太麻烦也不太合理,你可以在外面配置一个新的让里的去读取。

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: estcacheconfig.properties
执行:java -cp D: est;resource.jar cn.flipme.util.Resource
同样的读取到的就是D盘里刚刚配置的新config。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64486.html

相关文章

  • Java基础:Java核心技术提示易忽略点 Ch4

    摘要:所以,在读的核心技术的过程中,我记录下这些所谓的易忽略的问题,这些问题将会持续更新在我的这个的博客下,也算是激励自己重新挖掘这些基础问题的内涵。类路径只是让能够通过配置好的全路径名找到所需的外部类。 开篇Java是一门不那么简单也不那么复杂的语言,Java里面有很多问题和特性是容易被使用者忽视的,这些问题也许会难住新手,同时也许会是老手不小心跌入的无故之坑,只有精于对基础的提炼才能最大...

    ytwman 评论0 收藏0
  • Spring-Boot学习笔记

    摘要:学习笔记使用很容易创建一个独立运行运行内嵌容器准生产级别的基于框架的项目,使用你可以不用或者只需要很少的配置。异常消息如果这个错误是由异常引起的。错误发生时请求的路径。 Spring-Boot 1.5 学习笔记 使用Spring Boot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很...

    curlyCheng 评论0 收藏0
  • Java开发环境不再需要配置classpath

    摘要:原配置代码原代码详解代表了我们的路径是关于运行环境的类库,主要是用于的包,如果不使用可以不配置。参见扩展机制如果您从的早期版本升级,那么您的启动设置可能包括不再需要的类路径设置。 showImg(https://segmentfault.com/img/remote/1460000019275936?w=600&h=242); 前言: 之前发布了关于java开发环境配置的文章,经过与网...

    dackel 评论0 收藏0
  • Java™ 教程(PATH和CLASSPATH

    PATH和CLASSPATH 本节介绍如何在Microsoft Windows,Solaris和Linux上使用PATH和CLASSPATH环境变量,有关最新信息,请参阅安装Java Development Kit(JDK)软件包中随附的安装说明。 安装软件后,JDK目录将具有如下所示的结构。 showImg(https://segmentfault.com/img/bVbqpb7?w=282&h...

    Ku_Andrew 评论0 收藏0
  • classpath(译)

    摘要:另外,指定多个类路径也是可以的。系列使用的的分隔符是系列使用的分隔符是。类文件指定需要执行的文件。在已经制定设置的环境下,环境变量的设置将会无效优先级的问题。当前目录将会无效。是的核心类,里包含与国际化有关的类。 源自Javaの道日语技术社区原文地址译者梦梦的幻想乡見てくれてありがとうござい!!! クラスパス(译) classpath 这一章将会讲解classpath的概要和设定方法。...

    wudengzan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<