我有一个简单的java maven项目。执行时我的一个类需要从类路径加载xml配置文件。我不想在生成jar时打包这样的xml文件但是我想在conf子文件夹下的zip程序集中包含一个默认的xml文件,我也希望在单元测试中可以使用这个默认的xml来测试它。
我认为这个默认xml有两个可能的位置:
src/main/resources/conf/default.xml
src/main/conf/default.xml
这两种解决方案都需要特殊的pom行动:
在解决方案1中,我在构建期间获得了自动复制到目标文件夹,这意味着它可以在测试中使用,但我也可以在我不想要的生产的jar中获取它。
在解决方案2中,我得到了我想要的jar(没有xml),但我手动将xml复制到目标文件夹以供测试。 (我不想在测试类路径中添加src的子文件夹。我认为这是不好的做法。)
问题:两者的最佳解决方案是什么?
- 如果正确为2,那么将其复制到目标文件夹的最佳方法是什么?
- 还有其他解决办法比那两个更好,更常见吗?
(我也读过Where should I put application configuration files for a Maven project?但我想从“约定优于配置”的角度来了解最“正确的解决方案”,这个链接提供了一些配置类型解决方案,但没有任何面向约定。也许有不是一个,但我还是问。还提供的解决方案包括AntRun插件和appAssembler插件,我想知道我是否可以用它们来做。)
答案 0 :(得分:45)
问题是这两者的最佳解决方案是什么?如果正确为2,那么将其复制到目标文件夹的最佳方法是什么?还有其他解决办法比那两个更好,更常见吗?
由于您希望将该文件复制到target/classes
文件夹,因此它可以被视为资源(因此要么放在src/main/resources
下面,要么声明src/main/conf
作为资源目录)。如果您不想在最终的jar中使用它,请配置Maven JAR Plugin以排除它:
<project>
...
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<excludes>
<exclude>**/conf/*</exclude>
</excludes>
</configuration>
</plugin>
...
</plugins>
</build>
...
</project>
对于装配零件,装配描述符非常灵活,因此应该可以实现您想要的任何选择。我建议使用最简单的设置。
答案 1 :(得分:2)
我的解决方案是使用两个配置文件:开发(默认)和打包
我的默认/部分包含src / main / resources和src / main / conf。我称之为我的开发资料,这是一个隐含的资料。
我的包装资料是一个明确的资料,在章节下定义。 / /我只提到了src / main / resources。当我运行我的打包脚本时(我们现在将这个外部设置为maven,因为它构建了我们的WAR),我正在运行'mvn install -Drpm'来激活我的包装配置文件(rpm是包装的id个人资料。
如果不够清楚,请随时提出更多问题。
答案 2 :(得分:1)
您可以将其放在src / test / conf / default.xml中。您的测试类可以找到它,但不会使用标准方法打包。
使用附加组件,您可以从那里打包它。这一步始终是必要的。
另一种解决方案可能是创建一个单独的maven模块并将其放在/ src / main / resources / conf / ...中。然后使这个jar成为测试依赖项。您不需要执行任何特殊的插件配置,但我认为对于单个文件来说它是过度的。
答案 3 :(得分:0)
If your packaging is war, you can use the packagingExcudes configuration option of the maven-war-plugin:
<project>
...
<build>
<plugins>
...
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<!-- Exclude abc.properties found in src/main/resources/ (ends up getting packaged in WEB-INF/classes/) -->
<packagingExcludes>
WEB-INF/classes/abc.properties
</packagingExcludes>
</configuration>
</plugin>
...
</plugins>
</build>
...
</project>
Use commas to separate between multiple resources you want to exclude. Also, you can use wildcards and regex in your excluded paths. For regex, it's in the %regex[YOUR_REGEX_HERE]
syntax. Check the documentation for more details.