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

Par*_*ife 37 java maven-2 maven

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

在我看来,这个默认的xml有两个可能的位置:

  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插件,我想知道我是否可以完成它们.)

Pas*_*ent 50

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

由于您希望将该文件复制到该target/classes文件夹,因此它以某种方式被视为资源(因此要么放在下面,src/main/resources要么声明src/main/conf为资源目录).如果您不想在最终的jar中使用它,请配置Maven JAR插件以将其排除:

<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>
Run Code Online (Sandbox Code Playgroud)

对于装配零件,装配描述符非常灵活,因此应该可以实现您想要的任何选择.我建议使用最简单的设置.

  • 这两种解决方案都存在问题: 1./ 将 'conf' 声明为资源仍然包含在 jar 中,并且没有简单的排除方法;2./ 在资源内部创建'conf',并在插件中排除它会导致它不在类路径的根目录中。 (2认同)