2016-06-22 43 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