本文将通过Eclipse构建一个基于Spring Boot 的复合项目工程。项目工程将包含一个library jar
和一个使用该library
的application web
应用。
链接:https://spring.io/guides/gs/multi-module/
工程目的
创建一个jar提供服务简单“hello,world”的公开服务,然后该库将作为web工程的依赖引用
创建根项目
使用Eclipse创建根项目laijava-mutil-module
,该项目将包含library
和application
两个子项目
使用Eclipse快捷创建Maven项目,选中Maven Project点击next
跳过模板创建Maven项目,点击next
输入项目信息
Group Id :laijava.com
Artifact Id : laijava-mutil-module
Packaging : pom
Finish完成创建项目
删除自动生成的src目录,并新增library,application目录,项目目录如下
修改pom.xml文件,添加子模块配置
<modules>
<module>library</module>
<module>application</module>
</modules>
最终pom.xml文件如下
<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>laijava.com</groupId>
<artifactId>laijava-mutil-module</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>library</module>
<module>application</module>
</modules>
</project>
创建library项目
选中library目录,创建maven项目
输入项目信息
Group Id: laijava.com
Artifact Id: library
Packaging: jar
Name: laijava-library-module
Description:A library might merely provide pure Java APIs and no Spring features
Parent Project
Group Id: org.springframework.boot
Artifact Id: spring-boot-starter-parent
Version: 2.4.6
Finish完成创建项目
系统生成的pom.xml如下
<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.4.6</version>
</parent>
<groupId>laijava.com</groupId>
<artifactId>library</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>laijava-library-module</name>
<description>A library might merely provide pure Java APIs and no Spring features</description>
</project>
配置pom.xml,添加依赖
<properties>
<java.version>1.8</java.version>
<!-- 配置之后,Maven->Update Project -> force Update of Snapshots/Releases 解决Eclipse下Maven
unknown问题 -->
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
最后的到的pom.xml如下
<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.4.6</version>
</parent>
<groupId>laijava.com</groupId>
<artifactId>library</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>laijava-library-module</name>
<description>A library might merely provide pure Java APIs and no Spring features</description>
<properties>
<java.version>1.8</java.version>
<!-- 配置之后,Maven->Update Project -> force Update of Snapshots/Releases 解决Eclipse下Maven
unknown问题 -->
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
创建服务组件
创建文件目录
└── src
└── main
└── java
└── com
└── example
└── multimodule
└── service
library
将提供MyService
(library/src/main/java/com/example/multimodule/service/MyService.java
)服务组件供application
使用,MyService
类如下:
```java
package com.example.multimodule.service;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Service;
@Service
@EnableConfigurationProperties(ServiceProperties.class)
public class MyService {
private final ServiceProperties serviceProperties;
public MyService(ServiceProperties serviceProperties) {
this.serviceProperties = serviceProperties;
}
public String message() {
return this.serviceProperties.getMessage();
}
}
使用注解
@ConfigurationProperties
使得spring boot配置独立于application.properties
,通过ServiceProperties
(library/src/main/java/com/example/multimodule/service/ServiceProperties.java
)类提供配置信息
package com.example.multimodule.service;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("service")
public class ServiceProperties {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
通常
library
库只提供java API,不具备Spring特性,这种情况下需要引用library
库的应用独自配置
组件测试
使用
JUnit
和@SpringBootTest
注解对组件进行测试和验证,创建MyServiceTest.java
(library/src/test/java/com/example/multimodule/service/MyServiceTest.java
):
package com.example.multimodule.service;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest("service.message=Hello")
public class MyServiceTest {
@Autowired
private MyService myService;
@Test
public void contextLoads() {
assertThat(myService.message()).isNotNull();
}
@SpringBootApplication
static class TestConfiguration {
}
}
选中
library
项目,右键->Debug As -> Maven test,测试项目
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.685 s - in com.example.multimodule.service.MyServiceTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.226 s
[INFO] Finished at: 2021-06-23T19:58:20+08:00
[INFO] Final Memory: 16M/245M
[INFO] ------------------------------------------------------------------------
创建Application项目
参照
library
maven项目,创建application
maven项目,输入项目信息
Group Id: laijava.com
Artifact Id: application
Packaging: jar
Name: laijava-application-module
Description:Application project for Spring Boot
Parent Project
Group Id: org.springframework.boot
Artifact Id: spring-boot-starter-parent
Version: 2.4.6
Finish完成创建项目
修改pom.xml并添加
library
依赖
<properties>
<java.version>1.8</java.version>
<!-- 配置之后,Maven->Update Project -> force Update of Snapshots/Releases 解决Eclipse下Maven
unknown问题 -->
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>laijava.com</groupId>
<artifactId>library</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
最终pom.xml入下所示:
<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.4.6</version>
</parent>
<groupId>laijava.com</groupId>
<artifactId>application</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>laijava-application-module</name>
<description>Application project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<!-- 配置之后,Maven->Update Project -> force Update of Snapshots/Releases 解决Eclipse下Maven
unknown问题 -->
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>laijava.com</groupId>
<artifactId>library</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
编写application应用
在application下创建文件目录
└── src
└── main
└── java
└── com
└── example
└── multimodule
└── application
主类使用
@RestController
调用library
中的service
展示信息,主类如下(application/src/main/java/com/example/multimodule/application/DemoApplication.java
):
package com.example.multimodule.application;
import com.example.multimodule.service.MyService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication(scanBasePackages = "com.example.multimodule")
@RestController
public class DemoApplication {
private final MyService myService;
public DemoApplication(MyService myService) {
this.myService = myService;
}
@GetMapping("/")
public String home() {
return myService.message();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication包含了如下内容:
@Configuration:将类标记未应用上下文Bean
@EnableAutoConfiguration: 告诉Spring Boot根据类路径设置、其他 bean 和各种属性设置开始添加 bean。例如,如果spring-webmvc在类路径上,此注释将应用程序标记为 Web 应用程序并激活关键行为,例如设置DispatcherServlet.
@ComponentScan: 告诉 Spring 在包中查找其他组件、配置和服务com/example,让它找到控制器。
该main()方法使用 Spring Boot 的SpringApplication.run()方法来启动应用程序。
创建application.properties文件
需要未
library
服务提供配置(src/main/resources/application.properties)
service.message=Hello, World
测试应用
应用正常启动
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.6)
2021-06-23 20:46:53.903 INFO 19836 --- [ main] c.e.m.application.DemoApplication : Starting DemoApplication using Java 1.8.0_131 on LAPTOP-MFE46FH4 with PID 19836 (D:\allWorkplace\oxygenEclipse\laijava-mutil-module\application\target\classes started by 30456 in D:\allWorkplace\oxygenEclipse\taotao\laijava-mutil-module\application)
2021-06-23 20:46:53.909 INFO 19836 --- [ main] c.e.m.application.DemoApplication : No active profile set, falling back to default profiles: default
2021-06-23 20:46:56.537 INFO 19836 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-06-23 20:46:56.554 INFO 19836 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-06-23 20:46:56.555 INFO 19836 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.46]
2021-06-23 20:46:56.688 INFO 19836 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-06-23 20:46:56.688 INFO 19836 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2682 ms
2021-06-23 20:46:57.490 INFO 19836 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
2021-06-23 20:46:57.554 INFO 19836 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-06-23 20:46:57.567 INFO 19836 --- [ main] c.e.m.application.DemoApplication : Started DemoApplication in 4.207 seconds (JVM running for 4.862)
浏览器输入:http://127.0.0.1:8080/,将会看到 Hello, World
通过Eclipse构建一个基于Spring Boot 的复合项目工程到此结束
gitee:https://gitee.com/sevenbigbee/laijava-multi-module
评论区