首页 > 解决方案 > 如何打包 Springboot 应用程序以在另一个 Springboot 应用程序中充当操作依赖项

问题描述

我有一个具有 @Scheduled 方法的 Springboot 应用程序。我想以这样一种方式打包它,让其他需要我的功能的应用程序可以简单地将其添加到他们的 POM 并自动运行 @Scheduled 方法而无需进行任何代码更改(配置除外)。

这可以通过Springboot实现吗?我宁愿不创建父项目,而是将其作为依赖项。谢谢!

编辑:我已将 Springboot 应用程序导出为 Jar 并在本地导入,但 @Scheduled 方法从未运行。

标签: javamavenspring-boot

解决方案


要创建自己的库,只需创建一个单独的标准 java maven 项目并将您的公共类放入其中。确保不要在其中放置带有 @SpringBootApplication 的类(当然可以这样做,但为了简单起见,我们保持这样)。

你的 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>

  <groupId>com.my.own</groupId>
  <artifactId>my-own-utils</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>my-own-utils</name>
  <description>My Own Spring Boot App Utilities</description>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>

    <!-- here you put your dependencies just as in a spring boot app. You can even use starters. -->

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-web</artifactId>
    </dependency>

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

    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-sns</artifactId>
      <version>1.11.301</version>
    </dependency>

  </dependencies>

</project>

请注意,此 pom不使用 spring-boot-maven-plugin,因此它将被构建为标准 jar。

接下来,要在 Spring Boot 应用程序中使用它,只需将其添加为普通依赖项即可。

<dependency>
  <groupId>com.my.own</groupId>
  <artifactId>my-own-utils</artifactId>
  <version>1.0.0-SNAPSHOT</version>
</dependency>

然后,要让您的 Spring Boot 应用程序处理库中使用的@ComponentScan注解,您必须在应用程序的 Main 类中使用注解,以便它还搜索库包中的类:

@SpringBootApplication
@ComponentScan("com.my.own")
public class MainApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MainApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

此时,在启动时,您的 spring 应用程序将在com.my.own包括您的库在内的完整类路径中查找它自己的包以及包的 bean 和组件,并根据它们的注释实例化它们。

如果您想控制您的应用程序应该实例化什么(假设您的库有 5 个 @Component 类但您只想使用一个),您可以使用@ConditionalOnProperty注解。


推荐阅读