在maven中聚合父pom的所有来源

时间:2018-03-16 14:52:55

标签: java maven

客户的部分可交付成果包括我们正在处理的项目的源代码。我和mvn generate-sources使用了maven。问题是它包含所有依赖项并聚合每个依赖项的源。我尝试使用.java上的groupid文件生成平面结构。

文档对maven-source-plugin非常回避。我所做的所有搜索最终都指向过滤资源,这不是我正在寻找的。

我的项目结构是一个有孩子的父母pom,我试图达到这样的目的:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.0.1</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <goals>
                <goal>jar</goal>
            </goals>
        </execution>
    </executions>
    <resouces>
            <filter>
                    <include>com.mygroupid.project</include>
            </filter>
    </resouces>
</plugin>

我期待的是:

  • A&#39; fat&#39;结构(所有项目源由一个目录中的包名聚合)
  • 没有重复的来源
  • 我的源组ID之外没有代码

修改

假设这样的结构:

- module-1 pom.xml  // aggregate project
    |- module-1-core (has dependency to module-2 and module-2)
    |- module-1-war
- module-2 pom.xml  // aggregate project
    |- module-2-commons
- module-3 pom.xml  // aggregate project
    |- module-3-services
- // etc...

我希望存档如下:

- big-fat-code-sources.zip
    |- module-1-core sources + test source
    |- module-1-war sources + test source
    |- module-2-commons sources + test source
    |- module-3-services sources + test source
    |- // etc...

2 个答案:

答案 0 :(得分:1)

使用source:aggregate目标应解决此任务:

mvn clean source:aggregate

假设您拥有以下项目结构

- root pom.xml  // aggregate project
  |- module1 // jar module
  |- module2 // another jar...

只需在root pom中进行以下配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-source-plugin</artifactId>
  <version>3.0.1</version>
</plugin>

并执行上述命令,它将在.jar文件夹中生成target,该文件夹将包含modules混合在一起的所有。< / p>

More doc了解Maven的目标。

答案 1 :(得分:0)

我最终解决了maven-assembly-plugin的问题以及许多不明显的额外配置。

在我的assembly.xml描述符中,我在项目的模块中添加了一个过滤器:

<moduleSets> // 1
    <moduleSet>
        <includes>
            <include>mrkrabs-secret-recipe:*</include>
        </includes>
        <useAllReactorProjects>true</useAllReactorProjects>
        <sources>
            <outputDirectoryMapping>${artifactId}-${version}</outputDirectoryMapping> // 2
            <includeModuleDirectory>true</includeModuleDirectory>
            <fileSets>
                <fileSet> // 3
                    <directory>src</directory>
                    <excludes>
                        <exclude>**/target/**</exclude>
                        <exclude>**/bin/**</exclude>
                    </excludes>
                </fileSet>
            </fileSets>
        </sources>
    </moduleSet>
</moduleSets>
  1. 包含maven项目中的所有模块
  2. 将每个模块映射到具有工件ID和版本
  3. 的目录
  4. 强制过滤以仅保留来源
  5. 这还没有包含传递依赖项及其源代码。

    所以我在依赖项上添加了一个过滤器:

    <dependencySets> // 1
        <dependencySet>
            <includes> // 2
                <include>mrkrabs-secret-recipe:*</include>
            </includes>
            <scope>provided</scope>
            <outputDirectory>/dependencies</outputDirectory> // 3
            <useTransitiveFiltering>true</useTransitiveFiltering> // 4
            <unpack>true</unpack>
            <unpackOptions> // 5
                <includes>
                    <include>mrkrabs-*/**</include>
                </includes>
                <excludes>
                    <exclude>*.sql</exclude>
                    <exclude>*.zip</exclude>
                    <exclude>*.class</exclude>
                    <exclude>*.jar</exclude>
                </excludes>
                <useDefaultExcludes>true</useDefaultExcludes>
            </unpackOptions>
        </dependencySet>
    </dependencySets>
    
    1. 包含maven项目的所有依赖项
    2. 过滤以仅包含来自mrkrabs项目的工件
    3. 将所有依赖项放在/ dependencies文件夹中
    4. 强制将过滤应用于传递依赖项
    5. 解压传递依赖项时应用额外的过滤:

      1. 仅包含mrkrabs项目(useTransitiveFiltering应该处理此事但不会)
      2. 排除我们不想在档案中看到的某些文件(.sql,.zip,.class,.jar)