gpt4 book ai didi

java - 如何包含pom项目中的所有模块

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:30 24 4
gpt4 key购买 nike

我正在寻找一种方法来将来自另一个 pom.xml 的所有模块包含在一个项目中。所以在我的例子中,我有一个包装设置为 pom 的父 pom。它包含 3 个子模块,它们在另一个 api 模块中实现我的接口(interface)。我想在 Maven 的项目中动态包含所有子模块。

在这种情况下,我想在另一个模块中包含连接器 1、连接器 2、连接器 3,而不必隐式指定连接器 1、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,然后是一些与我的原始 api 匹配的 etl 代码。

我不记得我是如何解决这个问题的。我想我只需要包括所有子依赖项。

最佳答案

一种方法是创建第四个模块,它将 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>

请注意,描述符告诉程序集插件:

  1. 包含当前项目 react 器中的所有模块,因此当您在根项目中运行 mvn clean package 时,它将包含所有模块

  2. 包含 实现模块(连接器 模块),如具有 *:connector 的 include 元素中指定*.

当然,您需要配置程序集插件以在 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 来安装程序集 Artifact ,之后您可以从其他项目依赖它:

<dependencies>
<dependency>
<groupId>groupId</groupId>
<artifactId>connectorWrapper</artifactId>
<version>...</version>
<classifier>impl-modules</classifier> <!-- note the classifier -->
</dependency>
</dependencies>

关于java - 如何包含pom项目中的所有模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26471404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com