Как правильно структурировать многомодульный проект maven, когда модуль требуется для многих проектов?

Поэтому я работал над тем, чтобы выяснить, как создать многомодульный проект maven, который позволяет нескольким проектам зависеть от одного основного модуля, который также будет упакован в JAR. Какова правильная структура для этого?

Для справки: изначально у меня не было pom-агрегатора, и он отлично строит/отлаживает, но я не могу собрать банку. И после игры с этим теперь я не могу даже импортировать один и тот же модуль в 2 отдельных проекта и больше не могу даже отлаживать/запускать.

Я думаю, что моя проблема связана с тем, что я неправильно создаю зависимости в intellij, но это всего лишь предположение. Исторически я заходил в настройки модуля -> зависимости и импортировал проект maven, чтобы мои помпы распознавали другие модули. Кажется, Intellij это не нравится, поскольку он постоянно удаляет мои модули из других проектов.

Итак, должны быть соблюдены следующие критерии:

  • один центральный основной модуль
  • Один модуль для конкретного проекта на каждого родителя
  • несколько проектов в зависимости от основного модуля
  • Все мавен проекты
  • Должна быть упакована в виде баночки
  • основной + вторичный модуль должны быть доступны для редактирования в каждом экземпляре Intellij

Итак, я перепробовал массу структур, но моя последняя попытка здесь следующая:

Родительский POM/проект, который указывает на 2 существующих модуля. Один из этих модулей будет использоваться в другом проекте аналогичной структуры.

Я пытался установить зависимости maven для всех этих poms в разных конфигурациях, но я все еще не получаю манифеста или noclassdeffound при сборке и/или вообще не могу строить или получать циклические зависимости.

вот родительский помпон:

  <?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

person nathan h    schedule 22.12.2019    source источник
comment
Вы поместили родительский элемент и модули в один и тот же репозиторий git/svn?   -  person J Fabian Meier    schedule 22.12.2019
comment
Нет, я не использую в настоящее время git или svn. Должен ли я создать репо для этого? Я планировал интегрироваться с git в ближайшее время, но сначала хочу получить это здание.   -  person nathan h    schedule 22.12.2019
comment
Я настоятельно рекомендую вам сначала изучить систему контроля версий, прежде чем продолжать работать над программным обеспечением или использовать систему сборки и т. д.   -  person khmarbaise    schedule 22.12.2019
comment
Я знаком с git, однако я не верю, что для создания проекта maven потребуется какой-либо контроль версий. Это неверное предположение? Однако я не очень хорошо знаком с Maven, поэтому, если для создания проекта требуется интеграция с git, это было бы полезно знать.   -  person nathan h    schedule 22.12.2019
comment
Git не нужен для Maven, но его не обойдешь, когда попытаешься сделать что-то серьезное. В любом случае, убедитесь, что у вас есть разумная структура каталогов для вашего многомодульного проекта. Я рекомендую помещать модули в подкаталоги родителя и ссылаться на них без использования .../   -  person J Fabian Meier    schedule 22.12.2019
comment
О редактировании: запуск одного jar-файла в командной строке не работает, если вы явно не укажете зависимости в командной строке или не создадите толстый jar-файл в Maven.   -  person J Fabian Meier    schedule 23.12.2019
comment
Да, я попытался затенить его, и это сработало, я предполагал, что он автоматически компилирует зависимые модули IntelliJ, что было не так. Как только я упаковал оттенок, он побежал красиво. Спасибо за помощь!   -  person nathan h    schedule 30.12.2019


Ответы (1)


Ваша базовая структура выглядит нормально. Я бы добавил элемент упаковки в модули 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 )

Хотя вы надеетесь построить все как многомодульный проект, я буду иметь дело с тем, что для первой сборки вы будете создавать родительский/корневой подмодуль по отдельности.

Корень pom, который

person emeraldjava    schedule 22.12.2019
comment
Я попробовал это, и нет никаких изменений. У меня сложилось впечатление, что они уже по умолчанию используют JAR, поскольку у меня включен плагин компилятора maven. Но большая проблема в том, что я не могу понять, как связать все это с intellij. Онлайн-руководства предназначены для новых проектов, но я импортирую существующие модули. Я думаю, что моя конфигурация зависимостей intellij конфликтует с maven. Я думаю, что моя проблема больше в том, как я связываю его с intellij и пытаюсь импортировать модули maven на странице настроек модуля, это то, что я должен делать? или все должно быть через maven по относительным путям? - person nathan h; 22.12.2019
comment
Можете ли вы опубликовать полное сообщение журнала сборки, которое вы сейчас получаете? - person emeraldjava; 22.12.2019
comment
По состоянию на последние 5 минут, которые он сейчас создает, я добавил частичную трассировку стека того, что происходит при запуске скомпилированного jar. По сути, в финальной банке нет классов с общим ядром. Я попытался добавить общее ядро ​​​​как зависимость от maven и intellij. - person nathan h; 22.12.2019
comment
Никогда не пытайтесь добавлять зависимости вне Maven. - person J Fabian Meier; 22.12.2019
comment
Кажется, это проблема здесь ... Я просто не знал, как заставить модуль отображаться в окне проекта intellijs, не добавляя его в качестве зависимости. Я посмотрю на это. - person nathan h; 22.12.2019
comment
Итак, по сути структура такова: все папки параллельны друг другу в одном каталоге. Опять же, основной модуль будет иметь несколько родителей, поэтому я не могу создать корневой/родительский элемент, а затем вложить модули внутрь, верно? Итак, путь правильный, родитель параллелен дочернему (pom — это ../TEST-CLIENT-PARENT/pom.xml из TEST-CLIENT-CLI/pom.xml). Является ли эта структура каталогов ошибочной? - person nathan h; 23.12.2019
comment
Модуль не может иметь более одного родителя. - person J Fabian Meier; 23.12.2019