当前位置: 首页 > news >正文

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 中声明依赖。

  1. 安装驱动到本地仓库
    执行以下命令(替换实际路径和版本):

    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
    
  2. 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。

  1. 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>
    
  2. 重新打包并验证

    mvn clean package
    

3. 检查驱动类名和注册方式

如果驱动包已正确打包,但依然报错,需确认以下两点:

3.1 驱动类名是否正确

在代码或配置中检查驱动类名是否为 com.oscar.Driver,确保与实际的驱动类名一致(某些驱动可能类名不同)。

3.2 是否显式注册驱动(可选)

在 Spring Boot 的 application.propertiesapplication.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. 验证步骤

  1. 重新打包:mvn clean package
  2. 解压 JAR,检查 BOOT-INF/lib/ 下是否有驱动 JAR。
  3. 运行 JAR:java -jar your-app.jar

常见问题总结

问题原因解决方案
驱动包未被打包通过 Maven 本地依赖或资源插件配置强制包含 JAR
驱动类名错误检查并修正 spring.datasource.driver-class-name
驱动未显式注册在配置文件中指定驱动类

如果问题仍未解决,可以检查驱动包是否与当前 Java 版本和 Spring Boot 版本兼容。

相关文章:

  • C++ 二叉树代码
  • 机器分类的基石:逻辑回归Logistic Regression
  • React Portals深度解析:突破组件层级的渲染艺术
  • 计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)
  • 原生AJAX和jQuery的Ajax区别
  • xss自动化扫描工具-DALFox
  • Linux:程序翻译
  • 常见报错及解决方案
  • 自然语言处理:文本表示
  • Android应用开发面试题
  • 深度解析Ant Design Pro 6开发实践
  • Flink怎么搞CDC?
  • 哈工大 计算机组成原理 第四章 存储器(上)笔记
  • vue3学习-1(基础)
  • Electron + Vite + React + TypeScript 跨平台开发实践指南
  • 代码随想录算法【Day61】
  • Python大数据处理实验报告(二)
  • 2.数据结构:3.合并集合
  • C语言:51单片机 基础知识
  • 不能初始化photoshop,因为暂存盘已满
  • 幼儿园教师拍打孩子额头,新疆库尔勒教育局:涉事教师已被辞退
  • 遭车祸罹难的村医遇“身份”难题:镇卫生院否认劳动关系,家属上诉后二审将开庭
  • 金融月评|尽早增强政策力度、调整施策点
  • 四个“从未如此”使巴以加沙战火绵延时间创下历史之最
  • 山东:小伙为救同学耽误考试属实,启用副题安排考试
  • 从《让·桑特伊》到《追忆》,假故事的胜利