2009-12-18 11 views
9

Hier ist meine Variation der „mehrere Artefakte aus Maven build“ Frage:Maven (EJB) Projekt mit Client- und Server-Artefakte

ich von Ant zu Maven portieren. Meine Anwendung ist ein EJB-Server, der als EAR verpackt ist, aber auch eine Client-JAR für die Verwendung durch andere Client-Apps verfügbar macht. Dieses jar enthält die EJB-Schnittstellen, die Fassadenklasse und einige Helfer.

Ich weiß, dass der Maven-Weg ein Artefakt pro Projekt (POM) haben soll; Beide Artefakte (Server-EAR und Client-JAR) müssen jedoch aus demselben Quellbaum erstellt werden - Server- und Clientfreigabe, z. B. EJB- und Home-Schnittstellen.

Wie mache ich das in Maven?

Ich habe ein Projekt mit zwei POMs, sagen wir server-pom.xml & client-pom.xml? Ich dachte, ich könnte auch ein Eltern-POM (pom.xml) haben, mit dem man sowohl Client als auch Server mit einem einzigen Foul erstellen kann? Die Lebenszyklen unterscheiden sich jedoch nach der "Paket" -Phase, da der Server durch Assembly (tar/gzip) gehen muss, während der Client nach "package" fertig ist und einfach in das Repository installiert werden kann.

Jeder Rat/Erfahrung auf dem besten Weg, dies zu nähern?

Antwort

18

Ich weiß, dass die Maven Weg zu haben ist ein Artefakt pro Projekt (POM); Beide Artefakte (Server-EAR und Client-JAR) müssen jedoch aus demselben Quellbaum erstellt werden - Server- und Clientfreigabe, z. B. EJB- und Home-Schnittstellen.

Es gibt einige Ausnahmen von der Regel "ein Artefakt pro Projekt", von denen EJB-Projekte eine davon sind. So kann die maven-ejb-plugin konfiguriert werden, die EJB jar und ein Client JAR wie folgt zu generieren:

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-ejb-plugin</artifactId> 
     <configuration> 
      <generateClient>true</generateClient> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

Um das ejb-Client in einem anderen Projekt zu verwenden, nur fügen Sie es als Abhängigkeit von <type>ejb-client</type>:

<project> 
    [...] 
    <dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>ejb-project</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>ejb-client</type> 
    </dependency> 
    </dependencies> 
    [...] 
</project> 

Weitere Informationen finden Sie unter Generating an EJB client, und in der Dokumentation ejb mojo (einschließlich Informationen zum Anpassen der vom ejb-Client eingeschlossenen/ausgeschlossenen Klassen).

+0

Ausgezeichnet! Lass mich das versuchen. –

+1

@Pascal, das funktioniert gut, außer wenn der EJB-Client eine Abhängigkeit von einem anderen Modul innerhalb desselben Multi-Modul-Projekts ist. Erstens können Sie den EJB-Client nicht als verschachteltes Modul in der Elternliste von Modulen verwenden, da er keinen eigenen Ordner hat - er ist nur ein Nebenprodukt des EJB-Moduls. Zweitens wird das EJB-Client-Artefakt nur in der Paketphase erstellt, sodass der Reaktor es ohnehin nicht zum kombinierten Klassenpfad hinzufügen kann. –

+1

So scheint es, ich muss diesen Ansatz aufgeben und ein explizites Modul für den EJB-Client erstellen. Dies bedeutet jedoch, dass dieses neue "ejb-client" -Modul die Java-Quelle mit dem Hauptmodul "ejb" teilen muss (EJB-Schnittstellen sind geteilt). Ich gehe davon aus, dass ich die Quelle im Hauptmodul "ejb" belasse und das Modul "ejb-client" so konfiguriere, dass es auf den gleichen Quellordner verweist (z. B. ../ejb/src)? –

6

Ich habe multimodule projects verwendet, um dies vorher zu lösen.

Ich habe diesen Ansatz für ziemlich komplexe Projekte, die ein Dutzend verschiedene Module haben können, die zusammen gebaut werden müssen. Siehe für die Referenzierung des ejb.

Die Mutter pom.xml verwendet die modules tag:

<modules> 
    <module>jar</module> 
    <module>ejb</module> 
    <module>ear</module> 
</modules> 

und die Verwendung des Kindes pom.xml die parent tag:

<parent> 
    <groupid>mygroup</group> 
    <artifactId>parentName</artifactId> 
</parent> 
+0

@John, ich stimme dem Multi-Modul-Ansatz zu.Ich bin mir nicht ganz sicher, ob ich die Verwendung der EAR-Verpackung für den * Client * verstehe: Das * client * jar sollte nicht in der EAR enthalten sein und auch aus der gleichen Codebasis (src/main/java) als EAR-Code, da beide Artefakte die EJB-Schnittstelle/Home-Klassen teilen. –