Maven: 添加外部资源

12

我正在使用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插件的方法,比如maven-jar-plugin、maven-surefire-plugin和maven-resources-plugin,但是我无法让它正常工作...

提前感谢你的帮助!


用户属性文件(user.properties)只是一个你在JAR包旁边保存并希望在运行时读取的单独文本文件吗?如果是这样的话...你应该将其视为任何其他外部文件一样来处理。 - Deltharis
是的,它只是一个单独的文件,但问题在于: 1- 我不知道用户会把jar和配置文件放在哪里 2- 我有其他被依赖项使用的资源文件(如数据库连接和其他文件) - GournaySylvain
如果您想将属性文件放在外部,您需要设置类路径(classpath)指向您的executon_folder/config/文件夹,否则您将无法访问您的user.properties。因此,简单的java -jar file.jar将无法工作。 - khmarbaise
@khmarbaise,我尝试了很多方法,当我将“config/”添加到我的MANIFEST的类路径中时,它实际上按照我想要的方式工作。我尝试使用maven surefire插件(使用additionalClasspathElements标签)添加它,但是它没有起作用。您知道如何让maven自动添加它吗?(显然,这是m2e的限制:又一个maven问题 - GournaySylvain
2个回答

16

我只使用了Maven配置就找到了需要的内容。

首先,我将config文件夹添加到类路径中:

<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文件旁边,我添加了一个配置文件夹来保存所有需要的资源文件。

结果是:

  • 可以使用getResourceAsStream加载user.properties文件
  • 其他依赖于特定资源的库(我不想争论,但我发现这并不好)可以无问题地加载它们的资源。

感谢您的帮助,希望有一天能帮到别人!


我想做同样的事情,但首先我需要在jar文件旁边获取configs目录。如何实现? - S.Dan
我不是很理解你在这里的问题......在我的情境中,配置文件没有存储在jar文件内(在pom.xml文件中排除)。配置文件的创建和复制必须在部署端进行管理。 - GournaySylvain
是的,我想要一种获取配置文件夹的方法,而不需要手动复制或粘贴jar包。你是如何处理的? - S.Dan
一种处理这个问题的方法是使用部署自动化工具(例如ansible),如果您想将资源与jar文件分开。您还可以部署一个经过筛选的资源jar文件,并在服务器上提取它(但同样,您可以手动或通过自动化完成)。 - GournaySylvain

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 函数)。 - GournaySylvain
嘿@Deltharis,我已经在pom.xml中添加了同样的插件,现在它会将myfolder文件夹中的内容原封不动地复制到目标文件夹中,但是当我运行mvn package命令时,它并没有正确地显示在jar包内,而是显示为myfolder/maven而不是myfolder/abc.jpg。你有什么想法吗? - Naveen Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接