springboot项目打包时提示“程序包xxx不存在,找不到符号”

springboot多包工程,在使用maven进行打包的时候,一直提示“程序包xxx不存在,找不到符号”,但项目是可以正常启动运行的,开始一直以为是maven哪里没有配置好导致的,后来才发现原来是springboot的maven插件导致的。

xxx-parent:顶级父工程

xxx-a:子项目1

xxx-b:子项目2

xxx-c:子项目3

依赖关系:
a -> b -> c,从左到右,依次被依赖(c依赖b,b依赖a)

问题场景:

在使用mvn package的时候,一直提示“程序包xxx不存在,找不到符号”,开始以为是依赖的上层包没打好,仔细检查后发现都没问题,就算将本地仓库中的依赖包清理之后,重新install打包也还是有这个问题

原因分析:
因为之前的springmvc出现过类似的问题(Maven打包失败,提示“找不到符号”),所以一开始也以为是本地仓库的缓存所致,浪费了好长时间,后来才发现原来是springboot自身的编译插件spring-boot-maven-plugin导致的。

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

如上,就是springboot的maven插件,用这个插件打包的Jar包可以直接运行,但是不可依赖!

为什么会提示程序包不存在呢?
你的A模块是一个spring boot项目,创建生成的pom的中肯定是这样的build的


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

emmm...使用了spring boot的build plugin。这时候A模块install到仓库的jar包是什么样子的呢?

是的,模块A已经按照spring boot的启动机制调整了目录结构,模块B找不到模块A的类了。
临时解决方案
尝试把模块A的pom中build部分的spring boot plugin去掉
注释掉之后,重新install模块A,再看jar包结构

这才是一个最普通不过的jar包,这时候再去install模块B,肯定不会报找不到程序包的错了。

更好的解决方案

假如我的模块A也是要运行的一个应用,那每次都要修改pom打两次包吗?
并不。再次修改模块A的pom,改为如下配置


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

install模块A,查看仓库jar包。

可以看到仓库里生成了两个jar包。

看jar包大小很容易可以猜到。

上面是普通的jar包,下面名称带exec的是一个可以直接运行的spring boot的jar包。

依赖还是那个依赖,要运行就把exec拿出来java -jar!

posted @ 2024-03-20 15:21  kisshappyboy  阅读(188)  评论(0编辑  收藏  举报