Maven学习笔记 标签以及多模块

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Maven学习笔记 标签以及多模块

一、Maven插件


1.1、jdk1.8


编译插件jdk1.8


<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>


二、pom.xml中的标签


pom.xml中<scope>

关于maven依赖中的scope的作用和用法:https://blog.csdn.net/qq_36874292/article/details/81072717


compile(默认):compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。默认的scope,在部署的时候将会打包到lib目录下,项目在编译测试运行阶段都需要


test:表示依赖项目仅仅参与测试相关的工作,在编译和运行环境下都不会被使用,更别说打包了


provided:适合在编译和测试的环境,他和compile很接近,但是provide仅仅需要在编译和测试阶段,同样provide将不会被打包到lib目录下。



Pom.xml中相关标签

上传到nexus私服


<!-- 使用分发管理将本项目打成jar包,直接上传到指定服务器 -->
<distributionManagement>
    <!--正式版本-->
    <repository>
        <!-- nexus服务器中用户名:在settings.xml中<server>的id-->
        <id>yang</id>
        <!-- 这个名称自己定义 -->
        <name>Release repository</name>
        <url>http://192.168.1.105:8081/repository/yang/</url>
    </repository>
    <!--快照
    <snapshotRepository>
        <id>nexus-snapshots</id>
        <name>Snapshots repository</name>
        <url>http://192.168.1.105/repository/yang/</url>
    </snapshotRepository>-->
</distributionManagement>


< repository >节点下的< id >对应setting.xml文件中的server的id
在settings.xml中设置对应的登录用户名与密码:
<!--maven连接nexus需要验证用户名和密码-->
<server>
    <id>yang</id>
    <username>admin</username>
    <password>admin123</password>
</server>


注意点:上传正式版本,pom.xml文件version中不能有SNAPSHOT,快照版本才有。


如:


<groupId>com.yang</groupId>
<artifactId>shade-plugin</artifactId>
<version>0.0.1</version>



三、Maven多模块开发


3.1、Pom.xml多模块结构



Maven配置文件:


<?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>
    <!-- 设置父模块   -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.10.RELEASE</version>
        <relativePath />
    </parent>
    <!-- 定义本项目的工程坐标   -->
    <groupId>com.changlu</groupId>
    <artifactId>springboot-mall</artifactId>
    <version>1.0.0</version>
    <!-- 工程中仅有一个pom.xml时需要声明,表示其是一个管理包   -->
    <packaging>pom</packaging>
    <!-- 声明子模块   -->
    <modules>
        <module>mall-admin</module>
        <module>mall-common</module>
        <module>mall-controller</module>
        <module>mall-service</module>
        <module>mall-admin</module>
    </modules>
    <!-- 定义版本   -->
    <properties>
        <java.version>1.8</java.version>
        <mybatis-plus.version>3.4.0</mybatis-plus.version>
    </properties>
    <!-- 设置依赖   -->
    <dependencies>
  <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
    </dependencies>
</project>



modules:管理模块。


parent:定义父模块。


properties:定义属性名,用于进行版本管理。



3.2、聚合与继承的关系


1、聚合主要是为了方便快速构建项目,继承主要是为了消除重复配置


2、对于聚合模块而言,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在;对于继承的父pom 而言,它不知道有哪些子模块继承它,但那些子模块都必须知道自己的父pom 是什么


3、聚合pom 与继承中的父pom 的 packaging 都必须是 pom;同时,聚合模块与继承中的父模块除了 pom 外,都没有实际的内容。



3.3、多模块实操


3.3.1、pom.xml介绍


在子模块中最好都不要出现版本,统一由父工程来进行管理版本。



其中oa-web、oa-admin为web工程,其他都是可以进行复用的公共模块。


对于公共模块,直接新建普通的maven工程,选择moduleexer作为父工程即可!

moduleexer为父模块,用于统一管理内部的模块,首先介绍moduleexer工程中的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--  模块管理  -->
    <modules>
        <module>oa-common</module>
        <module>oa-dao</module>
        <module>oa-common</module>
        <module>oa-service</module>
        <module>oa-web</module>
        <module>oa-admin</module>
        <module>oa-model</module>
    </modules>
    <!-- 将其作为父模块  -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.changlu</groupId>
    <artifactId>moduleexer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- 聚合模块父模块务必设置packaging为pom,默认jar会打成一个jar包  -->
    <packaging>pom</packaging>
    <!--  自定义属性,统一进行版本管理   -->
    <properties>
        <oa-version>0.0.1-SNAPSHOT</oa-version>
        <mybatis-spring-starter-version>2.1.2</mybatis-spring-starter-version>
        <mysql-connector-version>8.0.23</mysql-connector-version>
    </properties>
    <!--  父工程统一进行版本管理   -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.changlu</groupId>
                <artifactId>oa-model</artifactId>
                <version>${oa-version}</version>
            </dependency>
            <dependency>
                <groupId>com.changlu</groupId>
                <artifactId>oa-dao</artifactId>
                <version>${oa-version}</version>
            </dependency>
            <dependency>
                <groupId>com.changlu</groupId>
                <artifactId>oa-service</artifactId>
                <version>${oa-version}</version>
            </dependency>
            <dependency>
                <groupId>com.changlu</groupId>
                <artifactId>oa-common</artifactId>
                <version>${oa-version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis-spring-starter-version}</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql-connector-version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>



外部父模块中不需要引入依赖,可以进行依赖版本的管理,其子模块在添加依赖时只要是父模块管理的就可以不用写版本,由父模块来同一进行控制!


接下来我们啦看看对应的公共模块各自的pom.xml:


