【问题标题】:Maven Multi Module Spring Boot ProjectMaven 多模块 Spring Boot 项目
【发布时间】:2015-10-10 09:55:27
【问题描述】:

我正在尝试创建一个包含两个模块、核心和 Web 的多模块项目。它们都是我在 Spring Initialzer 上生成的 Spring Boot 项目。我设置了 Maven POM 文件,但在部署它时遇到了问题。但是我很困惑配置是如何工作的。

核心模块将包含域对象/实体、Spring Data JPA 存储库、服务,并将被打包为 JAR。 Web 模块将包含 Spring Security、控制器和视图。它将被打包为 WAR。

Spring Boot 项目的正常结构如下所示

/
pom.xml
src/
..main/
....com/
......example/
........app/
..........Application.java
..resources/
....application.properites

我基本上有两个这样的和两个 Spring Boot 应用程序/配置/初始化类。

我的问题是

  1. 属性是否必须存在于单个配置文件中,或者我可以有两个 application.properities,一个是核心 jar,一个用于 WAR?

  2. 我的 core.jar 中可以包含以下内容吗

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class TimesheetCoreApplication {
    
      public static void main(String[] args) {
        SpringApplication.run(TimesheetCoreApplication.class, args);
      }
    }
    

连同以下两个在我的 web.war 中

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TimesheetWebApplication {

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

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

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

}
  1. 由于 Spring Boot 做了很多自动配置,它们是否会在配置上相互交叉,或者相互冲突或覆盖?

解决此问题的最佳方法是什么?如果可能,我想利用 Spring Boot。

【问题讨论】:

  • 您的核心应用程序将什么也不做,因为它只是另一个 jar,就像 Web 项目中包含的任何其他 jar 一样。所以只有你的 web jar 会做一些事情,你真的确定你希望你的核心应用程序是一个 spring boot 应用程序而不仅仅是 web 吗?如果它不是一个独立的应用程序并且只用于嵌入,那有什么意义呢。

标签: java spring maven spring-boot


【解决方案1】:

您的设计稍有不正确,如果您的核心项目将包含域实体、存储库等。它不必是 BOOT 应用程序。 正如你所说,这将是一个 Jar。

现在您将 Web 应用程序设为依赖于核心模块 jar 的引导应用程序。您可以在启动应用程序中定义 .properties 或 .yml ,一切顺利。

Spring Initializer 的问题在于,它给您的印象是所有代码都需要驻留在单个项目或模块下。

这是我为我的应用程序遵循的典型项目

  • project-core-module(打包 Jar -> 域实体、存储库等)
  • 项目服务模块(启动 -> 配置、休息接口、安全等)
  • project-system-tests(在编译时运行并验证构建)

现在您将核心和系统模块与服务模块绑定为依赖项。

【讨论】:

    【解决方案2】:

    请找到您问题的答案

    1.属性是否必须存在于单个配置文件中,或者我可以有两个 application.properities,一个是核心 jar,一个用于 WAR?

    它们不能同时命名为application.properties。参考我对这个问题的回答here

    2.我可以在我的 core.jar 中有以下内容吗

    是的,如果您按照链接中提到的步骤操作,您可以。

    3.由于 Spring Boot 做了很多自动配置,它们是否会在配置中相互交叉,或者相互冲突或覆盖?

    您一次只能启动一个应用程序。假设您正在运行TimesheetWebApplication 应用程序,那么TimesheetCoreApplication 将不会被启动。时间TimesheetCoreApplication 将仅作为普通 JAR 包含在内。

    除此之外还可以进行以下操作

    1. 如下打包你的TimesheetCoreApplication。请参阅here。这将确保每次执行 maven 安装时,将仅包含类文件(无 tomcat 嵌入式库)的 jar 安装到 repo。

      <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                      <executions>
                        <execution>
                          <goals>
                            <goal>repackage</goal>
                          </goals>
                          <configuration>
                            <classifier>exec</classifier>
                          </configuration>
                        </execution>
                      </executions>
                  </plugin>
              </plugins>
      

    【讨论】:

      【解决方案3】:

      简单地说,

      1. 你不需要 .properties ,你可以使用yaml 和spring boot,它更具可读性。单个yaml文件足够你的配置,因为yaml使用缩进,所以你可以轻松区分参数。

      2. 单个应用程序类很好,因为您不会只执行核心模块。

      3. 有很多 starter 依赖和它们的 configurations ,你可以在项目中加速。

      【讨论】:

      • 是的,我也更喜欢 YAML。我之所以分成两个模块,是因为有一天有可能成为一个 API 模块,与 Web 分开,但仍然依赖于核心模块。您是说将要部署的模块(即 WAR)应该是包含所有配置的模块?
      • 这不是一个确定的决定,但这是一般的做法。
      猜你喜欢
      • 2014-06-02
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多