2012-06-22 8 views
6

Ich bin neu in Maven und ich versuche, ein paar Projekte zu Maven zu konvertieren und ich bin nicht sicher, was ist der richtige Weg, um sie zu strukturieren - hier ist was ich haben:Maven Projektdesign - ein gemeinsames Projekt teilen

Ich habe ein gemeinsames Modul - Common benannt und zwei verschiedene Anwendungen, die nichts gemeinsam haben, von der Tatsache, dass sie beide auf Common abhängen. Nennen wir sie A und B.

Die Abhängigkeiten zwischen A ->Common und B ->Common sind sowohl für die Laufzeit und für Tests - was bedeutet, dass A s Testklassen 's Testklassen Common erfordern'.

Ich habe verschiedene Kombinationen ausprobiert, die mir einfielen - aber keiner von ihnen produzierte, was ich will. Die seltsame Sache ist, dass mein Code kompiliert, aber JUnits fehlschlagen, da die Testklassen von nicht im Klassenpfad gefunden werden.

Sollte ich zwei Profile zu Common hinzufügen, um 2 Artefakte zu erstellen und zwei Abhängigkeiten in A und B zu beiden Artefakten hinzuzufügen? (Ist das möglich?) Gibt es einen richtigen Weg zu tun, was ich wollte? Sollte ich meinen Code für Maven restrukturieren?

Antwort

5

Dies ist eine gemeinsame Mavenfallen. Testklassen von einem Artefakt sind nicht verfügbar, wenn Sie von diesem Artefakt abhängig sind. Es ist tatsächlich sinnvoll: Wenn Sie auf Common angewiesen sind, hängen Sie von Produktionsklassen (JAR-Datei) ab. Testklassen werden nur zum Ausführen von Tests benötigt und sind nicht einmal in der endgültigen JAR enthalten.

Angenommen, Ihre Common Testklassen einig Hilfsmethode enthalten für alle Common Tests erforderlich, A und B Tests, hier ist eine vorgeschlagene Struktur:

  • Common-test - mit gemeinsamen Klassen Utility-Test (nicht Fälle testen!) In /src/main/java (!
  • )
  • Common hängt von Common-test mit <scope>test</scope>
  • A und B hängen von beiden Common (mit Standardbereich) und Common-test (mit test Umfang)

UML

+0

cool, welches Werkzeug hast du benutzt, um es zu zeichnen? –

+0

Wofür haben Sie dieses Diagramm erstellt? Sieht gut aus. – zengr

+2

@ zengr: http://yuml.me/ –

2

Man könnte es strukturieren wie

  • Gemeinsames Projekt
  • Ein Projekt
  • B Projekt

Jetzt CommonProject für A & B-<dependency> hinzufügen, dass die commonproject Verfügung stellen wird, um Kompilierzeit, damit Build gut gehen würde,

Wenn Ihr A & B ist oder Webapp Archetyp, dann müssen Sie sicherstellen, dass Ihre Abhängigkeiten in WEB-INF/lib verfügbar sind, so dass sie die Abhängigkeiten zur Laufzeit

die Abhängigkeiten bei test nur zur Verfügung zu stellen bekommen Zeit, könnten Sie verwenden test scope

2

Sie müssen laufen test-jar Ziel maven-jar-plugin in Ihrem Common Projekt.

Dies erzeugt ein neues Artefakt mit tests Klassifikator, der alle Klassen und Ressourcen von src/test Baum enthält.

in Common So fügen Sie diese:

<plugins> 
    ... 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>test-jar</id> 
     <goals> 
      <goal>test-jar</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
    ... 
</plugins> 

Und in A und B hinzufügen, um diesen

<dependency> 
    <groupId>common.group.id</groupId> 
    <artifactId>Common</artifactId> 
    <version>1.0</version> 
    <classifier>tests</classifier> 
    <scope>test</scope> 
</dependency> 

Hinweis <classifier>tests</classifier> in dieser Abhängigkeit Erklärung.

+0

Danke - das hat den Trick gemacht. Aber von dem was ich lese - das ist vielleicht nicht die empfohlene Architektur - ist das korrekt? Ist die Antwort von Tomasz Nurkiewicz (http://stackoverflow.com/a/11161411/357360) besser von einem Maven-Architektur-POV? – RonK

+0

@ RonK. Ich würde sagen, wenn die Ressourcen "Common/src/test" Hintertüren enthalten, um ein Testobjekt in "Common" zu erstellen, verwende meinen Ansatz. Wenn Klassen dort gemeinsame Test-Kabelbäume und Frameworks enthalten, verwenden Sie den Ansatz von Tomasz. –