我有一个包含很多子模块的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更好吗?
答案 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)
实现此目的的一种方法是使用moduleSet的maven 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>