ich Programmiere schon seit längerem kleinere Java-Programme. Nun hab ich mich der Aufgabe gewidmet Maven zu lernen. Also schon mal Vorweg: Nicht wundern wenn die Terminologie noch nicht ganz stimmt wenn ich hier was Frage.
Ich habe nun mal mein eigenes Maven-Repro über die Linux-Konsole erstellt. Die Grundverzeichnisstruktur wurde richtig erstellt und habe auch schon in diesem Package etwas programmiert und habe auch schon mal testweise eine jar erstellen lassen. Nun möchte ich noch ein Plugin schreiben, was meine App nacher nutzt. (de.xy.myapp.core soll de.xy.myapp.plugin nutzen) Ich möchte am Ende also von Maven 2 jars generiert haben. Nun versuche ich dieses zweite Package (via Konsole) in mein bestehendes Repro hinzuzufügen. Leider bekomme ich immer den Error das das Verzeichnis (myapp) schon existiert.
Meine Frage nun: Kann ist eine Zweite Jar die ich Programmieren will und die iwie zu meinem Projekt dazugehört zu meinem Repro added oder muss ich dafür ein neues Maven Repro erstellen?! Oder geht sowas via Konsole nicht und ich muss es manuell erstellen? Google hilft mir leider nicht weiter. Wahrscheinlich weil ich nach den falschen Begriffen suche
Wenn du über die Konsole oder über deine IDE Projektstrukturen mit Maven erzeugst, dann nutzt Maven s.g. Archetypes. Das sind quasi Vorlagen mit Platzhaltern, um fertige Strukturen und Dateien zu erzeugen, also Projekte jeglicher Art.
Ein Maven Projekt braucht aber grundsätzlich erstmal nur eine pom.xml, darüber kann man dann alles konfigurieren.
In deinem Fall benötigst du ein multi-module Projekt, du musst dich nur entscheiden, ob die Struktur hierarchisch oder flach sein soll.
Ich bevorzuge meist die hierarchische Struktur, die in deinem Fall grob so aussehen würde:
Du siehst, jedes Verzeichnis hat eine eigene pom.xml. Das parent Modul hat keine src/main/java Verzeichnisse, da es nur die wichtigsten Projektinfos in der pom.xml verwalten muss.
Danke für eure Hilfen. Das Multi-Modul Projekt hab ich nun aufsetzen können. Hab auch schon fleißig gecodet und mir auch schon mal die 3 Module “builden” lassen. So weit so gut. In meinem späteren Programmverzeichnis liegen diese 3 Module im Order “modules”. Das Modul mit der GUI wird dann von einer exe gestartet.
Eines der Module nutzt externe Jars (hibernate etc). Diese sind als Dependency in der entsprechenden pom.xml angegeben und werden auch von Maven richtig verarbeitet (geladen etc.). Nun möchte ich beim Builden, das die externen jars (welche nicht von mir stammen) in einem seperaten Ordner “lib” kopiert werden. Also:
Was muss ich in der pom.xml einrichten damit die jars in diesen Ordner angelegt werden, aber auch die Abhängigkeiten so stimmen, das die Module die jars nutzen können?
Danke für die Hilfe. Hab das ganze nun wie empfohlen als Extra Maven-Modul realisiert. Das ist meine Discriptor xml:
[XML]
bin
dir
false
false
lib
false
true
de.app:module1
de.app:module2
de.app:module3
modules
false
[/XML]
Es werden auch 2 Ordner erstellt (modules und lib). Mein Problem ist nun noch das im Ordner modules wie gewünscht alle Module sind. Leider ist im Ordner Lib nun alle externen Jars UND alle module. Wie bekomme ich das DependencySet so konfiguriert das nur die externen jars im ordner lib sind. Geht das über einen Scope? Wenn ja welcher Scope ist für externe Jars der richtige?
Die Zweite Frage: Wie bekomme ich es Realisert das in der Mainfest für die Dependencies im Ordner lib der prefix …/lib/ (aus sich der module) angehangen wird?!
Da ist nei Beispiel wie man die main class des Manifests mit dem Assembly Plugin setzt, veileciht kann man da auch andere Dinge wie den CP im Manifest setzen.
Nebenbei, seit Java 6 oder so kann man auch ganze Ordner als CP angeben.
Nachtragf:
Hier ein Beispiel indem de CP auf einen Ordner gesetzt wird mit dem Assembly Plugin:
Danke den Eintrag von Stackoverflow hab ich auch schon gefunden. Aber brauche ich nicht 2 CPs? Einen auf modules einen auf libs? und in welche pom.xml kommt die dann genau?!
Sorry für den Doppelpost aber ich möchte das Ganze noch einmal pushend.
Ich hab trotz intensiver recherche und versuche es immer nocht nicht geschafft, das maven für die Module den Classpath auf modules und für die externen Jars den Classpath auf lib setzt.
Meine Module liegen im Order modules. Die Externen Jars (hibernate) liegen (relative von den modules aus gesehen) in …/lib. Module 1 nutzt z.b Module2 und Hibernate wenn ich keinen Classpath setze findet er Module2 aber hibernte nicht. Setze ich den CP auf …/lib findet er hibernate aber das Module2 nicht mehr. Was ich nun möchte ist, das ich in Module1 den Classpath für hibernate auf …/lib und für Module2 keinen (bzw auf den Ordner in dem auch Module1 liegt) setze.