本篇介紹如何在Eclipse建立Maven多模組專案(multi-module project)。
本範例的專案結構有一個名稱為my-web-app的母專案(parent project),而my-web-app專案會有兩個子模組(sub-module),分別為my-web專案及my-service專案。
my-web專案與my-service專案都是spring boot應用程式。my-web專案中只有controller,負責接收request;my-service專案則提供my-web專案controller所需呼叫的服務。簡單說就是把一個傳統Web App專案中controller,service切成兩個模組專案。
本篇IDE使用STS(Spring Tool Suite (Version: 3.9.5.RELEASE))。即Eclipse加上STS plugin。
首先建立母專案my-web-app為一個簡單的maven project。
在STS的上方的功能選單點選File -> New -> Maven Project
。勾選[Create a simple project(skip archetype selection)],也就是建立一個簡單的maven專案;勾選[Use default Workspace location],也就是此專案建立在預設的Workspace。然後按Next >。
接著輸入maven專案要求的[Group Id],[Artifact Id]名稱。[Packaging]選擇pom。然後按Finish。
package選擇為pom的原因是母專案其實只是用maven多模組的特性來包裝並管理兩個子模組專案,其並非真正要運行的應用程式,因此不需要建構為jar或war。
在STS左側的Project Explorer可以看到建好的my-web-app專案。
my-web-app的src目錄用不到可以不用理會。
接著要設定my-app-web專案的pom.xml
,母專案的pom稱為parent pom。因為兩個子模組my-web專案及my-service專案皆為spring boot專案,而maven多模組專案的特點就是子模組pom是繼承母專案的parent pom,所以要在my-web-app的pom.xml
設定對spring boot所需的依賴。另外也設定共用的property及maven plugin等。
pom.xml(my-app-web)
<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>idv.matt</groupId>
<artifactId>my-web-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!-- Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
接著建立第一個子模組my-web專案。
在my-web-app專案上按滑鼠右鍵開啟功能選單,選擇Maven -> New Maven Module Project
。
不要勾選[Create a simple project(skip archetype selection)]。
[Module Name]命名為my-web,然後按Next >。
選擇maven-archetype-quickstart,然後按Next >。
將[Package]中自動產生的名稱改為與母專案一樣,例如都叫idv.matt,這是因為等一下my-web的應用程式類別的@SpringBootApplication
的scanBasePacages
屬性會設定為"idv.matt",spring boot會依此來掃描物件為bean。最後按Finish。
然後你在STS左側的Project Explorer就可以看到新增的my-web專案。刪除自動產生的App.java
,因為用不到。另外在my-web-app專案中多了my-web目錄,參考到my-web專案。
此時打開my-web-app的pom.xml
,我們可以看到多了<moduels>
的模組設定如下。意思是專案的子模組為my-web專案。
<modules>
<module>my-web</module>
</modules>
開啟子模組my-web專案的pom.xml
可以看到<parent>
的設定,代表其母專案為my-web-app。由於繼承了my-web-app母專案,所以刪除重覆的<groupId>
及<version>
及其他不必要的設定,並加入spring boot的依賴設定,最後修改後的內容如下:
pom.xml(my-web)
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>idv.matt</groupId>
<artifactId>my-web-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>my-web</artifactId>
<name>my-web</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
由於依賴都透過母專案my-web-app的pom來管理,所以這邊的<dependency>
僅指定依賴的<groupId>
及<artifactId>
,但不需設定<version>
。
接著在my-web專案建立spring boot的應用程式類別idv.matt.web.WebApplication
。
WebApplication.java
package idv.matt.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "idv.matt")
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
然後建立一個idv.matt.web.controller.HelloController
,用來接受request。
HelloController.java
package idv.matt.web.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String getHello() {
System.out.println("hello");
return null;
}
}
到這邊你可以執行my-app專案來測試是否可正確運行,在my-web專案上點滑鼠右鍵 -> Run As -> Spring Boot App
來啟動。
開啟瀏覽器在url輸入http://localhost:8080/hello
,正確的話變可在STS的console印出HelloController.getHello()
中的"hello"。
接著建立第二個子模組my-service專案,方法同建立my-web專案。建立好刪除自動產生但用不到的App.java
。同樣可在my-web-app的pom.xml
的<modules>
看到加入的my-service模組。
開啟my-service專案的pom.xml
修改設定如下:
pom.xml(my-service)
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>idv.matt</groupId>
<artifactId>my-web-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>my-service</artifactId>
<name>my-service</name>
<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>
</dependencies>
</project>
接著在my-service建立一支idv.matt.service.HelloService
,這支程式等一下會被my-web專案的HelloController
呼叫。
HelloService.java
package idv.matt.service;
import org.springframework.stereotype.Service;
@Service
public class HelloService {
public String getHello() {
return "hello";
}
}
由於等一下my-web要依賴my-service,所以要修改my-web-app及my-web的pom.xml
來加入對my-service的依賴設定如下。
pom.xml(my-web-app)
<?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>idv.matt</groupId>
<artifactId>my-web-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!-- Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>idv.matt</groupId>
<artifactId>my-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</pluginManagement>
</build>
<modules>
<module>my-web</module>
<module>my-service</module>
</modules>
</project>
pom.xml(my-web)
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>idv.matt</groupId>
<artifactId>my-web-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>my-web</artifactId>
<name>my-web</name>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>idv.matt</groupId>
<artifactId>my-service</artifactId>
</dependency>
</dependencies>
</project>
修改my-web的HelloController
如下:
HelloController
package idv.matt.web.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import idv.matt.service.HelloService;
@RestController
public class HelloController {
@Autowired
HelloService service;
@GetMapping("/hello")
public String getHello() {
System.out.println("hello");
return service.getHello();
}
}
到這邊就完成本範例所有的設定。接著一樣啟動my-web並在瀏覽器輸入相同的url來測試。若成功則瀏覽器會出現返回的hello字串。
如果本篇有幫助到您,幫忙點一下廣告支持,感恩。
範例專案結構如下:
感謝分享!
回覆刪除