# Maven - Parent oder Dependency?



## Klausinator (12. Feb 2021)

Hallo zusammen  
Ich habe vor kurzem ein Java-Projekt übernommen, welches ich gerne weiterentwickeln möchte.

Es existiert ein Spring-Basisprojekt in dem bereits die wesentlichen Grundfunktionalitäten (User-Verwaltung, Template usw) implementiert sind.

Mein aktuelles Projekt hat das Basisprojekt als Dependency und erweitert die Funktionalitäten. Der Vorentwickler hat fast alle Abhängigkeiten - egal ob vom Basisprojekt oder vom Projekt genutzt - direkt in das Basisprojekt gepackt. Im Projekt wurde dann zum größten Teil direkt auf die transitive Dependencies zugegriffen.

Wenn ich die Dependencies nun im Basisprojekt aufräume und ggf viele auch ins Projekt verschiebe, dann habe ich zB das Problem, dass ich auf die Version-Properties, welche sich im Basisprojekt befinden, nicht zugreifen kann. Dh ich pflege die Version zweimal, wenn ich zB im Projekt ein weiteres Spring-Modul einbinden will. Zusätzlich wirft mir maven dependency:analyze zahlreiche "used undeclared dependencies" um die Ohren, weil diese nicht direkt im Projekt sondern nur als transitive Abhängigkeit zur Verfügung stehen. 

Ich bin nun am überlegen, ob sich diese Struktur für einen Parent-Aufbau eignet. Bisher habe ich hiermit noch keine Erfahrungen und würde mich deshalb über eine erste Einschätzung von euch freuen. 

Ich freue mich auf eure Antworten. 

Beste Grüße aus Sachsen 
Klaus


----------



## LimDul (12. Feb 2021)

Wir haben hier in der Firma ein ähnliches Problem - X Projekte und Bibliotheken und diverse Abhängigkeiten zwischen Projekten. 

Wenn Projekt A die Bibliothek X nutzt und Projekt B die Bibliothek X auch nutzt, aber auch Projekt A als Abhängigkeit einbindet, dann möchte man, dass die Versionen möglichst konsistent sind.

Ergebnis:

Es gibt bei uns ein explizites Parent-Project (xx-commons-pom), dass alle unsere Projekte als Parent-POM nutzen. Das macht nichts anderes als einen Haufen Versionen festzulegen und im Dependency Management die meist genutzten Artefakte zur Verfügung zu stellen.

Dadurch ist relativ gut sichergestellt, dass die verwendeten Abhängigkeiten konsistent sind. Sollte dann tatsächlich Projekt A eine Biblitohek verwenden, die auch Projekt B verwendet, aber nicht in der parent POM drin ist - dann muss ich es tatsächlich doppelt pflegen. Aber das kommt selten vor.


----------



## Klausinator (12. Feb 2021)

LimDul hat gesagt.:


> Wir haben hier in der Firma ein ähnliches Problem - X Projekte und Bibliotheken und diverse Abhängigkeiten zwischen Projekten.
> 
> Wenn Projekt A die Bibliothek X nutzt und Projekt B die Bibliothek X auch nutzt, aber auch Projekt A als Abhängigkeit einbindet, dann möchte man, dass die Versionen möglichst konsistent sind.
> 
> ...


Vielen Dank für deine Antwort.

Ich denke dass es auf eine separat POM, wie von dir erklärt, hinauslaufen wird. Mittlerweile habe ich auch festgestellt, dass eine Parent-POM keine Source-Dateien den Childs zur Verfügung stellt - womit mein im Eingangspost genannter Plan hinfällig ist 🙈


----------



## mrBrown (13. Feb 2021)

Wenn es vorrangig um das Festsetzen der Versionen geht, bietet sich auch ein "Bill of Materials" an.

Das ist ein "leeres" Maven-Projekt (also packaging-Type ist pom, und es gibt keinen Code), welches alle Dependencies in `dependencyManagement` angibt, nicht direkt in `dependencies`:

[CODE lang="xml" title="BOM"]<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>bom</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>project1</artifactId>
                <version>1.2.3</version>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>project2</artifactId>
                <version>2.4.5</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
[/CODE]

Andere Projekte können dann dieses Projekt "importieren" und damit die Dependency-Versionen übernehmen.

```
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>bom</artifactId>
            <version>1.2.3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
         <groupId>com.example</groupId>
         <artifactId>project1</artifactId>
    </dependency>
</dependencies>
```


----------



## Klausinator (13. Feb 2021)

Das hört sich schonmal sehr gut an. 

Wie wäre eigentlich die richtige Vorgehensweise, wenn ich SpringBoot verwenden möchte? Würde ich SpringBoot als Parent vom Basisprojekt oder Projekt einbinden? Ich möchte sowohl im Basisprojekt als auch im Projekt die Möglichkeit haben, weitere Spring Module hinzuzufügen. 


Viele Grüße


----------



## mrBrown (13. Feb 2021)

Klausinator hat gesagt.:


> Wie wäre eigentlich die richtige Vorgehensweise, wenn ich SpringBoot verwenden möchte? Würde ich SpringBoot als Parent vom Basisprojekt oder Projekt einbinden? Ich möchte sowohl im Basisprojekt als auch im Projekt die Möglichkeit haben, weitere Spring Module hinzuzufügen.



Wenn man es als Parent nutzen will, müsste es am ehesten Parent von beiden sein.

Man braucht aber Spring auch gar nicht als Parent nutzen, man kann das als BOM einbinden (für die Dependencies) und die nötigen Plugin-Konfigurationen selbst übernehmen.


----------

