当许多项目需要一个模块时,如何正确地构造一个多模块maven项目?

当许多项目需要一个模块时,如何正确地构造一个多模块maven项目?,maven,intellij-idea,multi-module,Maven,Intellij Idea,Multi Module,因此,我一直在研究如何创建一个多模块maven项目,该项目允许多个项目依赖于一个核心模块,该模块也将打包到一个JAR中。什么是合适的结构 作为记录,我最初没有聚合器pom,它可以很好地构建/调试,但我不能构建jar。玩了这个之后,我甚至不能将同一个模块导入到两个单独的项目中,甚至不能调试/运行 我认为我的问题源于我在intellij中创建的依赖项是错误的,但这只是一个猜测。我过去一直在使用模块设置->依赖项并导入maven项目,以便我的POM识别其他模块。Intellij似乎不喜欢这样,因为它不

因此,我一直在研究如何创建一个多模块maven项目,该项目允许多个项目依赖于一个核心模块,该模块也将打包到一个JAR中。什么是合适的结构

作为记录,我最初没有聚合器pom,它可以很好地构建/调试,但我不能构建jar。玩了这个之后,我甚至不能将同一个模块导入到两个单独的项目中,甚至不能调试/运行

我认为我的问题源于我在intellij中创建的依赖项是错误的,但这只是一个猜测。我过去一直在使用模块设置->依赖项并导入maven项目,以便我的POM识别其他模块。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>

你的基本结构看起来不错。我会将打包元素添加到核心模块和CLI模块中

<packaging>jar</packaging>
我认为这个相对论是不正确的

<relativePath>../TEST-CLIENT-PARENT</relativePath>
虽然您希望将所有内容都构建为一个多模块项目,但对于第一个构建,您将单独构建父/根子模块


根pom

我试过了,没有变化。我觉得他们已经默认使用JAR了,因为我已经启用了maven编译器插件。但更大的问题是我不知道如何将这一切与intellij联系起来。在线指南用于新项目,但我正在导入现有模块。我认为我的intellij依赖项配置与maven冲突。我想我的问题更多的是如何将它链接到intellij,并尝试在模块设置页面中导入maven模块,这是我应该做的吗?还是应该通过相对路径通过maven完成?您可以发布当前获得的完整构建日志消息吗?在当前构建的最后5分钟,我添加了一个部分堆栈跟踪,记录了编译后的jar运行时发生的情况。本质上,在最终的jar中没有共享的核心类。我曾尝试将共享核心作为maven和intellij依赖项添加。从未尝试在maven之外添加依赖项。这似乎是这里的问题。。。我只是不确定如何让模块显示在intellijs项目窗口中,而不将其作为依赖项添加。我会关注一下。您是否将父模块和模块放在同一个git/svn存储库中?没有,我目前没有使用git或svn。我必须为此创建回购吗?我确实计划很快与git集成,但我想先获得这座建筑。我强烈建议您在继续开发软件或使用建筑系统等之前,先学习版本控制系统。我熟悉git,但我不认为构建maven项目需要任何版本控制。这是一个错误的假设吗?然而,我对Maven不是很熟悉,所以如果需要git集成来构建一个项目,我很高兴知道。Maven不需要git,但是当你试图做一些严肃的事情时,你不会回避它。无论如何,请确保您的多模块项目具有合理的目录结构。我建议将模块放入父级的子目录中,并引用它们,而不使用
../
Exception in thread "main" java.lang.NoClassDefFoundError: com/shared/networking/contexts/NetworkContext
        at com.Main.main(Main.java:23)
Caused by: java.lang.ClassNotFoundException
<packaging>jar</packaging>
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 )