2016-06-22 45 views
4

我正在研究一個將包含在其他項目(項目B,項目C ...)中的彈簧引導項目(項目A)。我在項目A中有幾個依賴項,但在導入項目A的項目中,可能需要一些或者只有一個。 我試圖找到一種方法來排除罐子依賴項,同時打包項目A,以便運行期間項目B提供所需的項目。當項目A獨立運行用於測試目的時,我想要有可用的依賴項。spring-boot:排除對包裝的依賴關係

已經嘗試過以下

我已經嘗試使用:

<scope>provided</scope> 
<optional>true</optional> 

還有罐子最終神器結束。

還試圖加入以下彈簧引導Maven的插件

  <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
       <executions> 
        <execution> 
         <goals> 
          <goal>repackage</goal> 
         </goals> 
         <configuration> 
          <excludeArtifactIds>spring-boot-starter-redis</excludeArtifactIds> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 

這只是取下彈簧引導的依賴,但這種依賴的孩子們的罐子仍然會在結束最終的神器。

回答

6

在我們目前的項目中,我們必須創建的應用程序,它具有在JEE服務器中部署WAR文件的要求。 war文件必須只包含所需的jar文件,不包括JEE服務器已經提供的任何API或實現。

但是,爲了測試目的,我們希望保留生成Boot默認提供的可執行war或jar文件的可能性。

爲了實現它,我們設置了所有可選的依賴關係,如提供的。例如,我們在開發中使用了一些直接的依賴項,比如JDBC驅動程序,我們不想將其包含在部署的war文件中。還有一些引導主要起始者提供了我們在JEE服務器中不需要的其他起始者和庫的依賴關係。這是spring-boot-starter-tomcatspring-boot-starter-jdbc starter的情況。在我們的項目,我們有我們的的pom.xml文件followind依賴性:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-tomcat</artifactId> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-jdbc</artifactId> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>com.oracle</groupId> 
    <artifactId>ojdbc7</artifactId> 
    <scope>provided</scope> 
</dependency> 

這樣,那些依賴關係將不會被包括在原來的jar/war文件,但春季啓動Maven插件將包括他們在lib提供的文件夾中重新打包的jar/war。

這些依賴關係不會被JEE服務器看到,但會使打包的應用程序比需要的更大。解決的辦法是告訴春季啓動Maven插件創建使用其他名稱重新打包文件,以及不包括開發工具:

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <configuration> 
     <mainClass>${start-class}</mainClass> 
     <classifier>exec</classifier> 
    </configuration> 
</plugin> 

這樣Maven會爲應用程序生成兩個包:

  • 默認的jar/war包,沒有提供的所有依賴項。
  • 重新包裝的文件,其名稱與_exec.jar /結束的.war,與在LIB-提供文件夾和所有支持的依賴提供運行與Java的罐子文件

在應用程序您可以使用相同的技術來生成包含在項目B中的項目A的包,並將項目A的包作爲獨立運行。

如果您不需要爲Project A創建自行運行的軟件包,並且只在IDE中測試它,則甚至可以從pom.xml中刪除spring boot maven插件

+0

我使用了你使用指定的方法並解決了我的問題。這將創建** artifact-exec.jar **和** artifact.jar **,其中** artifact.jar **可用作庫和** artifact-exec.jar **可用於運行獨立。 乾淨的解決方案,沒有任何黑客砰文件。 謝謝Cèsar:) – Sandheep

-1

內B項目的pom.xml您可以執行以下操作:

<dependencies> 
    .... 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>projectA</artifactId> 

     <exclusions> 
      <exclusion> 
       <groupId>com.foo.bar</groupId> 
       <artifactId>baz</artifactId> 
      </exclusion> 
      .... 
     </exclusions> 
    </dependency> 
    ..... 
    </dependencies> 
+0

感謝您的提示。但我已經意識到,這項排除可以在項目B上完成。我想看看在項目A本身的包裝過程中是否有辦法實現這一點。希望減輕從實施項目中排除不需要的依賴的負擔。具有標記的範圍不應包含最終制品中的罐子。想要檢查它的一些重寫是否完全由spring-boot-maven-plugin – Sandheep

+1

完成,根據http://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/exclude-dependency.html你只排除工件,但不排除它的傳遞依賴 – WeMakeSoftware