2017-02-23 44 views
0

我剛剛在與Maven和依賴JAR版本的問題。我創建了以下項目來分析問題。行家依賴版本問題

  1. 我創建了使用spring 4.2.9的App_1.jar。
  2. 我創建了使用Spring版本4.3.4 App_2.jar。
  3. 我創建了使用Spring版本4.3.6 App_3.jar。
  4. 我創建App_Main.war將App_1.jar,App_2.jar,App_3.jar。

據行家,如果你使用不同的版本,它會使用最新的一個,但我的情況下,它使用的jar春天的版本,我包括第一是App_1.jar且版本4.2.9。

這是代碼。

**App_1 POM.xml** 

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
     <modelVersion>4.0.0</modelVersion> 
     <groupId>com.ksh</groupId> 
     <artifactId>App_1</artifactId> 
     <packaging>jar</packaging> 
     <version>1.0</version> 
     <name>App_1</name> 
     <url>http://maven.apache.org</url> 
     <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.2.9.RELEASE</version> 
     </dependency> 
     </dependencies> 
    </project> 

**App_2 POM.xml** 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.ksh</groupId> 
    <artifactId>App_2</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0</version> 
    <name>App_2</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.3.4.RELEASE</version> 
    </dependency> 
    </dependencies> 
</project> 

**App_3 POM.xml** 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.ksh</groupId> 
    <artifactId>App_3</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0</version> 
    <name>App_3</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.3.6.RELEASE</version> 
    </dependency> 
    </dependencies> 
</project> 

App_Main POM.xml 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>App_Main</artifactId> 
    <packaging>war</packaging> 
    <version>1.0</version> 
    <name>App_Main Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>com.ksh</groupId> 
     <artifactId>App_1</artifactId> 
     <version>1.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.ksh</groupId> 
     <artifactId>App_2</artifactId> 
     <version>1.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.ksh</groupId> 
     <artifactId>App_3</artifactId> 
     <version>1.0</version> 
    </dependency> 
    </dependencies> 
    <build> 
    <finalName>App_Main</finalName> 
    </build> 
</project> 
+0

的Maven不會自動選擇最新的版本。你從哪裏讀到的?它會選擇任何它認爲「的依賴關係樹最近的」:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html(** Maven的2.0僅支持使用「最近的定義」這意味着它將在依賴關係樹中使用最接近依賴項的版本**) –

+0

我在這個線程中讀到了這個版本。 http://stackoverflow.com/questions/4312553/maven-assembly-add-different-version-of-the-same-artifact – KSHiTiJ

回答

2

你在哪裏閱讀maven使用最新的?

對於transitives依賴關係Maven使用「的最近贏」的策略,以解決版本衝突,這意味着它會在依賴關係樹使用最接近的依賴項的版本到您的項目。

Maven transitive dependencies

一個可能的解決方案是使用<dependencyManagement>解決您的衝突。

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>spring_context_version_you_want_to_use</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Maven dependency managament

您可以檢查您用命令的依賴性樹:

mvn dependency:tree -Dverbose -Dincludes=your-jar 

Resolving conflicts using the dependency tree