为了账号安全,请及时绑定邮箱和手机立即绑定

@Component Scan 不适用于 Spring Boot 中的 @Componen

@Component Scan 不适用于 Spring Boot 中的 @Componen

慕神8447489 2022-06-15 10:46:30
我以这种方式在spring boot应用程序中有一个通用的jar文件,package com.acc.api;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@SpringBootApplication@ComponentScan(basePackages = {"com.acc.api","service"})public class ApicoreApplication {    public static void main(String[] args) {        ApplicationContext applicationContext = SpringApplication.run(ApicoreApplication.class, args);        for (String name: applicationContext.getBeanDefinitionNames()) {            System.out.println(name);        }    }}其中的组件是,package com.acc.api.core.utils;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;@Componentpublic class AccUtil {    @Autowired    private WebServiceEngine engine;}其中 WebServiceEngine 是我调用的第三方 api。我的 pom 条目是这样的,<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.1.2.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.acc.api</groupId>    <artifactId>apicore</artifactId>    <version>0.0.1</version>    <name>apicore</name>    <description>apicore</description>    <properties>        <java.version>1.8</java.version>    </properties>直到这很好,项目正在编译,jar 正在目标文件夹中创建。
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您在com.acc.api.core.utils.AccUtil课堂上两次导入StatusController课程:


import com.acc.api.core.utils.AccUtil;


@Import({AccUtil.class})

删除其中一个,然后重试。


查看完整回答
反对 回复 2022-06-15
?
慕容708150

TA贡献1831条经验 获得超4个赞

Spring boot 仅扫描作为依赖项的包/jar。无论哪种方式,编译时范围或运行时范围(提供)。因此,如果您尝试扫描不依赖于编译时(默认范围)的 jar,例如,因为您集成在一个接口上,您仍然依赖于它运行时,因此组件可以找到要注入的实现类。如果您连接例如@RestControllers,则应用程序可能在另一个包/jar 中,然后是您的控制器。尽管您没有应用程序包对控制器的编译时依赖性,但您仍然需要加载 jar 运行时。否则,控制器将不会被扫描并发现运行时。


<dependency>

        <groupId>...</groupId>

        <artifactId>...</artifactId>

        <version></version>

        <scope>provided</scope>

</dependency>

<dependency>

    <groupId>...</groupId>

    <artifactId>...</artifactId>

    <version></version>

    <scope>compile</scope>

</dependency>


查看完整回答
反对 回复 2022-06-15
?
噜噜哒

TA贡献1784条经验 获得超7个赞

使用 Spring Boot 时,spring-boot-maven-plugin会重新打包并重组生成的 jar 文件。此 jar 文件不可用作其他应用程序的依赖项。相反,您需要指示spring-boot-maven-plugin重新打包 jar 并保留原始工件(并将两者都发布到您的 maven 存储库)。

Spring Boot 参考指南有一个关于如何做到这一点的特殊部分。

如果您的 jar 只是一个依赖项并且本身不能运行/可执行,那么只需删除spring-boot-maven-plugin并生成一个常规 jar。


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信