如何在另一个项目中添加依赖项到Spring Boot Jar?

我有一个Spring Boot应用程序,我已经创build了一个Jar。 以下是我的pom.xml

 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-java8time</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- WebJars --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.6.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 

我想在我的其他应用程序中使用这个jar子,所以把这个jar子添加到我的应用程序。 但是当我在该Jar中调用一个方法时,它抛出了一个ClassNotFoundException

我该如何解决这个问题? 我如何添加一个依赖到Spring Boot JAR?

默认情况下,Spring Boot将JAR重新打包为一个可执行的JAR文件,并将BOOT-INF/classes所有BOOT-INF/classes以及BOOT-INF/lib所有相关库都放入到JAR中。 创build这个胖JAR的结果是,你不能再用它作为其他项目的依赖。

从自定义重新包装分类器 :

默认情况下, repackage目标将用repackage目标replace原始工件。 对于表示应用程序的模块来说,这是一种理智的行为,但是如果将模块用作另一个模块的依赖关系,则需要为重新打包的模块提供分类器。

原因是应用程序类被包装在BOOT-INF/classes因此依赖模块不能加载重新包装的jar类。

如果您想要保留原始主要工件以便将其用作依赖项,则可以在repackage目标configuration中添加一个classifier

 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.4.1.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> </configuration> </execution> </executions> </plugin> 

通过这个configuration,Spring Boot Maven Plugin将创build2个JAR文件:主文件将和通常的Maven项目一样,而第二个将会附加分类器,并成为可执行的JAR文件。

@Tunaki说的大部分是正确的,但是根据你原来的问题,缺less的一部分是:

这抛出ClassNotFoundException。 弹簧启动应用程序中使用的外部jar子丢失。

这是由于从Maven包装创build的FatJAR具有在特定位置指定的依赖库,这些库用于Spring Boot如何执行应用程序。 如果只是将JAR添加到另一个应用程序的类path中,则应该执行@Tunaki所说的内容,并将相关的JAR文件包含到类path中。 处理这个问题的最好方法是使用专门针对dependency:copy-dependencies的Maven Dependency Plugin dependency:copy-dependencies mojo将所有依赖项下载到一个文件夹中,然后在编译其他应用程序时将其指定为库path。

您可以设置您的项目,以便批处理启动器依赖于一个jar,它将与您的其他应用程序共享。

换言之,根据您的初始要求:

我想在我的其他应用程序中使用这个jar子,所以把这个jar子添加到我的应用程序。

假设你的jar是你的项目A,你的应用程序是你的项目B.

现在,我build议,你是从A中删除启动部分; 那么你把它放到一个新的C项目中,那样就可以embeddedSpring Boot了,那几乎完全依赖于A.

那么,因为A现在是一个简单的jar,所以B可以用它作为依赖。