spring-boot:排除对包装的依赖性

时间:2016-06-22 07:48:46

标签: java spring maven spring-boot

我正在开发一个春季启动项目(项目A),该项目将包含在其他项目中(项目B,项目C ......)。我在项目A中有几个依赖项,但在导入项目A的项目中,可能需要一些或仅一个。 我正在尝试找到一种方法来在打包项目A时排除jar依赖项,以便在运行时由Project B提供所需的依赖项。我希望在项目A独立运行以进行测试时可以使用依赖项。

已经尝试过以下

我尝试过使用:

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

最后的神器仍然是罐子。

还尝试将以下内容添加到spring-boot-maven-plugin

           <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>

这只会删除spring-boot依赖项,但是这个依赖项的子项的jar仍然会在最终的工件中结束。

2 个答案:

答案 0 :(得分:8)

在我们当前的项目中,我们需要为应用程序创建war文件,该文件必须部署在JEE服务器中。 war文件必须只包含所需的jar文件,不包括JEE服务器已经提供的任何API或实现。

但是,出于测试目的,我们希望保留生成Boot默认提供的可执行war或jar文件的可能性。

为了实现它,我们将所有可选依赖项设置为提供。例如,我们在开发中使用了一些直接依赖项,比如JDBC驱动程序,我们不希望包含在已部署的war文件中。还有一些启动主启动器,它们与JEE服务器中不需要的其他启动器和库提供依赖关系。这是 spring-boot-starter-tomcat spring-boot-starter-jdbc 启动器的情况。在我们的项目中,我们在 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文件中,但是spring boot maven插件会将它们包含在重新打包的jar / war的 lib-provided 文件夹中。 / p>

JEE服务器不会看到这些依赖项,但会使打包的应用程序大于需要。解决方案是告诉spring boot 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-provided 文件夹中,并支持使用 java -jar file <运行应用程序/ em>的

在您的情况下,您可以使用相同的技术来生成要包含在项目B中的项目A的包,以及项目A的包作为独立运行。

如果您不需要为项目A创建要自行运行的程序包,并且只在IDE中测试它,您甚至可以从 pom.xml中删除spring boot maven插件

答案 1 :(得分:-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>