Maven多模块项目 - 将所有“包”JARS从子模块复制到父/目标/

时间:2011-11-28 07:44:34

标签: maven multi-module

我有一个包含很多子模块的maven项目。我正在寻找的是获取聚合POM的/ target /目录中包含的子模块生成的所有.jar文件的方法,以便以后可以方便地使用它们。

  • 他们不需要合并。最好不要,但如果他们必须那就没关系。
  • 不关心依赖性
  • 这主要是为了方便,此时

我正在做的基本版本:

Prj1/pom.xml  =>  prj1/target/proj1.jar  (and classes/generated-sources/etc)
Prj2/pom.xml  =>  prj2/target/proj2.jar
Main/pom.xml  =>
                  main/target/proj1.jar
                  main/target/proj2.jar
                  ... classes/generated-sources not needed at all,
                  ... but they could be combined here.  I assume they will be

我一直在阅读,并使用SO的一些建议。到目前为止,我还没有找到办法做到这一点,但我确信它就在那里。

修改

对于所有包含的子程序,我已经放弃了以简单的方式使用它。到目前为止,我得到的最佳答案是使用dependancy插件手动指定(再次)要包含的每个子模块。我们的想法是能够轻松地为数十个客户配置POM,只需包含必要的模块,然后将其神奇地粘贴在一个位置的所有子模块的罐子中。 Maven非常好,当你没有做太多时,但是当你尝试时,角括号税是不可思议的。

我仍然觉得奇怪的是,这些标准看似的任务(从SO上提出的问题判断,以及任何正常项目会做什么)都是如此困难。 maven3更好吗?

3 个答案:

答案 0 :(得分:27)

您可以尝试maven-dependency-plugin:copy插件:目标。

您必须将此项添加到要复制的所有子模块的pom中。 编辑:或者只是在父pom中(见评论)。

    <build>
        <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-dependency-plugin</artifactId>
              <executions>
                <execution>             
                  <id>copy-artifact</id>
                  <phase>package</phase>
                  <goals>
                    <goal>copy</goal>
                  </goals>
                  <configuration>
                    <artifactItems>
                        <artifactItem>
                          <groupId>${project.groupId}</groupId>
                          <artifactId>${project.artifactId}</artifactId>
                          <version>${project.version}</version>
                          <type>${project.packaging}</type>
                        </artifactItem>
                    </artifactItems>
                    <outputDirectory>../Main/target/dependencies</outputDirectory>
                  </configuration>
                </execution>
              </executions>
            </plugin>
        </plugins>
    </build>

如果你把它放在父pom中,请记住只有当你的整个项目是一个模块深度时它才会很好地工作。这意味着如果父模块下的模块具有自己的子模块,则它们不会在所需的文件夹中结束。您的文件夹结构如下所示:

- Parent
  - Module 1
    - Sub module 1
    **Main**
  - Module 2
  **Main**

要防止这种情况,请创建具有上述配置的专用模块,并手动指定要复制的每个模块。这样,所有模块,无论它们有多深,都会在一个文件夹中结束。

答案 1 :(得分:15)

我花了一整天时间试图解决这个问题......最后它确实有效,所以即使我的日程艰难,我也会在这里分享,如果我能在将来拯救某人的挫败感......

第1步。创建一个额外的Maven项目,该项目将是您要一起复制的所有项目的父项。我们称这个项目为parent

这个项目需要告诉Maven,哪些项目要一起构建。此外,您将在其他项目中声明其父级为parent,因此他们将看到您在此处定义的MyDir属性。

<groupId>com.your.domain</groupId>
<artifactId>parent</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<properties>
    <MyDir>/your/path/to/copy/to</MyDir>
</properties>
<modules>
    <module>../project1</module>
    <module>../project2</module>
    <module>../project2</module>
</modules>

第2步。对于要复制到同一位置的每个项目,请指定它的父项是parent项目(确保指定正确的groupId和artifactId以及父项目的版本):

<parent>
    <groupId>com.your.domain</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1</version>
    <relativePath>../parent</relativePath>
</parent>

此外,对于每个项目,还要指定jar和依赖项插件设置,如下所示:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
      <configuration>
        <outputDirectory>${MyDir}</outputDirectory>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.your.domain.Program</mainClass>
          </manifest>
        </archive>
     </configuration>
</plugin>
<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <phase>install</phase>
        <goals>
          <goal>copy-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${MyDir}/lib</outputDirectory>
        </configuration>
      </execution>
    </executions>
</plugin>

然后在父项目上运行mvn install。 BAM!

P.S。以上假设所有项目都位于同一目录(子项旁边的父项目),但您可以根据需要更改相对路径。

答案 2 :(得分:3)

实现此目的的一种方法是使用moduleSetmaven assembly plugin选项。

您可以像这样创建一个程序集描述符(链接中示例的变体),并在pom中的程序集插件声明中使用它。

<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>bin</id>
  <formats>
    <format>dir</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects> 
      <binaries>
        <outputDirectory>/</outputDirectory>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>