2016-04-26 13 views
7

Ich habe folgendes Szenario vereinfacht:Wie kann ich Abhängigkeiten eines Projekts verwenden, das als bereitgestellt markiert wurde?

projectX ---> projectA ---> projectB 

Wo ---> bedeutet "abhängig von".

ProjectB ist wirklich einfach. Es erklärt keine Abhängigkeiten. dies ist in der Tat der einzige relevante Teil:

<packaging>jar</packaging> 

in pom.xml von projectA ich die Abhängigkeit zu ProjectB erklärt haben:

<packaging>jar</packaging> 
<dependencies> 
    <dependency> 
     <groupId>com.mycompany</groupId> 
     <artifactId>projectB</artifactId> 
     <version>1.0.0</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

Und in pom.xml von projectX ich habe:

Das Problem ist, dass ProjectX Komponenten (Klassen und solche) verwenden muss, die in ProjektB definiert sind. Wenn ich den Bereich in ProjektA ändern, um compile für ProjektB zu verwenden, wird alles funktionieren, aber dann wird ProjectB einbezogen, wenn der Krieg in ProjectX generiert wird, und ich muss diese Bibliothek aus dem generierten Krieg haben, da ich ProjectB in anderen zur Verfügung stelle Teil des Projekts. Im realen Szenario habe ich mehrere Abhängigkeiten wie projectB, die sich auf projectA auswirken. Um also die Größe des erzeugten Krieges zu reduzieren, möchte ich sie als zur Verfügung gestellt setzen, aber dann kann projectX die in diesen definierten Komponenten nicht verwenden Bibliotheken. Beispiel für Komponenten: Spring, Hibernate, usw.

Frage: Gibt es eine Möglichkeit, dies in einer sauberen Art und Weise zu erreichen, ohne erneut erklären Abhängigkeiten in vielen Orten?

+1

Die angegebenen Abhängigkeiten sind nicht transitiv http://stackoverflow.com/questions/34904558/why-arent-provided-maven-dependencies-transitive/. Es ist so in Maven gebaut und es wird sich wahrscheinlich nie ändern. – Tunaki

+0

@Tunaki das ist die Motivation für diese Frage (: –

+1

Ja, aber das ist die Schlussfolgerung hier: * Es ist falsch, eine Abhängigkeit zu verwenden, die du nicht deklarierst. * Siehe meine Antwort da drüben, es gibt einen Fehlerbericht dafür. Ich muss es explizit erklären. – Tunaki

Antwort

6

Das Problem ist, dass ProjectX Komponenten (Klassen usw.) verwenden muss, die in ProjektB definiert sind.

Dann sollte ProjetB in der Tat, in provided Bereich, wieder eine Abhängigkeit von ProjectX sein. Die erneute Deklaration der Abhängigkeit würde ändern, wie Maven sie als transitive Abhängigkeit behandeln würde (das heißt, Sie können ihr Verhalten überschreiben, indem Sie sagen: Ich möchte diese Abhängigkeit in meinem Projekt mit diesem Bereich haben).

aber dann wird ProjectB aufgenommen werden, wenn der Krieg in projectX zu erzeugen, und ich brauche aus dem erzeugten Krieg diese Bibliothek haben

Dieser durch Wieder erklärt es nicht in provided Umfang passieren wird. Alternativ können Sie den Bereich von ProjectB in ProjectA in compile ändern und dann die maven-war-plugin konfigurieren, um sie auszuschließen, indem Sie inclusions/exclusions verwenden.
Bevor Sie das tun, sollten Sie jedoch überprüfen, warum semantisch (oder anforderungsbezogen) ProjectB in ProjectA auf provided festgelegt wurde und welche Auswirkungen es auf andere Kundenprojekte hat.


aktualisieren
Beide Ansätze können die oben Ihre Bedürfnisse.Alternativ könnte, wie in den Kommentaren weitere Möglichkeiten vorgeschlagen werden nachhaltigere und klar auf lange Sicht zu einer besseren Regierungsführung und Wartung (Zentralisierung):

  • Verwenden Sie einen gemeinsamen parent pom, wo Sie die Liste der freigegebenen Abhängigkeiten erklären könnte, dh Abhängigkeiten, die von allen untergeordneten Projekten verwendet werden und einmal definiert (und beibehalten) werden.
  • Verwenden Sie den dependencyManagement Abschnitt in ProjectX, um zu ändern, wie Maven dependencies mediation transitive Abhängigkeiten von ProjectA behandelt, ohne ProjectA oder ProjectB (ähnlich wie Option 1 am Anfang dieser Antwort, mit the difference, dass es nur angewendet wird, wenn die Abhängigkeit kommt) Umfang und ansonsten ignoriert). Um dieses Management zu zentralisieren, wäre es wiederum besser, dies in einem gemeinsamen Elternteil zu tun (Option oben).