34

我有一个包含很多子模块的 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 的一些建议。到目前为止,我还没有找到一种方法来做到这一点,但我确信它就在那里。

编辑:

对于所有包含的子项目,我已经放弃了让它以简单的方式工作。到目前为止,我最好的答案是使用依赖插件手动指定(再次)要包含的每个子模块。其想法是能够轻松地为数十个客户端配置 POM,只需包含必要的模块,然后让它神奇地将所有子模块的 jar 粘贴到一个位置。Maven 非常好,当你不怎么用它的时候,但是当你尝试的时候尖括号税是不可思议的。

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

4

3 回答 3

30

你可以试试maven-dependency-plugin:copy plugin:goal。

您必须将此添加到要复制的所有子模块的 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**

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

于 2011-11-28T08:30:37.773 回答
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在父项目上运行。砰!

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

于 2013-03-21T15:30:23.313 回答
3

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

您可以像这样创建一个程序集描述符(链接中示例的变体)并在 pom.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>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>
于 2011-11-28T08:54:52.667 回答