如何使用Maven组件插件与多模块maven项目

时间:2022-11-30 22:48:30

I am new to maven and spent ~3 days in generating the zip file with assembly plugin refering to http://www.petrikainulainen.net/programming/tips-and-tricks/creating-a-runnable-binary-distribution-with-maven-assembly-plugin/ My project is multi module, so I also referred to Managing multi-module dependencies with Maven assembly plugin

我是maven的新手,花了大约3天时间使用程序集插件生成zip文件,参考http://www.petrikainulainen.net/programming/tips-and-tricks/creating-a-runnable-binary-distribution-with- maven-assembly-plugin /我的项目是多模块的,所以我也提到使用Maven程序集插件管理多模块依赖项

Still I have several inefficiencies. Below is assembly.xml (which I inherited from 1st link)

我还有几个效率低下的问题。下面是assembly.xml(我从第一个链接继承)

 <assembly>
<id>bin</id>
<!-- Generates a zip package containing the needed files -->
<formats>
    <format>zip</format>
</formats>

<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
    <dependencySet>
        <!-- Project artifact is not copied under library directory since it is 
            added to the root directory of the zip package. -->
        <useProjectArtifact>false</useProjectArtifact>
        <outputDirectory>lib</outputDirectory>
        <unpack>false</unpack>

    </dependencySet>
</dependencySets>
<moduleSets>
    <moduleSet>

        <!-- Enable access to all projects in the current multimodule build! <useAllReactorProjects>true</useAllReactorProjects> -->

        <!-- Now, select which projects to include in this module-set. -->
        <includes>
            <include>com.XX:YY-main</include>
        </includes>

        <!--<binaries> <outputDirectory>YY-main/target</outputDirectory> <unpack>false</unpack> 
            </binaries> -->
    </moduleSet>
</moduleSets>
<fileSets>
    <!-- Adds startup scripts to the root directory of zip package. The startup 
        scripts are located to src/main/scripts directory as stated by Maven conventions. -->
    <fileSet>
        <directory>${project.build.scriptSourceDirectory}</directory>
        <outputDirectory>conf</outputDirectory>
        <includes>
            <include>*</include>
        </includes>
    </fileSet>
    <fileSet>
        <directory>${project.build.directory}</directory>
        <outputDirectory></outputDirectory>
        <includes>
            <include>log4j.properties</include>
        </includes>
    </fileSet>
    <!-- adds jar package to the root directory of zip package -->
    <fileSet>
        <directory>${project.build.directory}</directory>
        <outputDirectory></outputDirectory>
        <includes>
            <include>*with-dependencies.jar</include>
        </includes>
    </fileSet>
</fileSets>

Below is the pom.xml (primary or main)

下面是pom.xml(主要或主要)

 <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4</version>
             <configuration>                    <descriptors>
              <descriptor>YY-main/src/main/assembly/assembly.xml</descriptor>   
         <!-- <descriptor>DummyAssembly.xml</descriptor> -->

                </descriptors>
            </configuration>
        </plugin>   

Questions:

问题:

1)Since assembly.xml is referred in primary pom, all submodules also get zipped. How can I specify only certain submodules to be zipped, while all others get ignored. I tried to move YY-main/src/main/assembly/assembly.xml from main pom to child/submodule pom and have dummyassembly.xml in main which does nothing. But that is not working (possibly because dummyassembly.xml is missing some required lines). tried few things, but nothing seem to work

1)由于在主pom中引用了assembly.xml,因此所有子模块也都被压缩。如何仅指定要压缩的某些子模块,而忽略所有其他子模块。我试图将YY-main / src / main / assembly / assembly.xml从main pom移动到child / submodule pom,并在main中使用dummyassembly.xml,它什么都不做。但这不起作用(可能是因为dummyassembly.xml缺少一些必需的行)。尝试了一些东西,但似乎没有任何作用

2)Also in assembly.xml (dependencyset), it is copying all the libraries to "lib" folder. How can I avoid this. again I tried few things (exclusion..) based on http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html#class_dependencySet but nothing worked.

2)同样在assembly.xml(dependencyset)中,它将所有库复制到“lib”文件夹。我怎么能避免这种情况。我再次根据http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html#class_dependencySet尝试了一些事情(排除..),但没有任何效果。

Can some one provide me with specific statements that I should change in my pom or assembly files to address 1 and 2-thanks

有人可以向我提供具体的陈述,我应该在我的pom或汇编文件中更改以解决1和2谢谢

2 个解决方案

#1


18  

The basic thing you should change is to create a separate module where you do the packaging which will look like this.

您应该更改的基本操作是创建一个单独的模块,您可以在其中进行包装,如下所示。

   +-- root (pom.xml)
        +--- mod-1 (pom.xml)
        +--- mod-2 (pom.xml)
        +--- mod-assembly (pom.xml)

The pom in the mod-assembly will look like this:

mod-assembly中的pom将如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.test.parent</groupId>
    <artifactId>root</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <artifactId>dist</artifactId>
  <packaging>pom</packaging>

  <name>Packaging Test : Distribution</name>

  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>module-one</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>module-two</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <id>make-bundles</id>
            <goals>
              <goal>single</goal>
            </goals>
            <phase>package</phase>
            <configuration>
              <descriptors>
                <descriptor>proj1-assembly.xml</descriptor>
              </descriptors>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

That will solve the problem with running maven-assembly-plugin in every child and the problem with the dummy descriptor. Here you can find a real example of such structure.

