Maven多模块Spring Boot项目

3
我正在尝试创建一个多模块项目,其中包含两个模块:核心模块和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. Do the properties have to live in a single configuration file or can I have two application.properities, one the core jar, and one for the WAR?

  2. Can I have the following in my 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);
    }
}

AND

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。


4
你的核心应用程序不会有任何作用,因为它只是一个像Web项目中包含的其它JAR文件一样的JAR文件。因此,只有你的Web JAR才会有所作为。你真的确定希望将你的核心应用程序设置为Spring Boot应用程序,而不仅仅是Web吗?如果它不是一个独立的应用程序,只是用于嵌入,则这样做有什么意义呢? - M. Deinum
3个回答

2
您的设计略有不妥,如果您的核心项目将拥有领域实体、存储库等,则无需成为BOOT应用程序。正如您所说,这将是一个Jar包。
现在,您可以将Web应用程序设置为依赖于核心模块Jar的Boot应用程序。您可以在Boot应用程序中定义.properties或.yml文件,并且就可以运行了。
Spring Initializer存在的问题在于,它让您产生了所有代码都需要驻留在单个项目或模块下的印象。
这是我为我的应用程序遵循的典型项目:
- 项目核心模块(打包Jar -> 领域实体,存储库等) - 项目服务模块(boot -> 配置,REST接口,安全性等) - 项目系统测试(在编译时运行并验证构建)
现在,您可以将核心和系统模块与服务模块绑定为依赖项。

1
请查看您问题的答案。
1. 属性必须存在于单个配置文件中,还是可以在核心jar和WAR中分别有一个application.properities文件?
它们不能都命名为application.properties。请参阅我对此问题的答案here
2. 我的core.jar文件中可以有以下内容吗?
是的,如果您按照链接中提到的步骤进行操作。
3. 由于Spring Boot执行了很多自动配置,这些配置是否会互相干扰或覆盖彼此?
您每次只能启动一个应用程序。例如,如果您正在运行TimesheetWebApplication应用程序,则不会启动TimesheetCoreApplication。TimesheetCoreApplication将仅作为普通JAR包包含在内。
另外,您还可以执行以下操作。
  1. Package your TimesheetCoreApplicationas follows. Refer here. This will make sure that every time you do maven install, the jar which will only contain the class files(No tomcat embedded libraries) will be installed to 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>
    


0

简而言之,

  1. 你不需要使用 .properties 文件,可以使用 yaml 与 Spring Boot,它更易读。单个 yaml 文件足以满足你的配置需求,因为 yaml 使用缩进,所以你可以轻松区分参数。

  2. 单个应用程序类就足够了,因为你不仅仅会执行核心模块。

  3. 有很多 starter 依赖及其 configurations,可以在项目中加速开发。


是的,我也更喜欢YAML。我将其拆分为两个模块的原因是因为有可能会有一个API模块,与Web分开但仍依赖于核心模块。你是说部署的模块(即WAR)应该包含所有配置吗? - greyfox
这不是一个确定的决定,但这是一般的方法。 - dogankadriye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接