網頁

2018/10/20

使用Eclipse建立Maven Spring Boot多模組專案
How to create Spring Boot Maven multi-module projects in Eclipse

本篇介紹如何在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的應用程式類別的@SpringBootApplicationscanBasePacages屬性會設定為"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字串。


如果本篇有幫助到您,幫忙點一下廣告支持,感恩。

範例專案結構如下:




1 則留言: