Наследование и создание с 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 и использует его содержимое, а также использует / зависит от транзитивных зависимостей
Насколько я понимаю вашу проблему, у вас есть следующее:
- Project A - библиотека, зависящая от внешних пакетов, таких как gson и guava
- Project B - библиотека, зависящая от Project B, и транзитивно от gson и guava
- 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