Java maven项目中的何处';s路径是否应放置不被视为资源的配置文件

Java maven项目中的何处';s路径是否应放置不被视为资源的配置文件,java,maven,maven-2,Java,Maven,Maven 2,我有一个简单的JavaMaven项目。我的一个类在执行时需要从类路径加载xml配置文件。我不想在生成jar时打包这样的xml文件,但我想在conf子文件夹下的zip程序集中包含一个默认xml文件,并且我还想在单元测试中使用这个默认xml来测试它 在我看来,此默认xml有两个可能的位置: src/main/resources/conf/default.xml src/main/conf/default.xml 两种解决方案都需要特殊的pom行动: 在解决方案1中,我在构建过程中自动复制到目标文件

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

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

  • src/main/resources/conf/default.xml
  • src/main/conf/default.xml
  • 两种解决方案都需要特殊的pom行动:

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

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

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


    (我也读过,但我想知道“约定优于配置”中最“正确的解决方案”从观点来看,此链接提供了一些配置类型的解决方案,但没有任何面向约定的解决方案。也许没有,但我还是要问。此外,提供的解决方案包括AntRun插件和appAssembler插件,我想知道我是否可以不使用它们来实现。)

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

    通过一个额外的组件,您可以从那里打包它。这一步总是必要的

    另一种解决方案是创建一个单独的maven模块并将其放置在/src/main/resources/conf/。然后使这个jar成为一个测试依赖项。您不需要进行任何特殊的插件配置,但我认为对于一个文件来说,这样做太过分了

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

    由于您希望将该文件复制到
    target/classes
    文件夹,因此必须以某种方式将其视为一个资源(因此可以将其放在
    src/main/resources
    下,或者将
    src/main/conf
    声明为资源目录)。如果您不希望它出现在最终的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>
    
    
    ...
    ...
    org.apache.maven.plugins
    maven jar插件
    2.3.1
    **/形态/*
    ...
    ...
    

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

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

    我的默认/section包含src/main/resources和src/main/conf。我称之为我的开发概要文件,它是一个隐式概要文件

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


    如果这还不够清楚,请随时提问。

    如果您的包装是war,您可以使用以下配置选项:

    
    ...
    ...
    
    更多细节。

    我不喜欢这个解决方案的一点是,生成zip的程序集需要从src/test/conf获取它,而这个xml不仅仅是一个测试文件。如果我把它放在src/main/conf中,我假设你提出的解决方案是一样的。从那里,测试也可以从target/classes文件夹而不是target/t中看到它est类。从目标/类获取数据的测试是错误的,还是它们应该只依赖于目标/测试类?这两种解决方案都存在问题:1./将“conf”声明为资源仍然将其包含在jar中,并让我们无法轻松排除;2./在资源中创建“conf”,并将其排除在插件中导致它不存在出于某种原因,这是“如何从maven jar中排除某些内容”的几个有用答案之一当谷歌搜索时……即使它没有准确地回答OP,它仍然是使用
    maven jar插件的一个很好的例子,这正是我要寻找的。我的打包阶段从
    src/main/resources
    复制配置,然后在编译的jar中排除该目录。但是在开发过程中,我仍然需要
    /src/main/resourcerces
    这样我就可以在本地运行了……这是一个难题,我已经陷入其中一段时间了,我想这就是我的答案。它很古老,但仍然非常相关!
    <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>