springboot项目Maven打包遇到的问题总结
java -jar 执行报错中没有主清单属性
Spring Boot的可执行JAR需要依赖该插件生成正确的主清单属性。在 pom.xml 的 部分添加以下配置:
<build>
<plugins>
<!-- 必须配置此插件才能生成可执行的Spring Boot JAR -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version> <!-- 版本与Spring Boot一致 -->
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 关键:重新打包为可执行JAR -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
我本地resource的lib包下引入了数据库的xxx的驱动包,idea运行正常,为什么打的包运行报错java.sql.SQLException: com.xxx.Driver
在 Spring Boot 项目中,如果本地手动引入第三方驱动包(如神通数据库的 oscar
驱动),但在 IDEA 中运行正常、打包后运行报 java.sql.SQLException: com.oscar.Driver
错误,通常是因为 驱动类未正确加载到打包后的 JAR 中。以下是完整的排查和解决方案:
1. 确认驱动包是否被打包到 JAR 中
步骤 1:解压生成的 JAR 文件
通过以下命令解压 JAR 文件(将 your-app.jar
替换为实际名称):
jar -xvf your-app.jar
进入解压后的目录,检查 BOOT-INF/lib/
下是否有 oscar
驱动的 JAR 文件(如 oscar-jdbc-x.x.x.jar
)。
结果分析:
- 如果不存在:驱动包未被正确打包,需修改 Maven 配置。
- 如果存在:驱动类名或注册方式有误,需检查代码配置。
2. 解决方案:确保驱动包被打包
方法一:通过 Maven 本地依赖引入(推荐)
将本地的 oscar
驱动 JAR 安装到 Maven 本地仓库,并在 pom.xml
中声明依赖。
-
安装驱动到本地仓库
执行以下命令(替换实际路径和版本):mvn install:install-file \ -Dfile=src/main/resources/lib/oscar-jdbc-x.x.x.jar \ -DgroupId=com.oscar \ -DartifactId=oscar-jdbc \ -Dversion=x.x.x \ -Dpackaging=jar
-
在
pom.xml
中添加依赖<dependency> <groupId>com.oscar</groupId> <artifactId>oscar-jdbc</artifactId> <version>x.x.x</version> </dependency>
方法二:通过 system
作用域直接引入本地 JAR
在 pom.xml
中直接引用本地 JAR(需确保路径正确):
<dependency>
<groupId>com.oscar</groupId>
<artifactId>oscar-jdbc</artifactId>
<version>x.x.x</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/oscar-jdbc-x.x.x.jar</systemPath>
</dependency>
方法三:配置资源插件强制打包 lib
目录
如果驱动包位于 src/main/resources/lib/
,需确保 Maven 资源插件将其复制到 target/classes/lib/
,并配置 spring-boot-maven-plugin
包含这些 JAR。
-
在
pom.xml
中添加资源插件配置<build> <plugins> <!-- 资源插件:复制 resources/lib 到 target/classes/lib --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>copy-lib</id> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/classes/lib</outputDirectory> <resources> <resource> <directory>src/main/resources/lib</directory> <filtering>false</filtering> </resource> </resources> </configuration> </execution> </executions> </plugin> <!-- Spring Boot 打包插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 确保包含 lib 目录中的 JAR --> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> </plugins> </build>
-
重新打包并验证
mvn clean package
3. 检查驱动类名和注册方式
如果驱动包已正确打包,但依然报错,需确认以下两点:
3.1 驱动类名是否正确
在代码或配置中检查驱动类名是否为 com.oscar.Driver
,确保与实际的驱动类名一致(某些驱动可能类名不同)。
3.2 是否显式注册驱动(可选)
在 Spring Boot 的 application.properties
或 application.yml
中配置驱动类:
# 替换为实际的驱动类名
spring.datasource.driver-class-name=com.oscar.Driver
spring.datasource.url=jdbc:oscar://host:port/database
spring.datasource.username=your-username
spring.datasource.password=your-password
4. 完整示例 pom.xml
<?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>3.1.0</version>
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 神通数据库驱动(方法一或二) -->
<dependency>
<groupId>com.oscar</groupId>
<artifactId>oscar-jdbc</artifactId>
<version>x.x.x</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 资源插件:打包本地 JAR -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-lib</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<resources>
<resource>
<directory>src/main/resources/lib</directory>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<!-- Spring Boot 打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5. 验证步骤
- 重新打包:
mvn clean package
。 - 解压 JAR,检查
BOOT-INF/lib/
下是否有驱动 JAR。 - 运行 JAR:
java -jar your-app.jar
。
常见问题总结
问题原因 | 解决方案 |
---|---|
驱动包未被打包 | 通过 Maven 本地依赖或资源插件配置强制包含 JAR |
驱动类名错误 | 检查并修正 spring.datasource.driver-class-name |
驱动未显式注册 | 在配置文件中指定驱动类 |
如果问题仍未解决,可以检查驱动包是否与当前 Java 版本和 Spring Boot 版本兼容。