Maven-2:避免默认包装?

时间:2009-09-09 04:53:50

标签: maven-2

我的项目使用了许多程序集,因此我只对程序集感兴趣。 在执行除程序集之外的mvn install时,我将获得默认的打包.jar。 我怎么能避免这个?


我有一个类似于你提供的pom.xml。 在执行mvn install时,我得到包含所有内容的App1.jar,App2.jar和快照jar

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-2</version>
            <executions>
                <execution>
                    <id>assemblyone</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <finalName>App1</finalName>
                        <appendAssemblyId>false</appendAssemblyId>
                        <descriptors>
                            <descriptor>${basedir}/src/main/resources/assemblies/report.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
                <execution>
                    <id>assemblytwo</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <finalName>App2</finalName>
                        <appendAssemblyId>false</appendAssemblyId>
                        <descriptors>
                            <descriptor>${basedir}/src/main/resources/assemblies/src.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build> 

如何避免这个快照(不确定术语)jar并确保只创建程序集?

3 个答案:

答案 0 :(得分:2)

我可以通过两种方式阅读您的问题,我已经概述了以下两个方面的答案。如果两者都不正确,请解释一下你的问题。

1)你的意思是你有一个带有默认(jar)包装的项目,你想在没有定义程序集的情况下避免创建jar吗?如果是这种情况,如果没有定义程序集,那么构建实现了什么?

2)你是否意味着你正在运行mvn assembly:assembly以生成程序集并想知道如何在运行安装目标时获取该程序集?


对于选项2,如果指定&lt; appendAssemblyId&gt;,则可以将程序集插件绑定到生命周期阶段以确保它始终运行。应该是假的,然后程序集将替换默认的jar。

例如,此配置将在打包阶段调用程序集插件并替换默认jar:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-2</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>
          <descriptor>src/main/assembly/archive.xml</descriptor>
        </descriptors>
      </configuration>
    </execution>
  </executions>
</plugin>    

对于选项1,这实际上非常棘手。我能想到的最好的方法是指定项目有pom打包并使用通常绑定到profile中jar生命周期的执行来配置项目。您需要配置的生命周期绑定列在introduction to the build lifecycle

答案 1 :(得分:0)

我不确定你能以一种非常简单的方式真正做到这一点。

解决方案是在构建完成后调用clean插件,方法是这样做:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <executions>
                <execution>
                    <id>auto-clean</id>
                    <phase>package</phase>
                    <goals>
                        <goal>clean</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    ...
</build>

这样,在target/目录中创建的JAR将在Maven2执行结束时被删除。

但是,您必须定义另一个目录来存储Maven2创建的程序集。否则,它将被clean插件的调用删除...如果要将它们存储在assemblies-target/目录中,可以在pom.xml文件中添加:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
        ...
        <!-- Copy the ZIP in target/ of the ROOT directory. -->
        <outputDirectory>assemblies-target</outputDirectory>
    </configuration>
    ...

答案 2 :(得分:0)

我认为,如果你向我们展示你的整个POM和正在构建的工件,那就更清楚了。我只能猜测问题是什么,因为你的术语不是我熟悉的。这是我对问题的猜测:你有一个POM配置为生成两个程序集JAR,但你得到了POM本身的第三个JAR。换句话说,如果您的POM的artifactId是MyApp,除了您真正想要的两个JAR之外,您还会获得MyApp-1.0.0.jar或类似内容。

如果是这种情况,问题归结为您正在使用Maven从单个模块创建多个工件。 Maven旨在从每个模块中仅生成一个主要工件。我要做的是将POM更改为包装类型为“pom”,并在名为App1和App2的<modules>部分中为其提供两个模块。在您的模块下创建子目录,每个App一个。给它们每个POM配置一个组件,包装类型为“jar”。移动代码/文件/等。适当地放入每个子模块中,以便父模块中没有任何剩余。

使用Maven,如果你发现自己从一个模块(你是)生成两个工件,你应该首先考虑你可能违反了Maven最佳实践并重新安排了事情,所以你只为每个模块生成一个工件。

如果这没有意义,请告诉我,我会尽力澄清。