oa-dao:用于编写公共dao,可以看到其父模块为moduleexer,引入的依赖并没有进行设置版本,由父模块来进行管理!


引入公共模块:oa-common、oa-model
<?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>moduleexer</artifactId>
        <groupId>com.changlu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>oa-dao</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.changlu</groupId>
            <artifactId>oa-model</artifactId>
        </dependency>
        <dependency>
            <groupId>com.changlu</groupId>
            <artifactId>oa-common</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*/xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>
</project>



oa-model:在模型层,我们仅仅只需要引入指定的插件依赖即可


<?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>moduleexer</artifactId>
        <groupId>com.changlu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>oa-model</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>



oa-service:用于编写service层


引入公共模块:oa-dao,由于oa-dao已经引入oa-model,所以不需要重复引入。
...
  <dependencies>
        <dependency>
            <groupId>com.changlu</groupId>
            <artifactId>oa-dao</artifactId>
        </dependency>
    </dependencies>
...


接下来就是web模块了:oa-web,在这里我们就需要引入spring-boot-starter-web模块了


引入公共模块:oa-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">
    <parent>
        <artifactId>moduleexer</artifactId>
        <groupId>com.changlu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>oa-web</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <!--    引入web模块   -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.changlu</groupId>
            <artifactId>oa-service</artifactId>
        </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>


此时我们就已经把大致内容介绍完了,对于oa-common与oa-admin(后台web模块)就不再展示了。



3.3.2、多模块运行测试


sql语句:创建与插入用户表


DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL COMMENT 'id',
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'changlu', '123456');
INSERT INTO `user` VALUES (2, 'liner', '456789');


@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
}



//UserMapper
@Mapper
public interface UserMapper {
    /**
     * 查询所有用户
     * @return 用户集合
     */
    List<User> queryUserList();
}
//UserMapper.xml
<?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">
<!-- 设置指定的namespace -->
<mapper namespace="com.changlu.mapper.UserMapper">
    <!--  根据username获取User对象  -->
    <select id="queryUserList" resultType="User">
        select * from user
    </select>
</mapper>




public interface IUserService {
    List<User> queryUserList();
}
@Service
public class UserServiceImpl implements IUserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public List<User> queryUserList() {
        return userMapper.queryUserList();
    }
}




@RestController
public class UserController {
    @Autowired
    private IUserService userService;
    @GetMapping("/user")
    public  List<User> userList(){
        return  userService.queryUserList();
    }
}


server:

 port: 8088


# 配置mybatis数据源
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?setTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
# 整合mybatis,实体类包配置和mapper映射地址
mybatis:
  type-aliases-package: com.changlu.entity
  mapper-locations: classpath:mapper/*.xml


此时我们来启动springboot,即oa-web工程,接着使用postman来进行测试:



测试成功。总结一下吧,使用maven多模块能够更加方便的进行模块复用与解耦,例如管理后台,前台以及app这类web工程就能够很好的复用model以及common模块了,并且我们也能够更好的进行版本的管理!



四、deploy module


参考文章:Maven聚合项目deploy指定module

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
Java API Maven
IDEA+Maven+多个Module模块(创建多模块SpringBoot整合项目)
IDEA+Maven+多个Module模块(创建多模块SpringBoot整合项目)
413 1
|
3月前
|
Java 应用服务中间件 测试技术
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
Maven 是一款 Java 项目构建工具,主要用于管理 jar 包及其依赖关系。 本文主要了解Maven基础知识及基础应用,旨在为之后的进一步学习奠定基础。 内容上几近全为学习《尚硅谷2022版Maven教程》整理所得。 仅供参考。
287 81
Maven学习笔记(一):Maven基础(基于命令行的学习和应用)
|
1月前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
128 8
|
2月前
|
Java Devops 持续交付
Maven学习笔记(二):Maven基础(基于IDEA)
【10月更文挑战第1天】Maven 是一款 Java 项目构建工具,主要用于管理 jar 包及其依赖关系。上一篇简单介绍了Maven的基础知识,本文主要介绍IDEA上的实际使用场景。内容上几近全为学习《尚硅谷2022版Maven教程》整理所得。仅供参考。
192 0
Maven学习笔记(二):Maven基础(基于IDEA)
|
4月前
|
Java jenkins Shell
jenkins学习笔记之五:Maven、Ant、Gradl、Node构建工具集成
jenkins学习笔记之五:Maven、Ant、Gradl、Node构建工具集成
|
4月前
|
Java 测试技术 Maven
Maven学习笔记
这篇文章是关于Maven的学习笔记,包括Maven简介、项目构建工具比较、Maven的四大属性(依赖管理、多模块构件、一致的项目结构、一致的构件模型和插件机制)、Maven的安装和配置、IDEA集成Maven环境,以及Maven项目创建、仓库概念、多模块项目构建、打包操作和依赖概念的详细介绍。
|
4月前
|
Java jenkins 持续交付
jenkins学习笔记之十七:使用插件及maven上传制品到nexus
jenkins学习笔记之十七:使用插件及maven上传制品到nexus
|
5月前
|
Java 测试技术 Maven
maven总结二: 常用标签及属性
maven总结二: 常用标签及属性
45 3
|
6月前
|
Java Maven Perl
解决Maven父子多模块打包互相引用打包:必须父模块才能打包成功,单个子模块无法打包成功问题(会提示找不到)
解决Maven父子多模块打包互相引用打包:必须父模块才能打包成功,单个子模块无法打包成功问题(会提示找不到)
845 4
|
6月前
|
SpringCloudAlibaba Java Maven
关于拆分boot工程的踩坑之maven多模块间的依赖关系处理
关于拆分boot工程的踩坑之maven多模块间的依赖关系处理