【问题标题】:Where in maven project's path should I put configuration files that are not considered resources我应该将不被视为资源的配置文件放在 maven 项目的路径中的哪个位置
【发布时间】:2011-03-01 09:52:24
【问题描述】:

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

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

【问题讨论】:

    标签: java maven maven-2


    【解决方案1】:

    问题是两者的最佳解决方案是什么?如果正确为 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./将'conf'声明为资源仍然包含在jar中,并且没有简单的排除方法; 2./在资源中创建'conf',并在插件中排除它会导致它不在类路径的根目录下。
    • 出于某种原因,这是在谷歌搜索时“如何从 maven jar 中排除某些东西”的少数有用答案之一......即使它没有准确回答 OP,它仍然是一个很棒的答案使用maven-jar-plugin 的示例
    【解决方案2】:

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

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

    我的包装配置文件是在部分中定义的明确配置文件。在/下我只提到了src/main/resources。当我运行我的打包脚本时(由于它从我们的 WAR 构建 RPM,我们目前在 maven 外部使用它),我正在运行“mvn install -Drpm”来激活我的打包配置文件(rpm 是打包的 id个人资料。

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

    【讨论】:

    • 这正是我正在寻找的。我的打包阶段从src/main/resources 复制配置,然后在编译的JAR 中排除这个目录。但是在开发过程中,我仍然需要我的/src/main/resources 以便我可以在本地运行......这是我一直在研究的一个难题,我认为这就是我的答案。它很旧,但仍然非常重要!
    【解决方案3】:

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

    使用额外的程序集,您可以从那里打包它。这一步总是必要的。

    另一种解决方案可能是创建一个单独的 maven 模块并将其放在 /src/main/resources/conf/... 中。然后将此 jar 设置为测试依赖项。您不需要做任何特殊的插件配置,但我认为这对于单个文件来说是多余的。

    【讨论】:

    • 我不喜欢这个解决方案的一点是,生成 zip 的程序集需要从 src/test/conf 获取它,而且这个 xml 不仅仅是一个测试文件。如果我将它放在 src/main/conf 中,我假设您提出的解决方案是相同的?从那里也可以看到来自目标/类文件夹而不是目标/测试类的测试。进行从目标/类获取数据的测试是错误的,还是应该只依赖于目标/测试类?
    【解决方案4】:

    如果你的包装是war,可以使用maven-war-pluginpackagingExcudes配置选项:

    <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了解更多详情。

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2019-11-28
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多