我应该如何在maven项目中选择配置文件的位置
-
09-12-2019 - |
题
我正在构建一个命令行工具,它依赖于一些配置文件。
在开发上,我把这些文件放在 src/main/resources
, ,并由 getClass().getResourceAsStream("/config-file-name")
, ,效果很好。
我选择maven-assembly-plugin来构建具有所有依赖项的jar。
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.myproject.Scheduler</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
配置文件都包装在jar中,但我想将它们分开。
所以,我添加以下配置,
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>conf.properties</include>
</includes>
<filtering>true</filtering>
<excludes>
<exclude></exclude>
</excludes>
<targetPath>..</targetPath>
</resource>
</resources>
完成此操作后,配置文件与jar一起,而不是包装在jar中。
但是我的代码现在无法访问文件。
我是否需要更改在代码中访问文件的方式?
或者我应该不需要将这些文件放入 src/main/resources/
, ,还有别的选择吗?
如果有人知道,请帮忙。
谢谢.
更新资料:最后,我放弃使用maven资源文件,相反,我默认将文件路径设置为与jar相同的路径,除了Eclipse抱怨之外,一切正常。
由于我想将配置文件移出jar,并且不希望它位于target/classes文件夹中,因此我使用 <targetPath>..</targetPath>
将配置文件移动到与jar文件相同的目录。
当我重新生成eclipse项目设置时,Eclipse说:无法在输出文件夹"project/target"内嵌套输出文件夹"project/target/test-classes"。
有人帮我吗?
解决方案 3
我终于放弃使用maven资源文件,默认情况下将文件路径设置为与jar相同的路径,除了Eclipse抱怨之外,一切都很好。
(因为我想将配置文件移出jar,并且不希望它在target/classes文件夹中,所以我使用。.将配置文件移动到与jar文件相同的目录。当我重新生成eclipse项目设置时,Eclipse说:无法在输出文件夹"project/target"内嵌套输出文件夹"project/target/test-classes"。)
直到现在我还没有找到解决方案,似乎是一个eclipse错误。
现在,我放弃了Eclipse,改为IntelliJ IDEA,这是一个相当不错的IDE,特别是与Maven完美集成。我会避免任何将eclipse用于任何maven项目的机会。
其他提示
您的应用程序无法访问配置文件,因为它不再位于其类路径中。
如果您想将配置文件与应用程序的其余部分分开,您可能需要重新查看您的 装配格式.您可能希望使用bin而不是jar-with-dependencies,尽管它在分发和使用方面存在挑战。
根据属性文件的复杂程度,您可以使用资源插件过滤器功能根据maven配置文件更改值。例如,如果你想拥有一个名为location的属性,你可以定义一个开发和生产配置文件,然后在pom(或配置文件)中将值设置为maven属性。xml如果你在maven2):
<properties>
<my.location>the_real_value</my.location>
</properties>
然后在属性文件中你会这样做:
location=${my.location}
只要确保你在pom中设置了过滤,就像这样:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
构建时,如果您查看目标目录并查看该属性文件,则应该看到替换的正确值。