解决Spring Boot 使用Maven打包之后运行jar找不到主属性清单的问题

本文介绍了在使用Maven打包SpringBoot项目时遇到的问题及解决方法。主要问题是运行生成的jar包时报错找不到主类,通过调整pom.xml文件中的spring-boot-maven-plugin插件设置并启用repackage目标来解决。

问题描述 在Spring boot项目中采用maven打包,运行jar报 找不到主属性清单 这个时候怀疑是在不到 Main 因而编辑

MANIFEST.MF 加入 如下键值对

Main-Class: com.test.Main

再次运行,结果报 找不到或无法加载主类com.test.Main

因而怀疑Spring Boot使用了代理类作为程序的主入口

因而搜索Spring Boot的解决办法 如下:(注释的部分为之前的配置)

 <build>
        <finalName>batman-web</finalName>
        <plugins>
           <!-- <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
               <!-- <version>${spring-boot.version}</version>-->
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

再次 mvn clean package  问题解决  后来查看 MANIFEST.MF 发现里面的主类如下:

Main-Class: org.springframework.boot.loader.JarLauncher

<think>首先,用户的问题是关于如何在使用 spring-boot-maven-plugin 的情况下解决打包Jar不到主属性问题。用户提到了引用[1]、[2]和[3],这些引用描述了打包相关的问题,特别是关于动态编译和依赖打包问题。 用户的核心问题是:使用 spring-boot-maven-plugin 是否能解决打包Jar不到主属性问题?可行性如何? 关键点: - 主属性问题指的是 Jar 包缺少 Main-Class 属性,这使得 Jar无法作为可执行文件运行(java -jar)。 - spring-boot-maven-plugin 通常用于 Spring Boot 项目,它会自动设置 Main-Class 并创建可执行的 Jar 包(fat Jar)。 现在,分析使用该插件的可行性: 1. 在标准 Maven 项目中,可以使用 maven-jar-plugin 来指定。 2. 通过配置 maven-jar-plugin,可以设置 manifest 属性,包括 Main-Class。 3. 这样创建的 Jar是 fat Jar(即包含依赖),所以需要手动管理依赖使用其他方式处理依赖。 步骤: - 在 pom.xml 中添加 maven-jar-plugin 配置。 - 在 <archive> 部分设置 <manifest>,指定 Main-Class。 - 确保存在且正确。 示例配置: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>com.example.MainApp</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> ``` 可行性: - 完全可行。这是标准 Java 应用打包的方式。 - 但缺点是:如果项目有依赖项,这个 Jar会包含它们,用户需要确保路径上有所有依赖。 - 为解决依赖问题,可以: - 使用 maven-assembly-plugin 创建包含依赖的 fat Jar。 - 使用 maven-shade-plugin 做似处理。 - 通过 maven-dependency-plugin 复制依赖到某个目录,然后在运行时指定路径。 用户提到引用[3]是关于使用 classifier 来分离可执行和可依赖的 Jar,但在使用 spring-boot-maven-plugin 的情况下,我们可以直接配置标准插件。 引用分析: - 引用[1] 描述了动态编译问题,与主属性无关。 - 引用[2] 提到了多个插件,包括 maven-jar-plugin 和 maven-dependency-plugin。 - 引用[3] 是关于 spring-boot-maven-plugin 的配置,直接相关。 - 引用[4] 是关于积木报表的,无关。 所以,应基于标准 Maven 插件来回答。 回答结构: 1. 直接回答问题:是的,使用 spring-boot-maven-plugin 是可以解决的,而且是可行的。 2. 解释原因:通过标准 Maven 插件如 maven-jar-plugin 指定。 3. 提供配置示例。 4. 讨论潜在问题:依赖管理。 5. 建议替代方案如果依赖是问题生成相关问题: 1. 使用 spring-boot-maven-plugin 时如何管理依赖项? 2. 如何配置 Maven 来创建可执行的瘦 Jar 包? 3. 在非 Spring Boot 项目中打包可执行 Jar 的最佳实践是什么? 4. 如果 Jar 包缺少依赖,运行时会发生什么错误? 确保回答清晰、可靠: - 使用中文。 - 引用相关部分自然添加标识。 - 结构化。 </think>### 使用 `spring-boot-maven-plugin` 解决 Jar不到主属性的可行性分析 是的,**使用 `spring-boot-maven-plugin` 仍然可以解决打包Jar不到主属性(缺少 `Main-Class`)的问题,并且是完全可行的**。标准 Maven 提供了其他插件(如 `maven-jar-plugin`)来实现这一目标,无需依赖 Spring Boot 的专属插件。以下是详细分析和解决方案: #### 1. **问题本质与可行性** - **问题根源**:Jar不到主属性通常是因为 `META-INF/MANIFEST.MF` 文件中未指定 `Main-Class` 属性,导致无法通过 `java -jar` 运行。 - **可行性**:Spring Boot 的 `spring-boot-maven-plugin` 只是简化了配置流程(自动生成 `Main-Class` 和打包依赖),但并非必需。**标准 Maven 插件(如 `maven-jar-plugin`)可以独立完成配置**。 - **优势**:避免 Spring Boot 插件引入的“胖 Jar”(fat Jar问题(如 Jar 包过大依赖冲突)[^2][^3]。 #### 2. **解决方案:使用 `maven-jar-plugin`** 在 `pom.xml` 中配置 `maven-jar-plugin` 来指定: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <!-- 使用最新稳定版本 --> <configuration> <archive> <manifest> <mainClass>com.example.MainApp</mainClass> <!-- 替换为你的全限定名 --> </manifest> </archive> </configuration> </plugin> </plugins> </build> ``` - **效果**:运行 `mvn clean package` 后,生成Jar 包会包含正确的 `Main-Class`,可通过 `java -jar your-app.jar` 执行。 - **注意事项**: - 确保 `com.example.MainApp` 存在且包含 `public static void main(String[] args)` 方法。 - 此方式生成的是“瘦 Jar”(仅包含项目代码,含依赖)。 #### 3. **依赖管理问题(可选扩展)** - **瘦 Jar 的局限性**:若项目依赖第三方库,运行时需手动指定路径,例如: ``` java -cp your-app.jar:libs/* com.example.MainApp ``` - **自动化依赖处理**(如需要): - **方案一:使用 `maven-dependency-plugin` 复制依赖**: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.1</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/libs</outputDirectory> </configuration> </execution> </executions> </plugin> ``` 打包后依赖会复制到 `target/libs` 目录,配合 `maven-jar-plugin` 的 `Class-Path` 配置: ```xml <manifest> <mainClass>com.example.MainApp</mainClass> <addClasspath>true</addClasspath> <!-- 自动生成 Class-Path --> <classpathPrefix>libs/</classpathPrefix> <!-- 指定依赖路径 --> </manifest> ``` - **方案二:使用 `maven-assembly-plugin` 创建胖 Jar**(替代 Spring Boot 插件): ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.MainApp</mainClass> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> ``` 这会生成一个包含所有依赖的胖 Jar(文件名如 `your-app-jar-with-dependencies.jar`)。 #### 4. **潜在问题与建议** - **验证步骤**:打包后检查 Jar 内容: ``` jar tf your-app.jar | grep MANIFEST.MF # 确认 Manifest 文件 unzip -p your-app.jar META-INF/MANIFEST.MF # 查看 Main-Class 是否设置 ``` - **常见错误**:若路径错误,会报 `Could not find or load main class`,需核对 `pom.xml` 中的全限定名。 - **适用场景**:适合非 Spring Boot 项目需要避免胖 Jar 开销的场景,但依赖管理需额外处理[^1][^2]。 总之,**通过标准 Maven 插件完全可行且可控**。优先使用 `maven-jar-plugin` 配置,再根据需要选择依赖管理方案。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值