2 Packages / Groups in einem Projekt

Hallo,

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. :wink:

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 :wink:

Hoffe mir kann einer weiter helfen. :slight_smile:

Gruß
CrommCruach

Das hast du bestimmt nicht.
Du meinst wahrscheinlich du hast ein Projekt erstellt?

Deine andere Frage (wie erstelle ich Multi Modul Projekte) wird von der Maven Doku beantwortet, ohne Doku wirst du Maven nicht erlernen.

Um was fuer ein Programm handelt es sich denn?
OSGi/Eclipse RCP oder ein einfaches Java Projekt?

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:


- deinParentVerzeichnis
  pom.xml
  - deineApplikation
    pom.xml
    src/main/java
  - deinPlugin
    pom.xml
    src/main/java

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.

Eine gute Anleitung zu Maven hat Thorsten Horn hier geschrieben: http://www.torsten-horn.de/techdocs/maven.htm

Auch zu multi-module Strukturen gibt es Doku: http://www.torsten-horn.de/techdocs/maven-multiproj.htm

Ich selbst hab auch etwas multi-module Projekte gebloggt: http://sw-technik.blogspot.de/2013/02/entwicklung-im-team-mit-apache-archiva.html

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.


- MyApp
  launcher.exe
  - modules
    module1.jar
    module2.jar
    module3.jar

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:


- MyApp
  launcher.exe
  - modules
    module1.jar
    module2.jar
    module3.jar
  - lib
    hibernate.X.X.jar
    mysql-connector.jar

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?

Es gibt das Maven assembly Plugin fuer solche Aufgaben:
http://maven.apache.org/plugins/maven-assembly-plugin/

Am besten du erzeugst dir ein eigenes Maven Modul fuer den Export in der von dir gewuenschten Form, dann bleibt es einfahc & uebersichtlich :slight_smile:

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?!

Sorry für den Doppenpost:

Meine Jars landen mit dieser XML nun in den richtigen Ordnern:
[XML]

bin

dir

false


false
lib

de.app:module1
de.app:module2
de.app:module3





true

de.app:module1
de.app:module2
de.app:module3


modules
false




[/XML]

Wie sorge ich nun dafür das die auch in der Mainfest auch richtig eingetragen werden?!

http://maven.apache.org/plugins/maven-assembly-plugin/usage.html

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.

Kannst du nochmal deine aktuelle POM und den Assembly Descriptor posten?
Auf welchen Wert moechtest du den CP deiner “Haupt” Jar setzen?

Die POM des Parents

[XML]

4.0.0
de.moviedb
moviedb-parent
1.0-SNAPSHOT
pom

module1
module2
module3

${project.artifactId}-${project.version}




maven-assembly-plugin
2.4


src/assemble/bin.xml




org.apache.maven.plugins
maven-jar-plugin



true
de.app.module1.Launcher








[/XML]

Hier der Aktuelle discriptor

[XML]

bin

dir

false


false
lib

de.app:module1
de.app:module2
de.app:module3





true

de.app:module1
de.app:module2
de.app:module3


modules
false




[/XML]

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.