SpringBoot23 分模块开发
1 开发环境说明
JDK:1.8
MAVEN:3.5
IDEA:2017.2.5
SpringBoot:2.0.3.RELEASE
2 创建SpringBoot项目
2.1 项目信息
2.2 添加项目依赖
2.3 修改pom文件
添加lombok依赖、修改devtools、修改plugin
<?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>cn.xiangxu</groupId> <artifactId>module-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>module-demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.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-devtools</artifactId> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.0</version> <scope>provided</scope> </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> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> </build> </project>
3 逻辑功能实现
实现简单的增删改查,利用map来模拟内存数据库
3.1 包结构
3.2 model层
package cn.xiangxu.moduledemo.model; import lombok.Data; /** * @author 王杨帅 * @create 2018-07-26 22:16 * @desc 学生实体类 **/ @Data public class Student { private Integer id; private String name; }
3.3 repository层
package cn.xiangxu.moduledemo.repository; import cn.xiangxu.moduledemo.model.Student; import org.springframework.stereotype.Repository; import java.util.Collection; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; /** * @author 王杨帅 * @create 2018-07-26 22:17 * @desc 学生持久层 **/ @Repository public class StudentRepository { /** * 利用Map模拟内存数据库 */ private final ConcurrentMap<Integer, Student> repository =new ConcurrentHashMap<>(); /** * 主键发生器 */ private final static AtomicInteger idGenerator = new AtomicInteger(); /** * 新增 * @param student * @return */ public Student save(Student student) { // 产生ID Integer id = idGenerator.incrementAndGet(); student.setId(id); student.setName(student.getName() + id); repository.put(id, student); return student; } /** * 获取列表 * @return */ public Collection<Student> findAll() { return repository.values(); } }
3.4 web层
package cn.xiangxu.moduledemo.controller; import cn.xiangxu.moduledemo.model.Student; import cn.xiangxu.moduledemo.repository.StudentRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Collection; /** * @author 王杨帅 * @create 2018-07-26 22:23 * @desc 学生控制层 **/ @RestController @RequestMapping(value = "/student") @Slf4j public class StudentController { @Autowired private StudentRepository studentRepository; @GetMapping public Collection<Student> findAll() { return studentRepository.findAll(); } @PostMapping public Student save(@RequestBody Student student) { return studentRepository.save(student); } @GetMapping(value = "/connect") public String connect() { String result = "前后端连接成功"; log.info(result); return result; } }
3.5 启动应用并进行测试
》新增
》查询列表
3.6 打包
进入到项目根目录执行:mvn -Dmaven.test.skip -U clean package
技巧01:执行完后会在根目录下的target目录下生成class文件和打包文件
3.7 执行jar包
技巧01:进入到jar包所在文件夹执行:java -jar jar包名称
3.8 重复3.5操作
4 分模块
需求:在上面的例子中,将model、repository、controller都写在了一个模块中;现在需要将它们写在不同的模块中
4.1 修改当前项目的pom.xml文件
将打包方式从jar改成pom,让当前项目作为主模块
4.2 新建一个web模块
技巧01:右键单击主模块根文件夹 -> module -> maven
技巧02:子模块创建成功后会放在父模块根目录下
技巧03:新建完成后,在主模块中会出现子模块的相关信息,在子模块中也会将主模块作为父模块
4.2.1 代码移动
技巧01:设置子模块的文件夹, 左键单击子模块文件夹 -> file菜单 -> projectstructure
技巧02:将父模块中的src的java文件中的所哟文件移动到web模块中src的java文件中,resources和test做类似的操作
技巧03:直接利用鼠标选中拖动就行啦,弹出的提示框要选择移动所有选项;再次弹出的选择continue
技巧04:移动完成后刷新maven
技巧05:刷新maven后进入到主函数启动应用进行测试
4.3 创建model模块和repository模块
将model相关的移动到model模块,将repository相关的移动到repository模块
技巧01:包名要保持一致,这样是为了不用改动代码
坑01:移动完成后会有代码报错,因为repository依赖model,web又依赖repository
解决01:在repository模块中引入model依赖,在web模块中引入repository依赖
技巧02:依赖引入后刷新maven
技巧03:找到main函数启动测试
5 打包
5.1 进入到主模块执行:mvn -Dmaven.test.skip -U clean package
-Dmaven.test.skip -> 跳过测试
-U -> 更新包
clean -> ??
坑01:提示找不到main函数
解决01:在maven插件中添加main函数的路径【注意:maven插件的相关信息在主模块的pom.xml中,而main函数在web模块中】
坑02:再次启动时提示一些包找不到
原因02:maven相关配置和main函数不在一个模块时就会报这种错误
解决02:将maven相关的配置信息移动到main函数所在的那个模块【本案例是将主模块中的maven配置信息移动到web模块中去】
技巧01:移动完后再次执行 mvn -Dmaven.test.skip -U clean package
5.2 通过jar包启动应用
技巧01:由于maven的相关配置在web模块下,所以产生的jar信息在web模块下的target文件中
技巧02:进入到web模块的target文件夹,启动相关jar包即可
5.3 重复3.5操作
6 分模块后的源代码
·下面是我的公众号二维码,欢迎关注·
尋渝記
微信号:xyj_fury