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

问题描述 投票:37回答:4

我有一个简单的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,将其复制到目标文件夹的最佳方法是什么? - 有没有比这两个更好,更常见的其他解决方案?

(我也读过Where should I put application configuration files for a Maven project?,但我想从“约定优于配置”的角度来了解最“正确的解决方案”,这个链接提供了一些配置类型解决方案,但没有任何面向约定。也许没有一个,但我问无论如何。所提供的解决方案还包括AntRun插件和appAssembler插件,我想知道我是否可以完成它们。)

java maven maven-2
4个回答
46
投票

问题是这两者的最佳解决方案是什么?如果正确为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>

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


2
投票

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

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

我的包装资料是一个明确的资料,在章节下定义。 / /我只提到了src / main / resources。当我运行我的打包脚本时(我们现在将这个外部设置为maven,因为它构建了我们的WAR之外的RPM),我正在运行'mvn install -Drpm'来激活我的打包配置文件(rpm是打包的id轮廓。

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


1
投票

您可以将它放在src / test / conf / default.xml中。您的测试类可以找到它,但不会使用标准方法打包。

通过附加组件,您可以从那里打包它。这一步始终是必要的。

一个不同的解决方案可能是创建一个单独的maven模块并将其放在/ src / main / resources / conf / ...中。然后使这个jar成为测试依赖。您不需要执行任何特殊的插件配置,但我认为对于单个文件来说它是过度的。


0
投票

如果您的包装是战争,您可以使用packagingExcudesmaven-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>

使用逗号分隔要排除的多个资源。此外,您可以在排除的路径中使用通配符和正则表达式。对于正则表达式,它是在%regex[YOUR_REGEX_HERE]语法中。查看documentation了解更多详情。

© www.soinside.com 2019 - 2024. All rights reserved.