我的项目使用了许多程序集,因此我只对程序集感兴趣。 在执行除程序集之外的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并确保只创建程序集?
答案 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最佳实践并重新安排了事情,所以你只为每个模块生成一个工件。
如果这没有意义,请告诉我,我会尽力澄清。