一个 springboot 项目, 我想让它扫描依赖里面的组件, 所以用了 @ComponentScan 注解指定了几个包名 同样的代码我在 idea 里直接运行 Application 是能正常识别到依赖里的组件并正常运行. 但是用 maven 打包成 jar 包后运行却没有扫描到依赖里的组件. 这个 jar 包将近 1G 大小, 并且解压后我要的那些依赖也有包含在 jar 包里 然后我试着把 springboot 日志级别改为 debug, 发现同样在 scanCandidateComponents 阶段, 在 idea 里直接运行时日志会打印出很多组件(包含我想要的组件和不想要的组件都有), 但运行 jar 包的时候却只打印出主包里面的组件 这个有没有人遇到过, 怎么处理 [main] DEBUG o.s.c.a.ClassPathBeanDefinitionScanner - [scanCandidateComponents,435] - Identified candidate component class:
终于搞清楚原因, 给遇到相同问题的人: 是因为这些依赖用的插件是maven-compiler-plugin, 改成maven-compiler-plugin就正常了
依赖原来的插件 <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> 改成这个 <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> </plugins>
![]() | 1 Ashe007 2024-06-14 08:19:10 +08:00 via iPhone 问题没描述清楚吧?如果你所称的依赖是本地 sdk 的话,需要你 Maven 打包方式显式声明域 system scope 其他情况没有思路 |
2 JamesMackerel 2024-06-14 08:38:26 +08:00 via iPhone unzip 出来看看到底有没有。 |
![]() | 3 nekomiao 2024-06-14 08:48:21 +08:00 一楼说的对 |
![]() | 4 xiangyuecn 2024-06-14 09:20:06 +08:00 吐槽一下 把 jar 打包进 jar 不知道是哪个人才想出来的 1MB 不到的业务逻辑 改一个字节 就得打包出全新的 1GB jar 放哪都不好使 |
5 ZZ74 2024-06-14 09:31:58 +08:00 @xiangyuecn 因为这样最无脑方便。 |
6 sunrealzhang 2024-06-14 11:23:17 +08:00 打包的问题吧,包里 classpath 之类的文件有包含你的那些依赖包吗 |
7 5bb864e1fc775087 OP @sunrealzhang “包里 classpath 之类的文件” 你这句话指的是 jar 包解压出来后里面的这个文件么:BOOT-INF/classpath.idx 那是有的,里面有这样的语句,hh-basic-3.6.3.jar 就是我要的依赖: - "BOOT-INF/lib/hh-basic-3.6.3.jar" |
8 5bb864e1fc775087 OP @JamesMackerel 解压过了,里面有我要的 jar 包 |
9 5bb864e1fc775087 OP @Ashe007 不是本地 sdk 。这个项目有 A,B,C 3 个模块的代码,A 模块是主模块,A 模块依赖 B 和 C 模块,B 和 C 模块有我要扫描的组件。现在依赖是下面这么写的,我查了下 scope 改成 system 需要手动指定 jar 包路径,好像不适用这种情况 <dependency> <groupId>com.hh.pms</groupId> <artifactId>hh-basic</artifactId> <version>3.6.3</version> <scope>compile</scope> </dependency> |
10 sunrealzhang 2024-06-14 13:29:53 +08:00 @5bb864e1fc775087 META-INF/MANIFEST.MF 文件里有类似 Spring-Boot-Lib: BOOT-INF/lib/ 的配置吗,是用 springboot 的插件打的包吗 |
11 5bb864e1fc775087 OP @sunrealzhang #6 META-INF/MANIFEST.MF 文件里有这行:Spring-Boot-Lib: BOOT-INF/lib/ 这个是 pom.xml 里的打包插件: <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> |
12 sunrealzhang 2024-06-14 13:53:24 +08:00 @sunrealzhang 看起来没什么特别的,和我日常打的 jar 包没啥区别,看来帮不到你了不好意思 |
13 5bb864e1fc775087 OP @sunrealzhang #12 没事 |