第一步:创建父项目
File->New->Maven Project
选择创建一个简单工程
点击Next,在下一步中,Group Id 和 Artifact Id 可以根据项目情况任意填写,Packaging需要设置为POM
新创建的项目中,需要把src删了,父项目的内容应该由模块自动填充
第二步:创建子模块
选中父项目,右键,New->Project
选择创建一个 Maven Module
在这里我名字写的是csdn-service
同样的方法,创建 csdn-controller 模块
第三步:开始改造
这是我的原springboot项目,在 https://start.spring.io/ 生产的Maven Project的基础上编码的
我们先把原springboot项目的pom.xml里下面三个元素复制给父项目的pom.xml
注意不需要复制build, build应该只配置给controller
这是父项目复制完成后的pom.xml , 这里 <modules>
元素是刚才创建模块时自动生成的
<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>net.logicforeach</groupId>
<artifactId>csdn-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>csdn-service</module>
<module>csdn-controller</module>
</modules>
<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-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.5</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
将原springboot项目里的包复制到相应模块,如下面选中部分应该复制到service模块中(这里为了演示,将model与dao都复制给了service,实际项目中视情况决定是否开辟新的模块),对了,别忘记更新maven项目
eclipse中,选中父项目创建的模块,会自动继承父项目,这里service模块继承了父项目的依赖,所以不会报错
将其余包复制给controller模块
我们发现controller有报错,这是因为我们没还没有配置模块间的依赖关系,显然controller模块是依赖service模块的,所以我们需要在controller模块的pom.xml配置
<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>
<parent>
<groupId>net.logicforeach</groupId>
<artifactId>csdn-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>csdn-controller</artifactId>
<dependencies>
<dependency>
<groupId>net.logicforeach</groupId>
<artifactId>csdn-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意: <parent>
元素是由eclipse在创建创建模块时自动创建的,每一个子模块都会自动继承父项目的pom , <build>
复制自原springboot项目的pom.xml,因为service模块最后只需要输出个jar供controller模块调用就好,而controller模块则需要按照springboot的规矩去生成war,所以这里要在controller模块单独填上<build>
元素,如果把这个元素写在了父项目的pom.xml会导致找不到主类而打包失败
别忘记将配置文件也复制到controller模块
至此已经改造完成,运行下启动类,看看有没有啥问题,我这项目用启动类启动成功了,应该没啥问题了,下一步就是研究研究怎么打包成war了
第四步:打包成war
此时,打包成war也没啥特殊的,只需要对controller模块进行修改即可,和spring项目打包成war的方法类似,依旧是三步走
修改pom.xml 将打包方式设置为 war
改变依赖范围 , 屏蔽内置Tomcat插件
controller模块或父项目的模块的pom.xml中加入这个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
修改启动类,继承并重写
第五步:开始打包
点击父项目,右键->Run as-> Maven build
run! 没毛病
F5一下,可以看到已经打包成war了
一些个人理解
显然maven的多模块提高了各个模块的重用率,在良好的习惯和统一的规范下,可以加快开发速度,下面是我对<modules>
元素的一些理解.
<modules>
不是必须的 , 事实上仅通过继承,也能实现一个项目引用另一个项目, 但是会出现很多问题, 比如spring的autowrited找不到对应的bean,jar包被重复引用,也就是说不用<modules>
,两个模块的资源不会共享,各玩各的…<modules>
模块可以将各个模块聚合在一起,虽然在此例中,我们只需要对父项目进行打包操作,但maven会在经过拓扑排序后,依次将子模块打包,如果不用<modules>
元素,我们可能需要手动为每个模块打包- 父项目聚合多模块的模式,既为我们通过了宏观的视角,也允许我们微观的修改,在父项目中,我们可以看到所有模块的内容都以文件夹的形式存在于父项目中,但是这不是利于编程的视角,我们可以把每个模块当做一个单独的项目去修改,在eclipse中,模块与父项目的导航是在同一级的,外面的修改会同步父项目内的修改,反之是.