qq_16237125 2021-11-12 15:48 采纳率: 60%
浏览 83
已结题

maven 项目打包成可执行jar包的时候 报错 cannot find symbol

MAVEN 工程A 依赖 MAVEN 工程B

工程B 已经install在本地Maven repo 中了,eclipse 没有报错,是能够找到工程B的class 文件,但是打包的时候就报错
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project service-provider: Compilation failure: Compilation failure:
[ERROR] /xxxxx/oservice/service-provider/src/main/java/com/xxx/service/provider/SchoolServiceImpl.java:[15,17] cannot find symbol
[ERROR] symbol: class SchoolMapper
[ERROR] location: class zzz.xxx.service.provider.SchoolServiceImpl
[ERROR] /services/microservice/xxx-service-provider/src/main/java/com/xxx/service/provider/SchoolServiceImpl.java:[18,16] cannot find symbol

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <createDependencyReducedPom>false</createDependencyReducedPom>
                </configuration>
                
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.greatschools.service.provider.App</mainClass>
                                </transformer>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.handlers</resource>
                                </transformer>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>META-INF/spring.schemas</resource>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

  • 写回答

3条回答 默认 最新

  • qq_16237125 2021-11-12 20:55
    关注

    原因分析:
    spring-boot-maven-plugin打包出来的jar是不可依赖的

    我们现在整合后的maven项目有一个parent工程,打包类型为pom,下面多个spring-boot工程作为它的module,分别为base和moduleA,moduleB。假如moduleA依赖于base。如果你在base中使用了spring-boot-maven-plugin的默认配置build,或者在parent工程中使用spring-boot-maven-plugin的默认配置build。那么在clean package的时候会发现moduleA找不到base中的类。原因就是默认打包出来的jar是不可依赖的。

    解决方案:

        官方告诉我们,你如果不想移代码,好吧,我这样来给你解决,给你打两个jar包,一个用来直接执行,一个用来依赖。于是,你需要指定一个属性classifier,这个属性为可执行jar包的名字后缀。比如我设置<classifier>exec</classifier>,原项目名为Vehicle-business。那么会得到两个jar:Vehicle-business.jar和Vehicle-bussiness-exec.jar
    
         官方文档位置:84.5 Use a Spring Boot application as a dependency
    
         总结:回到聚合maven上,如果你在parent工程中使用了spring-boot-maven-plugin作为builder,那么你的依赖module一定要用解决方案二来设置。否则你不在parent工程中用spring-boot-maven-plugin作为builder,而在需要打包的module上使用。
    

    一般parent工程的maven插件配置如下:

    org.springframework.boot spring-boot-maven-plugin <source />1.8 1.8 repackage 被依赖的maven子模块的maven插件配置如下(其余maven子模块就不需要配置): org.springframework.boot spring-boot-maven-plugin exec

    ————————————————
    版权声明:本文为CSDN博主「DamonREN」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/DamonREN/article/details/85091900

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月20日
  • 已采纳回答 11月12日
  • 修改了问题 11月12日
  • 创建了问题 11月12日

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?