【问题标题】:Maven : add external resourcesMaven:添加外部资源
【发布时间】:2014-12-27 15:05:35
【问题描述】:

我正在使用 maven 构建一个可执行的 jar 文件,这意味着您使用“java -jar file.jar”运行它。

我想依赖用户定义的属性(只是一个包含键/值的文件),在开发阶段我将“user.properties”文件放在 maven /src/main/resources/ 文件夹中。

我的属性文件已加载:

final Properties p = new Properties();
final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties");
p.load(resource);

现在,我想将该文件保存在 JAR 之外并拥有类似这样的内容:

- execution_folder
   |_ file.jar
   |_ config
      |_ user.properties

我用 maven-jar-plugin、maven-surefire-plugin 和 maven-resources-plugin 等 maven 插件尝试了很多东西,但我无法让它工作...

提前感谢您的帮助!

【问题讨论】:

  • user.properties 是否只是您保存在 jar 旁边并希望在运行时读取的单独文本文件?因为如果是这样......你可能应该像对待任何其他外部文件一样对待它
  • 是的,它只是一个单独的文件,但问题是 1-我不知道用户将把 jar 和配置文件放在哪里 2-我有依赖项使用的其他资源文件(数据库连接等)
  • 如果您喜欢外部的属性文件,您需要将类路径设置为指向您的executon_folder/config/ 文件夹,否则您将无法访问您的user.properties。所以一个简单的java -jar file.jar 是行不通的。
  • @khmarbaise 确实,我尝试了很多东西,当我将“config/”添加到我的清单的类路径时,它实际上可以按我的意愿工作。我尝试使用 maven surefire 插件(带有附加的ClasspathElements 标签)添加它,但它不起作用。你知道如何让它由 maven 自动添加吗? (显然,这是 m2e 限制:yet another maven question

标签: java maven jar maven-resources-plugin maven-jar-plugin


【解决方案1】:

我只使用 maven 配置找到了我需要的东西。

首先我将配置文件夹添加到类路径:

<build>
<plugins>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.1</version>
    <configuration>
        <archive>
            <manifestEntries>
                <Class-Path>config/</Class-Path>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>
</plugins>
</build>

我加载资源的方式和以前一样:

final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties");
p.load(resource);

如果您想将示例资源文件保留在您的存储库中并将它们从您的构建中删除:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>user.properties</exclude>
                <exclude>conf/hibernate.cfg.xml</exclude>
            </excludes>
        </resource>
    </resources>
</build>

在 jar 文件旁边,我添加了一个配置文件夹,其中包含我需要的所有资源文件。

结果是:

  • user.properties 可以使用 getResourceAsStream 加载
  • 其他依赖特定资源的库(我不会争辩,但我觉得它...不太好)可以毫无问题地加载它们的资源。

感谢您的帮助,我希望有一天它可以帮助到某人!

【讨论】:

  • 我也想做同样的事情,但首先我需要获取 jar 文件旁边的 configs 目录。如何做到这一点?
  • 我不太明白你的问题......在我的场景中,配置文件没有存储在 jar 文件中(不包括在 pom.xml 文件中)。配置文件的创建和复制必须在部署端进行管理
  • 是的。我想要一种无需手动复制或粘贴即可在 jar 之外获取配置文件夹的方法。你是怎么处理的?
  • 如果您想将资源与 jar 文件分开,则处理此问题的一种方法是使用部署自动化工具(例如 ansible)。您还可以部署过滤的资源 jar 并将其提取到您的服务器上(但同样,您可以手动或通过自动化完成)
【解决方案2】:

正如我在评论中提到的 - 您似乎只想将 user.properties 文件用作位于您的 jar 之外的文本文件。如果是这种情况,那么使用它就相当简单了——在运行时检查时,包含您的 jar 文件的目录就是当前目录。这意味着您只需要:

properties.load(new FileInputStream("config/user.properties"));

无需尝试放入项目类路径。

如果还有其他事情要做,只需将您的属性从资源目录复制到目标,以避免手动操作的麻烦。这可以通过 maven-antrun-plugin 实现:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <tasks>
                            <mkdir dir="${project.build.directory}" />
                            <copy file="${basedir}/src/main/resources/user.properties" tofile="${project.build.directory}/config/user.properties" />
                        </tasks>
                    </configuration>
                </execution>
            </executions>
        </plugin>

【讨论】:

  • 我了解您的解决方案,我可以将它用于我的一些文件,但在我的资源中,我也有一个“hibernate.cfg.xml”和我使用的库使用的其他一些文件称呼。而且这个库只是寻找资源文件(通过调用getResourceAsStream
  • 嘿@Deltharis 我在pom.xml 中添加了相同的插件现在它将myfolder 的内容复制到目标文件夹但是当我run mvn package 命令它没有正确显示在jar 中它显示myfolder/maven 而不是myfolder/abc.jpg 任何想法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2014-02-07
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多