【问题标题】:Maven: how to address config files in directory packaged inside a JARMaven:如何解决打包在 JAR 中的目录中的配置文件
【发布时间】:2014-12-04 11:51:32
【问题描述】:

我的 Java 项目被细分为单任务工件(由同事编写)和我自己开发的“收集器”工件,它们都使用 Maven 运行。

通常在我的 pom.xml 文件中是由几个依赖项组成的:

<dependencies>
        <dependency>
            <groupId>org.foo.project1</groupId>
            <artifactId>project1</artifactId> 
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.foo.project2</groupId>
            <artifactId>project2</artifactId> 
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.foo.project3</groupId>
            <artifactId>project3</artifactId> 
            <version>2.0.0</version>
        </dependency>
</dependencies>

因此,例如 project2 不仅在 src/ 目录中包含 .class 文件包,在 resources/ 目录中包含 .xml 和其他内容,而且例如 resources/ 包含一些其他用于各种目的的文本文件(例如预设)。

我想在我的“收集器”工件的代码中处理其中一个物理文件。 这是因为在我的代码的某个点,我想调用来自“project2”类路径的类的方法,因此物理上来自“project2”JAR;

但是,虽然类层次结构可以调用,但附件文件却不行。如果在我的 Java 代码中我将我想使用的文件名作为“resources/name.txt”,JVM 认为在我的“收集器”工件资源/目录中搜索文件,这是错误的——我真的希望它指向 [project2.jar]/resources/name.txt。

如何正确寻址打包在project2 jar里面的文件?

谢谢一百万!

【问题讨论】:

    标签: java maven jar


    【解决方案1】:

    如果你想读取一个你放在资源目录中的文本文件,你只需要记住 maven 把文件放在资源目录中并在 jar 中保持不变。所以你可以要求 classLoader 把它作为资源给你:

    InputStream is = getClass().getClassLoader().getResourceAsStream("/data/name.txt");
    

    将查找您最初放入 src/resources/data 的名为 name.txt 的文件

    【讨论】:

    • 它有效,谢谢!实际上,在 URL 格式中使用 .getResource() 对我来说更有用,但是您找到了解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多