2012-10-21 10 views
5

Viele Open-Source-Projekte wie Spring bestehen aus mehreren Modulen. Wenn ich diese Module als Abhängigkeiten in Maven hinzufüge, sollte ich explizit jede Abhängigkeit definieren oder einfach das transitive Abhängigkeitsmanagement tun lassen. Zum Beispiel, welcher der beiden folgenden Fälle eine Best Practice ist.Wann sollten transative Abhängigkeiten in Maven explizit definiert werden?

Fall 1: Fügen Sie die höchsten Level-Funktionen, die ich will

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>3.1.2.RELEASE</version> 
    </dependency> 

Fall 2: Fügen Sie jeden Teil des Rahmens als eine explizite Abhängigkeit

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>3.1.2.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>3.1.2.RELEASE</version> 
    </dependency> 
      .... other dependencies that are transitively resolved by maven 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>3.1.2.RELEASE</version> 
    </dependency> 

Welches ist die beste ist Fall 1 oder Fall 2 und warum?

Antwort

3

Es hängt davon ab, ob Sie andere Abhängigkeiten deklarieren, die dieselben Abhängigkeiten verwenden (in diesem Fall Spring). Wenn Sie nur die Abhängigkeit auf oberster Ebene benötigen, deklarieren Sie dies. Wenn Sie andere Abhängigkeiten verwenden, die auf bestimmten Versionen einer transitiven Abhängigkeit beruhen, müssen Sie dies als explizite Abhängigkeit deklarieren. Geben Sie Spring als Beispiel ein: Wenn Sie spring-webmvc deklarieren und später entscheiden, dass Sie ein weiteres Spring-Paket benötigen, sagen Sie spring-security, kann es eine gute Idee sein, alle gemeinsamen Abhängigkeiten explizit zu definieren, auf die sie sich verlassen Version wird in Ihrem Projekt enthalten.

Grundsätzlich deklarieren Sie alles, was Sie benötigen, eine bestimmte Version von und lassen Maven kümmern sich um den Rest, bis Sie entweder Versionen ausschließen oder bestimmte Versionen deklarieren müssen. Dafür ist maven geschaffen, also lass es die Abhängigkeiten verwalten, bis es eine falsche Entscheidung trifft.

+0

Der Wunsch, dass die gängigen Open-Source-Java-Projekte nicht verrückt wurden, weil sie in zu viele Module zerbrachen. Nur um all diese Module sowieso in Ihre Anwendung einbinden zu müssen, denn alles braucht sie sowieso. – ams

1

Ich denke, # 1 ist besser, da von den offiziellen docs klar ist, dass spring-webmvc, an dem all Federmodule abhängig ist.

<!-- 
    Spring MVC for Servlet Environments (depends on spring-core, spring-beans, spring-context, spring-web) 
    Define this if you use Spring MVC with a Servlet Container such as Apache Tomcat (org.springframework.web.servlet.*) 
--> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-webmvc</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 

Sie können auch einen Blick auf diepom nehmen, um zu sehen, dass alle Abhängigkeiten für spring-webmvc auf der gleichen Version abhängen, wie es eingeschaltet ist.

Daher sehe ich keine Notwendigkeit, sie explizit in Ihrem Pom zu deklarieren, zumindest für diesen Anwendungsfall.

Verwandte Themen