在 maven 项目的路径中,我应该将不被视为资源的配置文件放在何处

2022-09-01 03:47:20

我有一个简单的java maven项目。执行时,我的一个类需要从类路径加载 xml 配置文件。我不想在生成jar时打包这样的xml文件,但我想在conf子文件夹下的zip程序集中包含一个默认的xml文件,并且我还希望这个默认的xml在单元测试中可用来测试它。

正如我所看到的,这个默认的xml有2个可能的位置:

  1. src/main/resources/conf/default.xml
  2. src/main/conf/default.xml

这两种解决方案都需要特殊的 pom 操作:

  • 在解决方案1中,我在构建期间自动复制到目标文件夹,这意味着它可以在测试中使用,但我也在我不想要的生成的jar中获取它。

  • 在解决方案2中,我得到了我想要的jar(没有xml),但我手动将xml复制到目标文件夹才能用于测试。(我不想在测试类路径中添加src的子文件夹。我认为这是不好的做法)。

问题:两者的最佳解决方案是什么?
- 如果正确的是2,那么将其复制到目标文件夹的最佳方法是什么?
- 还有没有其他解决方案比这两种更好,更常见?

(我还阅读了Maven项目的应用程序配置文件应该放在哪里?但我想从“约定胜过配置”的角度了解最“正确的解决方案”,此链接提供了一些配置类型的解决方案,但没有任何面向约定的解决方案。也许没有,但我还是问。此外,提供的解决方案包括AntRun插件和appAssembler插件,我想知道我是否可以用它们来做到这一点。


答案 1

问题是两者中最好的解决方案是什么?如果正确的是2,那么将其复制到目标文件夹的最佳方法是什么?还有没有其他解决方案比这两种解决方案更好,更常见?

由于您希望将该文件复制到该文件夹,因此可以以某种方式将其视为资源(因此,要么放在下面,要么声明为资源目录)。如果您不希望它出现在最终 jar 中,请将 Maven JAR 插件配置为将其排除:target/classessrc/main/resourcessrc/main/conf

<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>

对于组件零件,组件描述符非常灵活,因此无论选择哪种方式,都应该可以实现所需的目标。我建议使用最简单的设置。


答案 2

我的解决方案是使用两个配置文件:开发(默认)和打包

我的默认/部分包含src/main/resources和src/main/conf。我称之为我的开发配置文件,这是一个隐式配置文件。

我的打包配置文件是在 section 下定义的显式配置文件。在/我只提到了src/main/resources。当我运行打包脚本时(我们目前有这个外部脚本,因为它从我们的WAR中构建了一个RPM),我正在运行“mvn install -Drpm”来激活我的打包配置文件(rpm是打包配置文件的ID。

如果这还不够清楚,请随时提出更多问题。


推荐