您的当前位置:首页正文

踩坑:maven打包失败的解决方式总结

2024-11-26 来源:个人技术集锦

虽然编程好多年了,有时候还是会遇到maven打包失败的问题。现在把Maven打包失败原因总结如下:

失败原因1:无法使用spring-boot-maven-plugin插件

使用spring-boot-maven-plugin插件可以创建一个可执行的JAR应用程序,前提是应用程序的parent为spring-boot-starter-parent。

需要添加parent的包spring-boot-starter-parent

<!-- 版本选当时的版本 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.6.RELEASE</version>
    <relativePath/>
</parent>

在多模块依赖时,若parent包不是的spring-boot-starter-parent,而是自己定义的包,则应该在插件中添加如下配置:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

失败原因2:包无法被依赖

根据官网的说法,直接生成的包是可执行的jar包,可执行jar包无法被依赖。

通过解压缩jar包,可以看到可执行的jar包有BOOT-INF和META-INF文件夹,可被依赖的jar包无BOOT-INF文件夹,只含有META-INF文件夹。
通过以下配置生成两个jar包,可以被依赖。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

报错:程序包xxx不存在!

失败原因3:在子模块中执行打包命令,而不是执行的父模块的插件

例如:各模块的依赖结构如下

  • generic-admin //管理员模块
  • generic-common //公共模块
  • generic-security //安全模块
  • generic-pom //父模块

管理员模块依赖安全模块,安全模块依赖公共模块,他们都有父模块。

有的人在子模块中也添加了插件,若在子模块中执行打包命令,只能打包单独的模块,会出现程序包不存在的报错。

<!--插件配置-->
<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>
    <configuration>
        <classifier>exec</classifier>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

失败原因4:IDEA配置文件错误

有时从别的地方克隆一个SpringBoot项目,或者在自己电脑或公司电脑拉取相同的项目代码,并且使用Maven编译也通过了,奇怪的是当Build Project时却提示包不存在,或符号不存在 。

明明文件就在对应的地方,检查maven依赖也没问题,这时很可能是IDEA配置文件错了。

因此,需要重新生成IDEA的配置文件。

mvn idea:idea

在如图的右上角调出mvn的终端,输入mvn idea:idea命令,它会根据pom文件重新生成对应的IDEA配置文件(.iml)

听说这个是IDEA 2020.1版本特有的问题。

失败原因5:IDEA和maven版本不适配

有可能在mvn idea:idea命令执行后,项目还是启动不了。

依然是明明文件就在对应的地方,提示包不存在,或符号不存在 。

如果这都没解决,可以尝试清理下缓存,在左上角“Invalidate and Restart”重启IDEA。

依然报错的话,有可能是IDEA版本问题!

这时候可以尝试IDEA勾选"delegate IDE build/run actions actions to Maven",将编译托管给maven来解决。但是,每次项目运行时,会默认编译所有模块,效率奇差无比,启动非常慢。

其实这个就是IDEA版本与Maven之间存在的问题,依然是IDEA的版本是2020版会出现的问题。2020版的IDEA是无法导入MAVEN工程的jar包的,所以就需要我们强制的进行导入。

如果你细心,你就会发现2020版的IDEA上是没有File → Settings → Importing → Import Maven projects automatically → OK这个路径的。也建议使用更高版本的IDEA。


最后,生成jar包后,执行命令启动

nohup java -jar  xxx.jar &
显示全文