Czy projekty maven mogą mieć wielu rodziców?

Mamy projekty Java i Flex. Obecnie mamy 1 podstawowy pom, który zawiera konfiguracje, które chcemy wykorzystać dla obu projektów. Problem z tym polega na tym, że projekty Flex dziedziczą konfigurację, na przykład dla wtyczek javadoc i pmd, co nie jest pożądane.

Chcę go wyczyścić i mieć prawdziwy pom bazowy, a następnie java-base-pom i flex-base-pom. Ale jak to działa w wielu modułach, które mają zarówno część Flex, jak i część Java?

Mamy pluginy do naszych aplikacja, w której używamy następującej struktury:

  • my-plugin
    • my-plugin-client (flex)
    • my-plugin-server (java)

my-plugin zawiera tylko pom.xml z <modules/> sekcją. Użyłbym my-plugin pom.xml jako rodzic dla obu, ale wtedy nie mogę również użyć java base-pom lub flex base-pom jako rodzica. Jakie byłoby najlepsze rozwiązanie?

Author: Ondra Žižka, 2009-10-28

6 answers

Projekt może mieć tylko jednego rodzica (w przeciwieństwie do dziedziczenia wielokrotnego W C++), ale ten rodzic może być częścią większej hierarchii rodzicielskiej. Jak zauważyli inni, można więc mieć coś takiego:

base-pom/
|-- flex-base-pom
|   |-- my-plugin-client
|   |   `-- pom.xml
|   `-- pom.xml
|-- java-base-pom
|   |-- my-plugin-server
|   |   `-- pom.xml
|   `-- pom.xml
 `-- pom.xml

Zauważyłem, że napisałeś, że Twój rzeczywisty problem polega na tym, że:

Projekty Flex dziedziczą konfigurację na przykład dla javadoc i pmd, której nie chcą.

Powinieneś użyć pluginManagement element, aby tego uniknąć "situation": {]}

pluginManagement jest elementem widocznym wzdłuż bocznych wtyczek. Plugin Management zawiera elementy plugin w taki sam sposób, z tym wyjątkiem, że zamiast konfigurowania informacji o wtyczce dla tego konkretnego projektu build, jest przeznaczony do skonfigurowania projektów buduje, które dziedziczą z tego. Jednak to tylko konfiguruje wtyczki, które są faktycznie odwołuje się w elemencie wtyczki w dzieci. Dzieci mają pełne prawo do obejścia pluginManagement definitions.

Tak więc, w macierzystym pom Skonfiguruj swoje wtyczki w pluginManagement (javadoc i pmd na przykład) i odwołaj się do nich w elemencie plugins w żądanych potomkach(tylko w my-plugin-server tutaj). To rozwiąże Twój obecny problem.

 37
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-28 14:19:57

Mimo że projekty Mavena mają jednego rodzica, mogą zaimportować dowolną liczbę innych pom ' ów w następujący sposób:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>my-shared-dependencies</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

To ma dwie istotne różnice w porównaniu do rodzica:

  1. wtyczki zdefiniowane w importowanym pom nie będą importowane
  2. zależności zdefiniowane w importowanym pom nie będą dodawane do bieżącego pom, zaimportuje tylko zależności do sekcji Zarządzanie zależnościami

Jednakże, jeśli twój rodzic pom ma <dependencies> sekcję i Ty jeśli chcesz włączyć je do swoich zależności, możesz dodać rodzica do sekcji <dependencies> tak jak zwykła zależność:

<dependency>
    <groupId>org.example</groupId>
    <artifactId>my-shared-dependencies</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

Mimo że ta sama zależność jest już zaimportowana, tag version musi zostać ponownie określony. Aby zmniejszyć powielanie, może być przechowywany w właściwości

 38
Author: Peter Szanto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-20 14:15:28

Jedynym sposobem jest posiadanie base-pom jako rodzica java-base-pom i flex-base-pom.

Mam podobną strukturę dla moich wiosennych projektów:

base-pom (basic configuration - eclipse, reports, repositories, etc)
|
+ spring-base-pom (spring definitions)
  |
  + spring-jar-base-pom (jar specific definitions)
  |
  + spring-war-base-pom (spring web and servlet dependencies)
    |
    + spring-webapp-base_pom (spring web mvc dependencies)
 6
Author: David Rabinowitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-28 13:15:32

Przekroczyłem również ten dokładny proble, a najlepszym rozwiązaniem, jakie znalazłem, było użycie dziedziczenia i agregacji, jak sugeruje to pytanie: czy maven obsługuje wielu rodziców (wielokrotne dziedziczenie) ?

Możesz mieć agregator pom, który nie jest rodzicem projektów / align = "left" /

I wyjaśnić w Maven Documentation

Dziedziczenie i agregacja tworzą ładną dynamikę do kontrolowania kompilacji za pomocą pojedynczego, wysoki poziom POM (...) Odwrotnie, projekt POM może agregować projekty, które nie dziedziczą z niego.

Z tego miałem swoje dziedzictwo POMs (Pom-master zawiera konfiguracje gmin, a każdy z nich jest specyficzny):

pom-master
  |-- pom-java
  |-- pom-flex

I tak mój projekt może uzyskać szczegóły dla każdej konfiguracji modułów zgodnie z życzeniem:

project (aggregate project-flex & project-java)
  |-- project-java
  |      `-- pom.xml => parent = pom-java
  |-- project-flex
  |       `-- pom.xml ==> parent = pom-flex
  `-- pom.xml => parent = pom-master

Mam nadzieję, że pomoże również innym:)

 4
Author: LE GALL Benoît,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-17 11:16:16

Po prostu obraz, który pom.xml są w rzeczywistości klasami Javy: możesz mieć tylko jednego rodzica( lub rozszerza klasę), ale ten rodzic może mieć również innego rodzica, i tak dalej.

Jak wyjaśniłem tutaj , należy odróżnić Zasady rodzica i agregacji w Maven, co oznacza, że my-plugin będzie uważany za projekt agregacji, niekoniecznie projekt rodzica zarówno dla my-plugin-client i my-plugin-parent.

Podsumowując:

my-plugin zdefiniuje baza pom dla wszystkich twoich projektów. Następnie tworzymy dwa nowe projekty pom: java-base-pom i flex-base-pom. Mają oboje my-plugin Jako rodzice. Teraz my-plugin-client będzie miał java-base-pom jako rodzica, podczas gdy my-plugin-server będzie używać flex-base-pom dla swojego rodzica.

W ten sposób my-plugin-client odziedziczy wszystkie właściwości zdefiniowane w my-plugin pom.xml, a także z projektu java-base-pom.

 2
Author: Romain Linsolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:16

Możesz uzyskać wiele dziedziczeń za pomocą profili:

Tworzysz (wiele) Profili w głównym pom, a automatyczna aktywacja dowolnej odmiany tych profili powoduje wielokrotne dziedziczenie konfiguracji Mavena.

 0
Author: sibidiba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-21 00:26:21