`
fantaxy025025
  • 浏览: 1329752 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

jar包内存在同名同路径的配置文件,会出问题吗?

 
阅读更多

 

问题:

#两个jar包,a.jar,   b.jar

#各有一个配置文件,同名同路径,都是conf/db.properties,内容*不*同。

#这俩jar包都会读取*其jar内*的此配置文件

问题是:会出现混淆问题么?

 

答案:

# 如何读取jar保内的配置文件。

# jvm的classloader加载文件的顺序。

# 加载.class文件和其他文件有区别吗?

 

其他:

一定要解决此问题的,否则多个module依赖会出现很大的问题。

 

工程:

a.jar

public class TestAaa {

    public static void main(String[] args) {
        TestAaa.readDbProp();
        System.out.println("----");
        TestAaa.scanProps();
    }

    public static void readDbProp() {
        //返回读取指定资源的输入流
        InputStream is = TestAaa.class.getResourceAsStream("/conf/db.properties");
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String s = "";
        try {
            while ((s = br.readLine()) != null){
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void scanProps(){
        Enumeration<URL> ps = null;
        URL url = null;
        try {
            ps = Thread.currentThread().getContextClassLoader().getResources("conf/db.properties");
            System.out.println("ps.hasMoreElements()?" + ps.hasMoreElements());
//            url = Thread.currentThread().getContextClassLoader().getResource("/conf/db.properties");

        } catch (IOException e) {
            e.printStackTrace();
        }

        while(ps.hasMoreElements()) {
            InputStream in = null;
            try {
                in = ps.nextElement().openStream();
                Properties p = new Properties();
                p.load(in);
                System.out.println(p.getProperty("username"));
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                closeIO(in);
            }
        }
    }

    private static void closeIO(Closeable io) {
        if(io != null) {
            try {
                io.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

 

b.jar

public class TestAaa {

    public static void main(String[] args) {
        TestAaa.readDbProp();
        System.out.println("----");
        TestAaa.scanProps();
    }

    public static void readDbProp() {
        //返回读取指定资源的输入流
        InputStream is = TestAaa.class.getResourceAsStream("/conf/db.properties");
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String s = "";
        try {
            while ((s = br.readLine()) != null){
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void scanProps(){
        Enumeration<URL> ps = null;
        URL url = null;
        try {
            ps = Thread.currentThread().getContextClassLoader().getResources("conf/db.properties");
            System.out.println("ps.hasMoreElements()?" + ps.hasMoreElements());
//            url = Thread.currentThread().getContextClassLoader().getResource("/conf/db.properties");

        } catch (IOException e) {
            e.printStackTrace();
        }

        while(ps.hasMoreElements()) {
            InputStream in = null;
            try {
                in = ps.nextElement().openStream();
                Properties p = new Properties();
                p.load(in);
                System.out.println(p.getProperty("username"));
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                closeIO(in);
            }
        }
    }

    private static void closeIO(Closeable io) {
        if(io != null) {
            try {
                io.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

 

main.jar

public class TestMain {

    public static void main(String[] args) {
//        TestBbb.readDbProp();
        System.out.println("+++++++++++++++++++++");
        TestAaa.readDbProp();

//        TestBbb.scanProps();
        System.out.println("+++++++++++++++++++++");
        TestAaa.scanProps();
    }

}

 测试的时候注意调整jar包的顺序。

 

# 可以读取多个同名配置文件

    public static void scanProps(){
        Enumeration<URL> ps = null;
        URL url = null;
        try {
            ps = Thread.currentThread().getContextClassLoader().getResources("conf/db.properties");
            System.out.println("ps.hasMoreElements()?" + ps.hasMoreElements());
        } catch (IOException e) {
            e.printStackTrace();
        }

        while(ps.hasMoreElements()) {
            InputStream in = null;
            try {
                in = ps.nextElement().openStream();
                Properties p = new Properties();
                p.load(in);
                System.out.println(p.getProperty("username"));
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                closeIO(in);
            }
        }
    }

 

 

# 读取单个和多个文件的路径写法

Thread.currentThread().getContextClassLoader().getResources("conf/db.properties");

 

TestBbb.class.getResourceAsStream("/conf/db.properties");

 

P

a

a

e

e

r

 

 

 

分享到:
评论

相关推荐

    将多个jar包合并为一个jar包

    为了简化项目结构、减少资源占用以及方便管理,开发者有时会选择将多个JAR包合并成一个单一的JAR包。这个过程被称为JAR文件的合并。本文将详细讲解如何进行这项操作,并分享一个实用的合并工具。 首先,理解JAR文件...

    jar包大乱炖

    这里提到的“打开文件搜索”是一种实用的方法,通过工具或命令行,如`jar tf &lt;jar_file&gt;`,可以查看jar包内的内容,快速定位所需的类或资源。 在Java开发环境中,有多种方式管理jar包: 1. **MANIFEST.MF文件**:在...

    eclipse编译.class所需jar包

    首先,我们来看标题中的核心知识点——"eclipse编译.class所需jar包"。在Eclipse中,编译Java源码(.java文件)为字节码(.class文件)是IDE的基本功能。Eclipse自带了Java编译器JDT(Java Development Tools),它...

    里面有两个jar包

    JAR文件可以包含资源文件(如图片、配置文件等),并且支持压缩,从而减小文件大小。此外,JAR文件还可以用作Java应用程序的执行入口,通过在命令行上使用`java -jar`命令来运行。 **2. 覆盖到指定目录** 标签...

    Spring中使用classpath加载配置文件浅析

    - 如果同时存在目录和jar包,且没有使用classpath*前缀,Spring默认只会加载目录下的配置文件。 2. **使用通配符**:当路径中包含通配符(如`**/*`)时,Spring将尝试加载所有匹配的配置文件。例如: - 如果配置...

    Spring Boot打jar包后配置文件的外部优化配置方法

    然而,在打包成jar包后,应用程序的配置文件(如application.properties或application.yml)的管理与优化成为了一个问题。本文将详细介绍如何在Spring Boot打包成jar包之后,对配置文件进行外部优化配置的方法。 ...

    struts2配置文件加载顺序

    1. **struts-default.xml**:这是Struts2的核心配置文件,位于`struts2-core.jar`库的`/org/apache/struts2/defaults`包内。它包含了框架的基本设置,如拦截器栈、默认Action配置等。 2. **struts-plugin.xml**:这...

    net.sf.fjep.fatjar_0.0.23

    在实际使用中,"net.sf.fjep.fatjar_0.0.23"可能会遇到的一些常见问题包括:类加载顺序问题、资源文件覆盖、JAR内的类路径配置错误等。解决这些问题通常需要对Java类加载机制和JAR结构有深入理解。 总的来说,...

    搭建drools 6.2.0 workbench所需所有jar包

    3. **配置Tomcat**:确保Tomcat的`server.xml`文件已经配置了正确的Context路径,对应到你刚刚解压的Drools Workbench目录。如果未配置,你需要手动添加。例如,添加如下内容: ```xml ``` 其中,`path/to/...

    教你认识手机JAVA程序JAR和JAD文件.docx

    当.JAR文件和.JAD文件中存在同名但值不同的属性时,系统会优先采用.JAD文件中的属性。特别地,`MIDlet-1`属性虽然非必需,但在模拟器中运行MIDlet时是必要的。 在使用和调试过程中,需要注意以下几点: 1. `MIDlet-...

    myeclipse10.7.1导出war包时问题解决办法

    如果替换JAR文件后依然遇到问题,可能需要检查项目的构建路径设置、依赖库是否正确,或者MyEclipse的其他配置是否存在问题。 总的来说,当MyEclipse在导出WAR包时遇到问题,不要急于重新安装整个IDE,而是可以尝试...

    Maven设置使用自定义的jar包到自己本地仓库

    为了确保Maven能够正确识别自定义jar包,还需要创建一个同名的pom文件,并在其中声明正确的groupId、artifactId和version信息。 6. 引用自定义jar包:在Maven项目中引用自定义jar包的方法是在项目的pom.xml文件中...

    apktool脚本 apktool.jar

    这会将APK解包到一个同名的目录(`example`),包含解码的资源、XML文件以及DEX字节码。 4. **修改资源**:反编译后,你可以对源代码、资源文件或XML配置进行修改。例如,如果你想修改应用的图标,可以编辑`res/...

    安卓apk反编译文件

    在Android开发领域,APK是应用的安装包文件,它包含了所有必要的代码、资源和配置文件,以便在Android设备上运行。"安卓apk反编译"是一个常见的技术实践,主要目的是为了查看、修改或分析APK文件的内容。APK反编译...

    maven3.2.2 eclipse插件 离线包

    Maven是Java开发中的一款强大的构建工具,它通过配置文件POM(Project Object Model)来管理项目的依赖关系,简化了项目的构建、测试和部署过程。Eclipse是一款广泛使用的Java集成开发环境,而Maven的Eclipse插件则...

    Dubbo应用启动解析.doc

    2. **配置文件路径**:通过`CONF_DIR=$DEPLOY_DIR/conf`设置配置文件所在的目录。 3. **日志输出路径**:定义`LOGS_DIR`变量用于指定日志文件的存储路径,确保日志文件能够被正确记录。 4. **读取配置信息**: - ...

    mac 系统的 apk 反编译工具

    这将生成一个与APK同名的文件夹,其中包含反编译后的资源和配置文件。 3. **处理.dex文件**:在解压后的APK文件夹中,找到`classes.dex`文件。使用dex2jar将其转换为.jar文件: ``` java -jar ~/path/to/dex2jar...

    SpringBoot最新2021年面试题,高级面试题及附答案解析.md

    综上所述,SpringBoot的核心配置文件、更改端口的方法、启动时执行特定代码的策略、防范CSRF攻击的措施、配置文件之间的区别、SpringBoot的一些局限性、核心注解及其组成以及嵌入式服务器的概念和优势等方面,都是...

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

    - **问题**:如果类定义在一个包内,并且该包没有正确地在文件系统中创建,将会导致编译失败。 - **解决方法**:确保文件系统的目录结构与包声明匹配。例如,对于`package com.example.myapp;`,应在`classpath`中...

    反编译工具包

    APKTool 支持解析 APK 文件的资源文件,包括 XML 配置文件、图片、布局等,并将其转换回人类可读的形式。 **apktool.bat** 是 APKTool 的 Windows 版本的批处理文件,用户可以直接在命令行环境下运行。通过执行这个...

Global site tag (gtag.js) - Google Analytics