SpringBoot-Maven多模块开发测试

时间:2022-08-10 16:49:09

静下心来,写下人生的第一篇博客。

(小序:文笔不好,基础Demo,大神请略过哈~~)

之前习惯用了eclipse,最近转到IDEA后,给我最大的差别就是:

eclipse有workspace的概念,而IDEA最顶层是project;这就导致了eclipse可以在同一窗口打开多个project,而IDEA只能打开一个project。后来学习找到可以通过新建一个空project的maven项目,然后添加多个Modules来实现同时打开多个project。闲话不多说,写个小Demo记录一下:

一、开发环境:

  • IDEA;
  • JDK1.8
  • Maven-3.3.9
  • SpringBoot-1.4.1

二、项目目录截图:

SpringBoot-Maven多模块开发测试

三、项目创建步骤:

(1)创建一个maven的project项目,File -> New -> Project,选择创建maven;名称命名为:SpringBootMutil,因为该项目只是作为聚合项目的父项目,所以删除src文件,保留pom.xml即可,并将打包方式改成pom。

(2)右键父项目名,New -> Module,依次创建各个子Module,方便识别,名称命名为SpringBootMutil-*的形式,打包方式为jar包。

(3)在父项目中添加依赖的版本信息,以及公共依赖等,最后的父pom文件:

父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.lzz</groupId>
    <artifactId>SpringBootMutil</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--打包方式为pom -->
    <packaging>pom</packaging>

    <modules>
        <module>SpringBootMutil-Service</module>
        <module>SpringBootMutil-Mapper</module>
        <module>SpringBootMutil-Domain</module>
        <module>SpringBootMutil-Common</module>
        <module>SpringBootMutil-Controller</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.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>
        <druid.version>1.0.9</druid.version>
        <mybatis.boot.starter.version>1.1.1</mybatis.boot.starter.version>
        <mysql.connector.java.version>5.1.32</mysql.connector.java.version>
    </properties>

    <!-- 依赖版本控制 -->
    <dependencyManagement>
        <dependencies>
            <!-- mybatis的依赖 -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.boot.starter.version}</version>
            </dependency>
            <!-- 添加MySQL数据库驱动依赖 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.connector.java.version}</version>
            </dependency>
            <!-- 数据库连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- 公共依赖 -->
    <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>
        </dependency>
    </dependencies>

    <!--指定使用maven打包-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <skipTests>true</skipTests><!--默认关掉单元测试 -->
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

(4)按照项目命名规则,子Module之间的依赖关系:

  • Controller依赖Common、Domain、Service;
  • Service依赖Common、Domain、Mapper;
  • Mapper依赖Common、Domain;
  • Common为公共工具类项目,因此不依赖其他Module。

[1] 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">
    <modelVersion>4.0.0</modelVersion>
    <artifactId>SpringBootMutil-Common</artifactId>
    <packaging>jar</packaging>

    <parent>
        <artifactId>SpringBootMutil</artifactId>
        <groupId>com.lzz</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

</project>

[2] Domain的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>
    <artifactId>SpringBootMutil-Domain</artifactId>
    <packaging>jar</packaging>

    <parent>
        <artifactId>SpringBootMutil</artifactId>
        <groupId>com.lzz</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

</project>

[3] Mapper的pom.xml

注意:在Mapper项目中,要引入mybatis和数据库的依赖

<?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>
    <artifactId>SpringBootMutil-Mapper</artifactId>
    <packaging>jar</packaging>

    <parent>
        <artifactId>SpringBootMutil</artifactId>
        <groupId>com.lzz</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <dependencies>
        <!-- 内部依赖 -->
        <dependency>
            <groupId>com.lzz</groupId>
            <artifactId>SpringBootMutil-Common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.lzz</groupId>
            <artifactId>SpringBootMutil-Domain</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 外部依赖 -->
        <!-- mybatis的依赖 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- 添加MySQL数据库驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
    </dependencies>

</project>

[4] Service的pom.xml

注意:在service项目中引入事务控制的依赖

<?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>
    <artifactId>SpringBootMutil-Service</artifactId>
    <packaging>jar</packaging>

    <parent>
        <artifactId>SpringBootMutil</artifactId>
        <groupId>com.lzz</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <dependencies>
        <!-- 内部依赖 -->
        <dependency>
            <groupId>com.lzz</groupId>
            <artifactId>SpringBootMutil-Common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.lzz</groupId>
            <artifactId>SpringBootMutil-Domain</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.lzz</groupId>
            <artifactId>SpringBootMutil-Mapper</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- 外部依赖 -->
        <!-- 事务管理需要引入该jar-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
    </dependencies>
    
</project>

[5] Controller的pom.xml

注意:配置maven插件,指定唯一的main方法的入口

<?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>
    <artifactId>SpringBootMutil-Controller</artifactId>
    <packaging>jar</packaging>

    <parent>
        <artifactId>SpringBootMutil</artifactId>
        <groupId>com.lzz</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <dependencies>
        <!-- 内部依赖 -->
        <dependency>
            <groupId>com.lzz</groupId>
            <artifactId>SpringBootMutil-Common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.lzz</groupId>
            <artifactId>SpringBootMutil-Domain</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.lzz</groupId>
            <artifactId>SpringBootMutil-Service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <!--spring boot打包的话需要指定一个唯一的入门-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定该Main Class为全局的唯一入口 -->
                    <mainClass>com.lzz.SpringBootMutilApp</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <!--可以把依赖的包都打包到生成的Jar包中-->
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