这将解决在每个子节点中运行maven-assembly-plugin的问题以及虚拟描述符的问题。在这里你可以找到这种结构的真实例子。

Furthermore having the modules in one folder and the dependencies in an other folder you can use a assembly descriptor like this:

此外,将模块放在一个文件夹中,将依赖项放在另一个文件夹中,您可以使用如下所示的程序集描述符:

  <id>bin</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
          <useProjectArtifact>false</useProjectArtifact>
          <useTransitiveDependencies>true</useTransitiveDependencies>
          <outputDirectory>lib</outputDirectory>
          <unpack>false</unpack>
          <excludes>
            <exclude>${project.groupId}:*:*</exclude>
          </excludes>
      </dependencySet>
  </dependencySets>
  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>
      <binaries>
        <outputDirectory>modules</outputDirectory>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>

#2


3  

I think the post How to Assemble Multi-Module Project with Maven might answer your question with an example.

我认为如何使用Maven组装多模块项目可以用一个例子回答你的问题。

My answers to your questions:

我对你问题的回答:

1) You should add the Assembly plugin in the parent pom within the build and pluginManagement tags to reuse it in the modules; the post mentioned above is a good example on how to do it. You can also take a look at 8.6 Best Practise chapter, topic 8.6.2, of the online book 'Maven: The Complete Reference'.

1)你应该在build和pluginManagement标签中的父pom中添加Assembly插件,以便在模块中重用它;上面提到的帖子就是如何做到的一个很好的例子。您还可以查看在线书籍“Maven:The Complete Reference”的8.6最佳实践章节,主题8.6.2。

2) The exclusion tag might be tricky. Again, take a look at 8.5 Controlling the Contents of an Assembly chapter of the online book 'Maven: The Complete Reference'. For example, the subtopic 8.5.4, about dependencySets mentions how to fine tune dependency includes and excludes for dependencySets; again, the subtopic 8.5.5, now about moduleSets, shows how to use it in that context.

2)排除标签可能很棘手。再次,请参阅在线书籍“Maven:The Complete Reference”中的8.5控制程序集内容章节。例如,关于dependencySets的子主题8.5.4提到了如何微调依赖包括和依赖于依赖集;再次,现在关于moduleSets的子主题8.5.5展示了如何在该上下文中使用它。

#1


18  

The basic thing you should change is to create a separate module where you do the packaging which will look like this.

您应该更改的基本操作是创建一个单独的模块,您可以在其中进行包装,如下所示。

   +-- root (pom.xml)
        +--- mod-1 (pom.xml)
        +--- mod-2 (pom.xml)
        +--- mod-assembly (pom.xml)

The pom in the mod-assembly will look like this:

mod-assembly中的pom将如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.test.parent</groupId>
    <artifactId>root</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

  <artifactId>dist</artifactId>
  <packaging>pom</packaging>

  <name>Packaging Test : Distribution</name>

  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>module-one</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>module-two</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <id>make-bundles</id>
            <goals>
              <goal>single</goal>
            </goals>
            <phase>package</phase>
            <configuration>
              <descriptors>
                <descriptor>proj1-assembly.xml</descriptor>
              </descriptors>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

That will solve the problem with running maven-assembly-plugin in every child and the problem with the dummy descriptor. Here you can find a real example of such structure.

这将解决在每个子节点中运行maven-assembly-plugin的问题以及虚拟描述符的问题。在这里你可以找到这种结构的真实例子。

Furthermore having the modules in one folder and the dependencies in an other folder you can use a assembly descriptor like this:

此外,将模块放在一个文件夹中,将依赖项放在另一个文件夹中,您可以使用如下所示的程序集描述符:

  <id>bin</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
          <useProjectArtifact>false</useProjectArtifact>
          <useTransitiveDependencies>true</useTransitiveDependencies>
          <outputDirectory>lib</outputDirectory>
          <unpack>false</unpack>
          <excludes>
            <exclude>${project.groupId}:*:*</exclude>
          </excludes>
      </dependencySet>
  </dependencySets>
  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>
      <binaries>
        <outputDirectory>modules</outputDirectory>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>

#2


3  

I think the post How to Assemble Multi-Module Project with Maven might answer your question with an example.

我认为如何使用Maven组装多模块项目可以用一个例子回答你的问题。

My answers to your questions:

我对你问题的回答:

1) You should add the Assembly plugin in the parent pom within the build and pluginManagement tags to reuse it in the modules; the post mentioned above is a good example on how to do it. You can also take a look at 8.6 Best Practise chapter, topic 8.6.2, of the online book 'Maven: The Complete Reference'.

1)你应该在build和pluginManagement标签中的父pom中添加Assembly插件,以便在模块中重用它;上面提到的帖子就是如何做到的一个很好的例子。您还可以查看在线书籍“Maven:The Complete Reference”的8.6最佳实践章节,主题8.6.2。

2) The exclusion tag might be tricky. Again, take a look at 8.5 Controlling the Contents of an Assembly chapter of the online book 'Maven: The Complete Reference'. For example, the subtopic 8.5.4, about dependencySets mentions how to fine tune dependency includes and excludes for dependencySets; again, the subtopic 8.5.5, now about moduleSets, shows how to use it in that context.

2)排除标签可能很棘手。再次,请参阅在线书籍“Maven:The Complete Reference”中的8.5控制程序集内容章节。例如,关于dependencySets的子主题8.5.4提到了如何微调依赖包括和依赖于依赖集;再次,现在关于moduleSets的子主题8.5.5展示了如何在该上下文中使用它。