spring-boot 项目前后端分离Maven Module怎么划分配置

avatar

现在都在折腾前后端分离,这里来介绍一下Maven项目里怎么将前后端分离开发

新建一个 springboot 项目

spring-boot 项目大家都会建,这里不多说,我用的是IDEA创建的,建好后,结构如下

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── demo
│   │               └── DemoApplication.java
│   └── resources
│       ├── application.properties
│       ├── static
│       └── templates
└── test
    └── java
        └── com
            └── example
                └── demo
                    └── DemoApplicationTests.java

其中 pom.xml 文件内容是这样的

<?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>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>demo</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <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>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

添加一个 common module

这时候可以把 demo/src 文件夹删了

这个 common 模块里放的是一些 model repository service utils 等,反正什么是公共用到的东西,就把什么东西放在里面,建好之后,项目长这个样

.
├── common
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── java
│       │   └── resources
│       └── test
│           └── java
└── pom.xml

这时候 demo/pom.xml 内容是这样的

<?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>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <modules>
    <module>common</module>
  </modules>
  <packaging>pom</packaging>

  <name>demo</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <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>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

demo/common/pom.xml 文件内容是这样的

<?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">
  <parent>
    <artifactId>demo</artifactId>
    <groupId>com.example</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>common</artifactId>

</project>

然后在common里添加一个实体类(repository, service)我这里就不写了

新建包 com.example.common.user.model,然后添加上下面 User

package com.example.common.user.model;

/**
 * Created by tomoya at 2018/10/16
 */
public class User {

  private String username;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }
}

添加 api module

有了公共部分的实体类了,可以开始写接口模块了,一般接口模块是给前端项目调用的,应该算是半个前端吧

模块建好后,pom.xml 文件相应的变化如下

demo/pom.xml

<?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>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <modules>
    <module>common</module>
    <module>api</module>
  </modules>
  <packaging>pom</packaging>

  <name>demo</name>
  <description>Demo project for Spring Boot</description>
  
  <!-- 下面都是一样的 -->

demo/common/pom.xml 没变化

然后在api的pom.xml里引入 common 模块 demo/api/pom.xml 是这样的

<?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">
  <parent>
    <artifactId>demo</artifactId>
    <groupId>com.example</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>api</artifactId>

  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>common</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>

</project>

在 api 模块里写上一个 controller

package com.example.demo.api.user.controller;

import com.example.common.user.model.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by tomoya at 2018/10/16
 */
@RestController
@RequestMapping("/api/user")
public class UserController {

  @GetMapping("/add")
  public User add(String username) {
    User user = new User();
    user.setUsername(username);
    return user;
  }
}

再创建一个启动类

package com.example.demo;

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

/**
 * Created by tomoya at 2018/10/16
 */
@SpringBootApplication
public class ApiApplication {

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

}

注意这个启动类必须要放在 com.example.demo 这个包下,不要放在 com.example.demo.api 下面

最后再创建一个 application.yml 文件放在 demo/api/src/resources/ 下面

这时候可以启动 ApiApplication 然后在浏览器里输入 http://localhost:8080/api/user/add?username=test 回车,浏览器会输出一段json

{"username":"tomoya"}

接口就这样写好了,到现在项目结构变成了这样

.
├── api
│   ├── pom.xml
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── example
│   │   │   │           └── demo
│   │   │   │               ├── ApiApplication.java
│   │   │   │               └── api
│   │   │   │                   └── user
│   │   │   │                       └── controller
│   │   │   │                           └── UserController.java
│   │   │   └── resources
│   │   │       └── application.yml
│   │   └── test
│   │       └── java
├── common
│   ├── pom.xml
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── example
│   │   │   │           └── common
│   │   │   │               └── user
│   │   │   │                   └── model
│   │   │   │                       └── User.java
│   │   │   └── resources
│   │   └── test
│   │       └── java
└── pom.xml

创建 admin module

有了接口模块,可以给前端提供接口了,现在还差系统管理部分,再创建一个module名字叫 admin

跟上面创建api module一样,demo/pom.xml 里会多出来一条

<modules>
    <module>common</module>
    <module>api</module>
    <module>admin</module>
</modules>

demo/admin/pom.xml 里也添加上 common 的依赖

<?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">
  <parent>
    <artifactId>demo</artifactId>
    <groupId>com.example</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>admin</artifactId>

  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>common</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>

</project>

同样的添加上controller 跟启动类和配置文件

package com.example.demo.admin.user.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Created by tomoya at 2018/10/16
 */
@Controller
@RequestMapping("/admin/user")
public class UserAdminController {

  @GetMapping("/delete")
  @ResponseBody
  public String delete() {
    return "没有权限";
  }
}

启动类

package com.example.demo;

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

/**
 * Created by tomoya at 2018/10/16
 */
@SpringBootApplication
public class AdminApplication {

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

}

添加上配置文件,这个配置文件里要配置上端口,因为api模块已经把默认的8080端口占用了

配置文件位置 demo/admin/src/resources

server:
  port: 8081

启动 AdminApplication 浏览器输入 http://localhost:8081/admin/user/delete 回车,浏览器会输出 没有权限

PS:admin 模块里我没有加上模板,只是输出了一个字符串,你可以选择自己喜欢的模板,我比较喜欢freemarker,用起来简单方便

打包

接口有了,后台也有了,但部署的时候还是要打包运行的,spring-boot推荐部署方式是打jar包部署,单一项目打jar包相当方便,但这种有依赖其它模块的项目打jar包就有些麻烦了,我也着实折腾了一番,不过还是找到了解决办法

api,admin两个模块肯定要分开来部署的,所以这里要打两个jar包,相应的配置如下

首先去掉 demo/pom.xml 里下面这部分代码

<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
</build>

然后在api admin 模块下的 pom.xml 文件里加上下面这段代码

下面是我配置在api里的,粘贴到admin里要修改一下 fileName 和 mainClass

<build>
  <finalName>api</finalName>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <configuration>
        <executable>true</executable>
        <mainClass>com.example.demo.ApiApplication</mainClass>
        <includeSystemScope>true</includeSystemScope>
      </configuration>
      <executions>
        <execution>
          <configuration>
            <classifier>exec</classifier>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

然后在 demo 目录下运行命令 mvn clean compile package 执行完成后,就会在 api/target/ 下生成 api-exec.jar 文件了,然后 java -jar api-exec.jar 即可运行,跟上面运行main方法是一样的

总结

项目最终结构

.
├── admin
│   ├── pom.xml
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── example
│   │   │   │           └── demo
│   │   │   │               ├── AdminApplication.java
│   │   │   │               └── admin
│   │   │   │                   └── user
│   │   │   │                       └── controller
│   │   │   │                           └── UserAdminController.java
│   │   │   └── resources
│   │   │       └── application.yml
│   │   └── test
│   │       └── java
├── api
│   ├── pom.xml
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── example
│   │   │   │           └── demo
│   │   │   │               ├── ApiApplication.java
│   │   │   │               └── api
│   │   │   │                   └── user
│   │   │   │                       └── controller
│   │   │   │                           └── UserController.java
│   │   │   └── resources
│   │   │       └── application.yml
│   │   └── test
│   │       └── java
├── common
│   ├── pom.xml
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── example
│   │   │   │           └── common
│   │   │   │               └── user
│   │   │   │                   └── model
│   │   │   │                       └── User.java
│   │   │   └── resources
│   │   └── test
│   │       └── java
└── pom.xml
1 条评论
avatar
hutongling 发布于 2 个月前
  1  

不错,值得学习

添加一条评论 请尽量发布对他人有帮助的评论

登录后可发布评论

登录 | Github登录