当许多项目需要模块时,如何正确构建多模块 maven 项目?



所以我一直在努力弄清楚如何制作一个多模块 maven 项目,允许多个项目依赖于一个核心模块,该模块也将打包到 JAR。这是什么适当的结构?

作为记录,我最初没有聚合器pom,它可以很好地构建/调试,但我无法构建jar。现在玩完这个之后,我什至无法将相同的模块导入到 2 个单独的项目中,甚至无法再调试/运行。

我认为我的问题源于我在 intellij 中创建错误的依赖项,但这只是一个猜测。我历来一直在进行模块设置 ->依赖项并导入一个 maven 项目,以便我的 poms 识别其他模块。Intellij似乎不喜欢这样,因为它不断从其他项目中删除我的模块。

因此,应满足以下条件:

  • 一个中央核心模块
  • 每个父级一个项目特定模块
  • 多个项目取决于核心模块
  • 所有 maven 项目
  • 必须包装成罐子
  • 核心 + 辅助模块应该在每个 IntelliJ 实例中可编辑

所以我尝试了大量的结构,但我在这里的最后一次尝试如下:

指向 2 个现有模块的父 POM/项目。其中一个模块将用于另一个结构类似的项目。

我尝试在不同配置的所有这些pom上设置maven依赖项,但是在构建和/或根本无法构建或获得循环依赖项时,我仍然没有得到清单或noclassdeffound。

这是父 POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>TEST</groupId>
<artifactId>CLIENT-PARENT</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
<module>../TEST-SHARED-CORE</module>
<module>../TEST-CLIENT-CLI</module>
</modules>
</project>

这是子 A(核心(pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>TEST</groupId>
<artifactId>TEST-SHARED-CORE</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
...
</dependencies>

</project>

和第二个子模块 POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-  4.0.0.xsd">
<modelVersion>4.0.0
</modelVersion>
<groupId>TEST</groupId>
<artifactId>TEST-CLIENT-CLI</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>TEST</groupId>
<artifactId>CLIENT-PARENT</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../TEST-CLIENT-PARENT</relativePath>
</parent>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>TEST</groupId>
<artifactId>TEST-SHARED-CORE</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

</project>

我的印象是我的结构非常不正确,那么正确的结构是什么?

编辑:

当这样做打包/构建时,这就是运行JAR时发生的情况,它找不到共享核心中的类。

Exception in thread "main" java.lang.NoClassDefFoundError: com/shared/networking/contexts/NetworkContext
at com.Main.main(Main.java:23)
Caused by: java.lang.ClassNotFoundException

你的基本结构看起来还行。我会将打包元素添加到 CORE 和 CLI 模块中

<packaging>jar</packaging>

所以Maven知道构建一个jar文件。

编辑 2

我相信你现在的结构是

parent ( a pom with modules )
- core ( a jar )
- cli  ( a jar )

我认为这个相对路径不正确

<relativePath>../TEST-CLIENT-PARENT</relativePath>

因为这表明

root ( a pom with only modules )
- parent ( a pom with common jar dependencies)
- core ( a jar )
- cli  ( a jar )

虽然您希望将所有内容构建为多模块项目,但对于第一次构建,您将单独构建父/根子模块。

根绒球

最新更新