在多模块maven项目中指定公共资源

时间:2013-07-05 15:44:39

标签: java maven maven-2 maven-3 multi-module

有没有办法在Maven中的父项目模块之间共享资源?例如,我想为多模块Maven项目中的所有模块指定一个log4j.properties文件。

通常,我使用Eclipse IDE通过选择一般项目来创建父项目,然后通过指定pom的打包将其转换为Maven项目。这将创建一个没有src等文件夹的“干净”项目结构。我想知道在这种情况下应该把这样的共享资源放在哪里。

EDIT1 :我想将公共资源放在父项目中。

6 个答案:

答案 0 :(得分:26)

我创建了一个额外的“基础”模块(项目),打包“jar”,其中包含src/main/resources中的公共资源。然后我会让其他模块依赖于该项目。现在他们看到了类路径上的公共资源。

答案 1 :(得分:4)

Antoher的可能性是使用远程资源包。您可以在父项目中配置它。在这个例子中,我想复制一些文件只是为了测试。如果使用此功能,则需要在另一个项目中创建捆绑包。

    <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>                 

答案 2 :(得分:1)

  

是的,这似乎是一种可能的解决方案。但我对此感兴趣   可以在父项目中指定这些资源(没有   引入附加模块)因为父项目指定了所有   孩子的常见依赖关系和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>

答案 3 :(得分:1)

另一种方法是,在项目根目录中放入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>

Assembly插件将生成工件,并将其附加到当前的Reactor,以便将其安装和部署。

否,您不能在同一pom中将其用作标准依赖项事件。

重要的是在另一个将使用生成的工件的插件之前触发组装(正确的阶段)。

例如。您可以在root 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://github.com/s4u/pgp-keys-map resources目录由所有模块共享。

答案 4 :(得分:0)

我设法让它像这样工作:

我创建了一个project / assembly / test / resources / META-INF / persistence.xml文件,并将其添加到我的pom.xml中:

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

答案 5 :(得分:0)

我认为您可以将resource和/或testResources元素添加到pom中。 例如。要访问其他测试资源目录,请添加:

    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
        </testResource>
        <testResource>
            <directory>../global/src/test/resources</directory>
        </testResource>
    </testResources>

请参阅Maven - Override test resource folder