一个 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 166 天前 via iPhone
问题没描述清楚吧?如果你所称的依赖是本地 sdk 的话,需要你 Maven 打包方式显式声明域 system scope
其他情况没有思路 |
2
JamesMackerel 166 天前 via iPhone
unzip 出来看看到底有没有。
|
3
nekomiao 166 天前
一楼说的对
|
4
xiangyuecn 166 天前
吐槽一下 把 jar 打包进 jar 不知道是哪个人才想出来的😂 1MB 不到的业务逻辑 改一个字节 就得打包出全新的 1GB jar😂 放哪都不好使
|
5
ZZ74 166 天前
@xiangyuecn 因为这样最无脑方便。
|
6
sunrealzhang 166 天前
打包的问题吧,包里 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 165 天前
@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 165 天前
@sunrealzhang 看起来没什么特别的,和我日常打的 jar 包没啥区别,看来帮不到你了不好意思
|
13
5bb864e1fc775087 OP @sunrealzhang #12 没事
|