最后,将各个项目打包,(这个地方容易出现package失败的情况),最好是install到本地仓库

四、编写演示Demo

(1)在Common项目中编写一个工具类:

package com.lzz.utils;

import java.util.UUID;

/**  * Author lzz  * Date 2018/5/23  */ public class IDUtils {

    public static String uuid() {
        return UUID.randomUUID().toString().replace("-", "").toUpperCase();
    }
}
(2)在Domain项目中编写一个pojo:

package com.lzz.pojo;

/**  * Author lzz  * Date 2018/5/23  */ public class User {

    private String id;
    private String username;
    private String password;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

(3)在Mapper项目中编写相应的mapper接口和映射xml

package com.lzz.mapper;

import com.lzz.pojo.User;

import java.util.List;

/**  * Author lzz  * Date 2018/5/23  */ public interface UserMapper {

    void insert(User user);

    List<User> findAll();

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.lzz.mapper.UserMapper">

    <select id="findAll" resultType="com.lzz.pojo.User">
        select * from user
    </select>

    <insert id="insert" parameterType="com.lzz.pojo.User">
        insert into user(username, password, id)
        values(#{username},#{password},#{id})
    </insert>

</mapper>

(4)在Service项目中编写接口以及实现类(加入事务控制)

package com.lzz.service;

import com.lzz.pojo.User;

import java.util.List;

/**  * Author lzz  * Date 2018/5/23  */ public interface UserService {

    void insert(User user);

    List<User> findAll();
}
package com.lzz.service.impl;

import com.lzz.mapper.UserMapper;
import com.lzz.pojo.User;
import com.lzz.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**  * Author lzz  * Date 2018/5/23  */ @Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void insert(User user) {
        userMapper.insert(user);
    }

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }
}

(5)在Controller项目中编写调用接口(演示方法,使用静态数据模拟)

package com.lzz.controller;

import com.lzz.pojo.User;
import com.lzz.service.UserService;
import com.lzz.utils.IDUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**  * Author lzz  * Date 2018/5/23  */ @RestController
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "findAll", method = RequestMethod.GET)
    public List<User> findAll() {
        return userService.findAll();
    }

    @RequestMapping(value = "/insert", method = RequestMethod.GET)
    public String insert() {
        User user = new User();
        user.setId(IDUtils.uuid());
        user.setUsername("张三");
        user.setPassword("123");
        userService.insert(user);
        return "insert success";
    }
}

五、启动类编写(Controller项目中)

本项目基于SpringBoot,使用application.yml文件管理

(1)application.yml配置:

####################################################################### server:  port: 8080
  context-path: /

logging:  level: debug

####################################################################### spring:  datasource:  url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    password: 123
    username: root
    dbcp2:  min-idle: 5                         # 数据库连接池的最小维持连接数  initial-size: 10                    # 初始化提供的连接数  max-total: 10                       # 最大的连接数  max-wait-millis: 200                # 等待连接获取的最大超时时间  ####################################################################### mybatis:  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.lzz.pojo

(2)app启动类:

package com.lzz;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**  * Author lzz  * Date 2018/5/23  */ @RestController
@MapperScan("com.lzz.mapper")
@SpringBootApplication
public class SpringBootMutilApp {

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

    @RequestMapping(value = "/", method=RequestMethod.GET)
    public Map<String, Object> showIndex() {
        Map<String, Object> map = new HashMap<>();
        map.put("Project", "SpringBootMutil");
        map.put("Author", "lzz");
        map.put("Date", "2018-05-23");
        return map;
    }
}

(3)编写了一个测试类,测试下数据库连通性

package com.lzz.test;

import com.lzz.SpringBootMutilApp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

import javax.annotation.Resource;
import javax.sql.DataSource;

/**  * Author lzz  * Date 2018/5/24  */ @SpringBootTest(classes = SpringBootMutilApp.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class DataSourceTest {

    @Resource
    private DataSource dataSource;

    @Test
    public void testConnection() {
        System.out.println(this.dataSource);
    }
}

测试结果:成功

----------------------------------------------------------------------------------------------------------------------------------

2018-05-24 16:53:09.775  INFO 7588 --- [           main] com.lzz.test.DataSourceTest              : Started DataSourceTest in 3.778 seconds (JVM running for 4.593)
{
CreateTime:"2018-05-24 16:53:08",
ActiveCount:0,
PoolingCount:0,
CreateCount:0,
DestroyCount:0,
CloseCount:0,
ConnectCount:0,
Connections:[
]
}
2018-05-24 16:53:09.819  INFO 7588 --- [       Thread-1] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@624ea235: startup date [Thu May 24 16:53:06 CST 2018]; root of context hierarchy

Process finished with exit code 0

----------------------------------------------------------------------------------------------------------------------------------

然后启动main函数,进入首页

SpringBoot-Maven多模块开发测试

测试成功!

然后测试下Controller,测试成功!

SpringBoot-Maven多模块开发测试

SpringBoot-Maven多模块开发测试

到数据库查看,一切OK!

SpringBoot-Maven多模块开发测试

六、总结

IDEA创建多项目:

主要是使用maven的module模块进行管理,但项目之间没有必然联系的时候不适宜用module,

比如说像eclipse中的workspace显式方式:

SpringBoot-Maven多模块开发测试

IDEA目前还在学习中,有了解这块的小伙伴可以留言哈~~