有没有办法在 Maven 中的父项目的模块之间共享资源?例如,我想为多模块 Maven 项目中的所有模块指定一个 log4j.properties 文件。
一般情况下,我使用Eclipse IDE创建父项目,选择通用项目,然后通过指定pom
. 这将创建一个没有src
等文件夹的“干净”项目结构。我想知道在这种情况下应该将这样的共享资源放在哪里。
EDIT1:我想把公共资源放在父项目中。
有没有办法在 Maven 中的父项目的模块之间共享资源?例如,我想为多模块 Maven 项目中的所有模块指定一个 log4j.properties 文件。
一般情况下,我使用Eclipse IDE创建父项目,选择通用项目,然后通过指定pom
. 这将创建一个没有src
等文件夹的“干净”项目结构。我想知道在这种情况下应该将这样的共享资源放在哪里。
EDIT1:我想把公共资源放在父项目中。
我将创建一个额外的“基础”模块(项目),打包“jar”,其中包含src/main/resources
. 然后我会让其他模块依赖于那个项目。现在他们看到了类路径上的公共资源。
另一种可能性是使用远程资源包。您将能够在父项目中对其进行配置。在这个例子中,我想复制一些文件只是为了测试。如果您使用它,您将需要在另一个项目中创建捆绑包。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-remote-resources-plugin</artifactId>
<version>1.5</version>
<configuration>
<resourceBundles>
<resourceBundle>es.sca:myBundle:1.0.0</resourceBundle>
</resourceBundles>
<attachToMain>false</attachToMain>
<attachToTest>true</attachToTest>
<appendedResourcesDirectory>${basedir}/src/test/resources</appendedResourcesDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
</execution>
</executions>
</plugin>
另一种方式,放入你的项目根 pom:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<!-- don't propagate to child poms -->
<!-- this will only execute in root pom -->
<inherited>false</inherited>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
<!-- don't add classifier -->
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugins>
以及 assembly.xml 的示例
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>resources</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/resources/</directory>
<outputDirectory/>
<useDefaultExcludes>true</useDefaultExcludes>
<includes>
<include>**</include>
</includes>
</fileSet>
</fileSets>
</assembly>
组装插件将生成工件并将其附加到当前反应器,因此它将被安装和部署。
不,您可以在同一个 pom.xml 中将其用作标准依赖事件。
重要的是在另一个将使用生成的工件的插件之前触发组装(适当的阶段)。
例如。你可以在你的根 pom 中,下面的配置将传播到你的所有模块:
<plugin>
<artifactId>some-maven-plugin</artifactId>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>goal</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>your.project.groupid</groupId>
<artifactI>your.project.artifactId</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</plugin>
您可以在项目中看到此方法:
https resources
://github.com/s4u/pgp-keys-map目录由所有模块共享。
是的,这似乎是一个可能的解决方案。但是我很感兴趣是否可以在父项目中指定这些资源(不引入额外的模块),因为父项目为子模块指定了所有常见的依赖项和Maven配置,我认为父项目是最合适的地方也用于公共资源。
如果是打包类型pom,当指定目标包来管理您的共享资源时,只需将下一个(检查文件夹)添加到pom 文件的构建部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-config-files</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/logconfig</outputDirectory>
<resources>
<resource>
<filtering>false</filtering>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
我认为您可以将资源和/或 testResources 元素添加到您的 pom.xml 中。例如访问一个额外的测试资源目录添加:
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
<testResource>
<directory>../global/src/test/resources</directory>
</testResource>
</testResources>
我设法让它像这样工作:
我创建了一个 project/assembly/test/resources/META-INF/persistence.xml 文件,并将其添加到我的 pom.xml 中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-test-persistence-xml-resources</id>
<phase>process-test-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>src/</outputDirectory>
<resources>
<resource>
<directory>${project.parent.basedir}/assembly/</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>