Наследование и создание с Maven

Я начал изучать Maven, и теперь я пытаюсь сделать несколько реальных проектов, начиная с простых. Возможно, здесь это выглядит проще всего, но я действительно запутался в том, что мне делать, если я хочу одновременно упаковать родительские и дочерние проекты.

(PS: я использую интеллигентную идею кстати)

вот моя конфигурация

Проект А

  • предположим, что это зависит от гуавы и gson

Проект Б

  • это будет зависеть от проекта А

Проект С

  • это будет зависеть от проекта B

когда я устанавливаю атрибут упаковки в Project A на jar, это дает ошибку, в основном говоря, что "вы должны установить элемент упаковки как pom, если он находится в родительском pom". Но я знаю, что если я установлю элемент упаковки как pom, он не создаст пакет.

Поэтому я решил создать еще один проект как многомодульный для решения проблем с упаковкой, но не понял, как! Вкратце, как я могу создать файлы JAR для каждого из них одновременно?

РЕДАКТИРОВАТЬ - ЗДЕСЬ, ЧТО Я ЧТО

МОДУЛЬ ПОМ

<?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>com.deneme.module</groupId>
    <artifactId>ModuleGroup</artifactId>
    <packaging>pom</packaging>
    <version>1.0.1</version>
    <modules>
        <module>A</module>
        <module>B</module>
    </modules>


</project>

ПРОЕКТ А

<?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>com.mg.A</groupId>
    <artifactId>A</artifactId>
    <version>1.0.2</version>
    <packaging>pom</packaging>

    <dependencies>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.3</version>
        </dependency>
    </dependencies>



</project>

ПРОЕКТ Б

<?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>
    <packaging>jar</packaging>

    <parent>
        <artifactId>A</artifactId>
        <groupId>com.mg.A</groupId>
        <version>1.0.2</version>
        <relativePath>../A/pom.xml</relativePath>
    </parent>

    <groupId>com.mg.B</groupId>
    <artifactId>B</artifactId>
    <version>1.0.1</version>

</project>

2 ответа

Решение

Я думаю, что вы путаете наследование и зависимость.

Наследование: дочерний pom наследует все значения, такие как свойства, groupId, version, а также зависимости. В общем, вы не должны использовать зависимости в родительских poms

Зависимость: pom зависит от некоторого другого jar/pom и использует его содержимое, а также использует / зависит от транзитивных зависимостей

Насколько я понимаю вашу проблему, у вас есть следующее:

  1. Project A - библиотека, зависящая от внешних пакетов, таких как gson и guava
  2. Project B - библиотека, зависящая от Project B, и транзитивно от gson и guava
  3. Project C - приложение, зависящее от Project B, и транзитивно от Project A, gson и guava

Я предлагаю вам использовать эту структуру каталогов:

Workspace
|- ModuleProject
|- ProjectA
|- ProjectB
\- ProjectC

и помпы будут выглядеть так (заголовок раздет):

Модуль пом:

<groupId>com.deneme.projectname</groupId>
<artifactId>ModuleGroup</artifactId>
<packaging>pom</packaging>
<version>1.0.1</version>

<modules>
    <module>../ProjectA</module>
    <module>../ProjectB</module>
    <module>../ProjectC</module>
</modules>

Проект А:

<parent>
    <groupId>com.deneme.projectname</groupId>
    <artifactId>ModuleGroup</artifactId>
    <version>1.0.1</version>
    <relativePath>../ModuleProject/</relativePath>
</parent>

<artifactId>A</artifactId>
<version>1.0.2</version>
<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.3</version>
    </dependency>
</dependencies>

Проект Б:

<parent>
    <groupId>com.deneme.projectname</groupId>
    <artifactId>ModuleGroup</artifactId>
    <version>1.0.1</version>
    <relativePath>../ModuleProject/</relativePath>
</parent>

<artifactId>B</artifactId>
<version>1.0.2</version>
<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>com.deneme.projectname</groupId>
        <artifactId>A</artifactId>
        <version>1.0.2</version>
    </dependency>
</dependencies>

Проект С:

<parent>
    <groupId>com.deneme.projectname</groupId>
    <artifactId>ModuleGroup</artifactId>
    <version>1.0.1</version>
    <relativePath>../ModuleProject/</relativePath>
</parent>

<artifactId>C</artifactId>
<version>1.0.2</version>
<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>com.deneme.projectname</groupId>
        <artifactId>B</artifactId>
        <version>1.0.2</version>
    </dependency>
</dependencies>

Если ваш проект A объявляет B и C как модули, для него должен быть установлен элемент упаковки pom. Это также означает, что он не должен содержать никакого кода и не будет генерировать артефакт сам по себе. Это просто способ группировки проектов.

В maven родительский pom используется для определения общей конфигурации (свойств и т. Д.), Которая будет наследоваться всеми дочерними проектами.

В вашем случае я бы предположил, что вам нужен родительский проект (упаковка pom) с 3 детьми: A, B и C:

parentProject 
 * module A
 * module B
 * module C

При запуске mvn install в parentProject все подмодули будут собраны и произведут соответствующий jar (скажем, A.jar, B.jar и C.jar).

Обратите внимание, что вам не нужно объявлять родителя в дочернем pom для достижения этого результата, вам нужно только объявить их как модули в родительском pom, что называется агрегацией проекта. Объявление родителя в потомке называется наследованием проекта. Вы можете посмотреть следующую документацию для получения более подробной информации:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html

Другие вопросы по тегам