我正在寻找一种方法来从另一个pom.xml中包含项目中的所有模块。所以在我的情况下,我有一个包装设置为pom的父pom。它包含3个子模块,用于在另一个api模块中实现我的接口。我想在maven中动态地包含我项目中的所有子模块。
在这种情况下,我想在另一个模块中包含connector1,connector2,connector3,而不必隐式指定connector1,2,3。
connectors - packaging: pom
connector1 - packaging: jar
connector2 - packaging: jar
connector3 - packaging: jar
我尝试在我的项目中包含连接器pom,但这不起作用。我希望用pom指定父包将包含子模块,但这不起作用。有没有办法解决这个问题?
更新
这更让我感到不满,因为我想简单地添加一个连接器并包含项目的所有子模块依赖关系jar。这将使pom更容易阅读。
而不是必须像这样注册所有子依赖
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector1</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector1-api</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector1-etl</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector1-persistence</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector2</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector2-api</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector2-etl</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector2-persistence</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector2-other</artifactId>
<version>0.0.1</version>
</dependency>
...
</dependencies>
这只是澄清原始问题的一个例子。它不存在,如果确实有效,可能会有重新发布。
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector1</artifactId>
<version>0.0.1</version>
<type>pom</type>
<include>submodules</include>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector2</artifactId>
<version>0.0.1</version>
<type>pom</type>
<include>submodules</include>
</dependency>
</dependencies>
如果我没记错的话,我正在为订购系统创建一个模块化项目,我有一个内部系统会使用的通用api(REST)。我正在创建一个路由系统,我可以根据订单的标准(国家,优先税等)将订单路由到单个履行中心。每个履行中心都有自己的api(连接器)。
原始问题中的示例大大简化,使问题更加简洁。在实际项目中,每个连接器(1,2,3)都是一个带有多个依赖关系jar的独立pom。一个用于他们的客户端api,然后一些etl代码与我原来的api匹配。
我不记得我是如何解决这个问题的。我想我只需要包含所有子依赖项。
答案 0 :(得分:10)
一种方法是创建第四个模块,将3个模块“包装”为依赖项。这样你可以依赖这个包装模块。
connectors - packaging: pom
connector1 - packaging: jar
connector2 - packaging: jar
connector3 - packaging: jar
connectorWrapper - packaging: pom (depends on the above three)
虽然明确声明每个连接器的依赖关系会更有意义,尤其是它们只有三个。
替代解决方案:
更具动态性的方法(虽然非常过分的IMO)是让第四个模块使用自定义assembly descriptor将实现模块打包到程序集中。例如,在connectorWrapper
内,您可以编写assembly.xml
:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>impl-modules</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}</directory>
<includes>
<include>pom.xml</include>
</includes>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
</fileSets>
<moduleSets>
<moduleSet>
<useAllReactorProjects>true</useAllReactorProjects>
<includes>
<include>*:connector*</include>
</includes>
<binaries>
<includeDependencies>false</includeDependencies>
</binaries>
</moduleSet>
</moduleSets>
</assembly>
请注意,描述符告诉程序集插件:
包含当前项目反应堆中的所有模块,因此当您在根项目中运行mvn clean package
时,它将包含所有模块
包含仅实施模块(connector
模块),具有include
的{{1}}元素中指定。
当然,您需要配置程序集插件以在*:connector*
中使用此描述符(或您为此包装器选择的任何其他名称):
connectorWrapper
然后,您可以在根项目上运行<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
来安装程序集工件,之后您可以从其他项目中依赖它:
mvn install
答案 1 :(得分:1)
不完全确定它是否完全符合您的需要,但在最新的maven版本中,您可以在依赖项上使用范围import
。
第一步是创建一个包含您希望包含在其他项目中的所有依赖项的pom:
<project>
<groupId>com.foo</groupId>
<artifactId>connectors</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector1</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector1-api</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.foo</groupId>
<artifactId>connector1-etl</artifactId>
<version>0.0.1</version>
</dependency>
...
</dependencies>
</project>
在项目中,您希望包含您拥有的连接器:
<dependency>
<groupId>com.foo</groupId>
<artifactId>connectors</artifactId>
<version>0.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
有关详细信息,请参阅Importing Dependencies。
另一种方法可能是使用maven程序集插件并创建一个包含您想要包含的所有类的单个(巨大)jar(单罐包装); (为此你还需要创建一个包含所有依赖项和程序集插件的pom)。
答案 2 :(得分:0)
我会write my own maven plugin为此。从您的声誉和问题来看,您可能会在一小时内准备好一些东西。最有可能比研究和尝试解决方案更快地做你想做的事情。