代码之家  ›  专栏  ›  技术社区  ›  Paralife

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

  •  37
  • Paralife  · 技术社区  · 15 年前

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

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

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

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

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


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

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

    3 回复  |  直到 8 年前
        1
  •  55
  •   Pascal Thivent    15 年前

    问题是这两个问题的最佳解决方案是什么?如果正确值为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
  •  2
  •   Asaf Mesika    15 年前

    我的default/节包含src/main/resources和src/main/conf。

    我的打包配置文件是一个显式配置文件,在第节中定义。在/I下面只提到src/main/resources。当我运行我的打包脚本(自从maven在我们的战争中构建了一个RPM以来,我们现在在maven外部有这个脚本),我运行“mvn install-Drpm”来激活我的打包配置文件(RPM是打包配置文件的id)。

    如果这还不够清楚,可以问更多的问题。

        3
  •  1
  •   Peter Tillemans    15 年前

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

    有了一个附加组件,你就可以从那里打包了。这一步总是必要的。

    另一种解决方案是创建一个单独的maven模块并将其放在/src/main/resources/conf/。然后使这个jar成为一个测试依赖项。你不需要做任何特殊的插件配置,但我认为它是一个单一的文件杀伤力。

        4
  •  0
  •   Voicu    6 年前

    如果你的包装 战争 ,您可以使用 packagingExcudes 的配置选项 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>
    

    使用逗号分隔要排除的多个资源。此外,可以在排除的路径中使用通配符和regex。对于正则表达式,它在 %regex[YOUR_REGEX_HERE] documentation 更多细节。