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