
本文旨在解决spring boot项目在作为其他项目的依赖库时,默认打包方式(含boot-inf目录)不兼容的问题。通过结合使用maven assembly插件生成包含所有依赖的jar包,并巧妙配置spring boot maven插件以跳过其默认行为,我们将指导您构建一个标准、自包含且可被其他项目轻松导入的jar文件,同时提供详细的配置示例和注意事项。
Spring Boot项目通常使用spring-boot-maven-plugin来打包成可执行的“胖JAR”(Fat JAR)。这种JAR包包含所有项目代码、资源以及其所有依赖,并具有一个特殊的BOOT-INF目录结构,其中包含了应用程序的类和依赖库。这种结构非常适合独立运行的应用程序,但当您尝试将此类JAR作为另一个Maven或Gradle项目的依赖项导入时,通常会遇到问题,因为其内部结构不符合标准的库JAR规范,导致类加载或依赖解析失败。
为了解决这个问题,开发者有时会尝试使用maven-assembly-plugin并配置jar-with-dependencies描述符。然而,如果spring-boot-maven-plugin仍然处于活跃状态,它可能会干扰Assembly插件的输出,导致生成两个JAR包:一个不包含依赖的标准JAR,以及一个仍然带有BOOT-INF结构的JAR,或者一个虽然包含依赖但结构不理想的JAR。本教程将展示如何正确配置,以生成一个单一的、自包含且可导入的库JAR。
要成功地将Spring Boot项目打包为可导入的依赖库,核心策略是:利用Maven Assembly插件来聚合所有依赖,同时禁用或跳过Spring Boot Maven插件的默认打包行为。
maven-assembly-plugin是Maven社区中用于创建自定义打包文件的强大工具。通过使用jar-with-dependencies描述符,它可以将项目的所有编译类和其所有运行时依赖项打包到一个单一的JAR文件中。
在项目的pom.xml文件中,添加以下配置:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.4.2</version> <!-- 建议使用最新稳定版本 -->
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>解释:
spring-boot-maven-plugin是Spring Boot项目默认用于构建可执行JAR的插件。它的默认行为会生成带有BOOT-INF目录的JAR,这正是我们作为库使用时需要避免的。为了防止它干扰Assembly插件或生成不必要的额外JAR,我们需要明确地跳过它的执行。
在pom.xml的<build><plugins>部分,找到spring-boot-maven-plugin的配置(如果它存在,通常由Spring Boot Starter Parent引入),并添加<configuration><skip>true</skip></configuration>:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip> <!-- 关键:跳过Spring Boot Maven插件的执行 -->
</configuration>
</plugin>
<!-- 其他插件,如maven-assembly-plugin -->
</plugins>
</build>解释:
当项目被用作一个库时,它不再需要一个main方法来启动自身。因此,包含@SpringBootApplication注解和SpringApplication.run()调用的启动类变得多余。移除这些代码可以使项目更纯粹地作为库存在,并避免潜在的混淆。
例如,如果您的项目中有一个类似以下的类:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}您可以安全地将其删除,或者至少移除main方法和@SpringBootApplication注解,将其转换为一个普通的配置类或组件类,如果它承载了其他业务逻辑。
结合上述所有更改,您的pom.xml的<build>部分应如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version> <!-- 根据您的项目版本调整 -->
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>my-spring-boot-library</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <!-- 确保打包类型为jar -->
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<!-- 您的项目依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 其他Spring Boot starters或自定义依赖 -->
</dependencies>
<build>
<plugins>
<!-- 配置Maven Assembly插件来生成包含所有依赖的JAR -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.4.2</version> <!-- 建议使用最新稳定版本 -->
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 跳过Spring Boot Maven插件的执行,避免生成可执行JAR和BOOT-INF结构 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>完成pom.xml的修改后,您可以通过以下Maven命令进行构建:
mvn clean package
执行此命令后,在项目的target目录下,您将找到一个名为my-spring-boot-library-0.0.1-SNAPSHOT-jar-with-dependencies.jar(名称会根据您的artifactId和version变化)的JAR文件。这个JAR文件将包含您项目的所有编译类以及其所有传递性依赖,并且没有BOOT-INF目录结构,可以直接作为普通库依赖导入到其他项目中。
通过本教程,您应该已经掌握了如何将一个Spring Boot项目成功打包成一个标准的、包含所有依赖的JAR文件,使其能够作为其他项目的依赖库来使用。关键在于理解spring-boot-maven-plugin的默认行为,并通过maven-assembly-plugin来生成目标JAR,同时禁用Spring Boot插件的打包过程。遵循这些步骤,将有助于您更灵活地管理和重用Spring Boot模块。
以上就是Spring Boot项目作为可导入依赖JAR包的构建指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号