V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
5bb864e1fc775087
V2EX  ›  问与答

Java springboot @ComponentScan 扫描依赖里的组件, idea 里正常运行, 打包成 jar 包后却扫描不到了

  •  
  •   5bb864e1fc775087 · 4 天前 · 488 次点击

    一个 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:

    第 1 条附言  ·  3 天前

    终于搞清楚原因, 给遇到相同问题的人: 是因为这些依赖用的插件是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>
    
    13 条回复    2024-06-14 14:12:52 +08:00
    Ashe007
        1
    Ashe007  
       4 天前 via iPhone
    问题没描述清楚吧?如果你所称的依赖是本地 sdk 的话,需要你 Maven 打包方式显式声明域 system scope

    其他情况没有思路
    JamesMackerel
        2
    JamesMackerel  
       4 天前 via iPhone
    unzip 出来看看到底有没有。
    nekomiao
        3
    nekomiao  
       4 天前
    一楼说的对
    xiangyuecn
        4
    xiangyuecn  
       4 天前
    吐槽一下 把 jar 打包进 jar 不知道是哪个人才想出来的😂 1MB 不到的业务逻辑 改一个字节 就得打包出全新的 1GB jar😂 放哪都不好使
    ZZ74
        5
    ZZ74  
       4 天前
    @xiangyuecn 因为这样最无脑方便。
    sunrealzhang
        6
    sunrealzhang  
       4 天前
    打包的问题吧,包里 classpath 之类的文件有包含你的那些依赖包吗
    5bb864e1fc775087
        7
    5bb864e1fc775087  
    OP
       4 天前
    @sunrealzhang “包里 classpath 之类的文件”
    你这句话指的是 jar 包解压出来后里面的这个文件么:BOOT-INF/classpath.idx
    那是有的,里面有这样的语句,hh-basic-3.6.3.jar 就是我要的依赖:
    - "BOOT-INF/lib/hh-basic-3.6.3.jar"
    5bb864e1fc775087
        8
    5bb864e1fc775087  
    OP
       4 天前
    @JamesMackerel 解压过了,里面有我要的 jar 包
    5bb864e1fc775087
        9
    5bb864e1fc775087  
    OP
       4 天前
    @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>
    sunrealzhang
        10
    sunrealzhang  
       4 天前
    @5bb864e1fc775087 META-INF/MANIFEST.MF 文件里有类似
    Spring-Boot-Lib: BOOT-INF/lib/
    的配置吗,是用 springboot 的插件打的包吗
    5bb864e1fc775087
        11
    5bb864e1fc775087  
    OP
       4 天前
    @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>
    sunrealzhang
        12
    sunrealzhang  
       4 天前
    @sunrealzhang 看起来没什么特别的,和我日常打的 jar 包没啥区别,看来帮不到你了不好意思
    5bb864e1fc775087
        13
    5bb864e1fc775087  
    OP
       4 天前
    @sunrealzhang #12 没事
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3159 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 11:26 · PVG 19:26 · LAX 04:26 · JFK 07:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.