【问题标题】:Spring Boot project using Old Spring Jars/Project | Not able to initiateSpring Boot 项目使用旧 Spring 罐子/项目 |无法启动
【发布时间】:2020-12-19 07:15:04
【问题描述】:

需要新的 Spring Boot 项目。

需要包含现有 Spring (Non Boot) 项目的 Jar,因为它有一个我们需要使用的 bean(那里编写了很多代码,因此无法将其移动到引导)

@Service("ctdbservice")

我在 Spring Boot 中包含了现有 jar 的依赖项。

以下是现有项目的现有spring非启动项目的pom:

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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.hcccsc.aom2</groupId>
    <artifactId>am2-parent</artifactId>
    <version>BC20.10-SNAPSHOT</version>
    <relativePath>../am2-parent</relativePath>
  </parent>
  <artifactId>am2-read-write-cts3-impl</artifactId>
  <packaging>jar</packaging>

  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
    <defaultGoal>clean install</defaultGoal>
  </build>

  <dependencies>

    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>am2-common</artifactId>
      <version>${project.version}</version>
    </dependency>
    
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>am2-reference-impl</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>am2-model</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>am2-cts3-model</artifactId>
      <version>${project.version}</version>
      <exclusions>
        <exclusion>
          <artifactId>am2-cts3-data-model</artifactId>
          <groupId>${project.groupId}</groupId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>am2-read-api</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>am2-write-api</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>am2-read-cts2-impl</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>am2-search-api</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>am2-search-cts3-impl</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>org.javers</groupId>
      <artifactId>javers-core</artifactId>
    </dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
</dependency>

我已将上述内容包含在我的 Spring Boot Maven 中。但是 Spring boot 并没有启动这个 JAR 的 bean。

Spring Boot 能否在其上下文中正确加载旧 jar?旧 jar 中的 pom 文件是否会影响它,因为它引用了某些父级具有 spring 版本以及使用相同版本的 jar?还是这些 jar 只使用 spring boot 添加的依赖项?

谁能建议我哪里做错了?

【问题讨论】:

标签: java spring spring-boot maven


【解决方案1】:

所以我猜@Autowired 不能正常工作,对吧?

您需要对 JAR 包进行组件扫描,例如:

@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}

How can I @Autowire a spring bean that was created from an external jar?

【讨论】:

    【解决方案2】:

    可能会出现两类不同的问题。

    1. 任何特定版本的 Spring Boot 都使用非常特定版本的依赖项(当然包括 Spring)。因此,首先要确保生成的工件中没有依赖版本的冲突。如果这样做 - 可能会导致意外和不需要的行为 - 启动错误等等。

    2. Spring boot 将检测主类的包,比如com.example.myapp(这是带有@SpringBootApplication 注释的类所在的位置),它会尝试在com.example.myapp(同一个包)和com.example.myapp.* 中查找bean (分层:com.example.myapp.a.b.c 也可以),但如果您的服务不在这些路径之一中,它将不会被识别为 bean。

    一般而言,您可以使用三种方法:

    方法一: 正如@Milgo 已经在您的spring boot 应用程序中建议的那样,在@Configuration 类上使用@ComponentScan 注释。这个类到底放在哪里并不重要,spring 是一个运行时框架。

    方法 2: 在服务模块中创建一个@Configuration 类,该类将再次看起来像并在带有@Import 注释的spring boot 应用程序中导入它

    方法 3: 使用spring.factories 并再次指定配置。不同之处在于,这种方式不会在组件扫描过程中找到该类,而是在“工厂”扫描期间解决。

    效果是在你的 Spring Boot 应用程序中指定一个 Maven 依赖项就足够了,它会“自动神奇地”加载你的 bean。 你可以阅读这个方法here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-13
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2017-05-03
      • 2020-01-02
      • 1970-01-01
      相关资源
      最近更新 更多