Maven多模块管理应用
1.1 场景描述
- commonModel:提供公共的基础服务,比如工具类、常量类等
- bussinessModel:业务模块,是系统真正要实现的业务,依赖于common模块,比如订单管理、财务统计、会员管理等。
- application:可发布的web应用,由各个bussinessModel组成,最终满足项目整体需求
- 第三方模块:包含各类框架,Spring、MyBatis、日志等。整个应用都是依赖他们完成开发的。
1.2 使用多模块管理的意义
- Maven管理多模块应用的实现是互联网项目中多使用分布式开发,那么每个独立的服务都会使用独立的项目进行维护,那么这样就需要使用多模块的管理,来实现项目的高度统一。
- 因为在大的项目中,可能多个地方会用到同一个依赖,但是每个模块所写的依赖版本可能不同,这样就会造成依赖冲突。此时就需要使用一个父依赖来统一的管理这些依赖。
有pom.xml文件的一定是Mavne工程,没有pom.xml文件的一定不是Maven工程
pom叫做项目对象模型:(Project Object Module)。该文件是可以被子工程继承的。
1.3 第一种方式:创建Maven父工程
1.3.1展示子功能继承父工程
- 创建父工程的pom.xml文件
Maven多模块管理,其实就是让它的子模块的pom文件继承父工程的pom文件。
重点:Maven父工程必须遵循以下两点要求
- packaging标签的文本内容必须设置为pom
- 把src目录删除掉
- 只是简单额留下一个pom.xml文件
父工程的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.yunbocheng</groupId> <artifactId>Maven-parent</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>Maven</module> </modules> <pcakaging>pom</pcakaging> <!-- 父工程要加强管理子模块的所有依赖 作用:让子工程选择性的来继承父工程pom.xml文件中的依赖 这样可以避免大量依赖文件的浪费。 子类只需要指定引入依赖的 groupId、artifactId即可 而版本则使用父pom.xml中定义的这个版本号。 --> <dependencyManagement> <!-- 在父工程中给定项目所要用到的依赖 --> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> </dependencies> </dependencyManagement> <!-- 声明JDK的版本 --> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project> 复制代码
- 创建子工程,这个子工程继承这个父工程的pom.xml文件
注意:在创建子工程的时候,需要继承父工程
继承此父工程的pom.xml文件,此时的子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"> <!-- 指向父工程的GAV坐标 --> <parent> <artifactId>Maven-parent</artifactId> <groupId>com.yunbocheng</groupId> <version>1.0-SNAPSHOT</version> <!-- 给定继承父工程的pom.xml路径信息 --> <relativePath>../Maven多模块继承/pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <!-- 此时只能指定子类的工程名,版本号以及工程的路径要和父工程保持一致。 这样才可以获取到其中的父工程pom.xml文件。 --> <artifactId>Maven-childs</artifactId> <!-- 使用父工程中的依赖 --> <!--- 不需要指定版本号,只需要指定名称以及位置即可。 子模块依赖的版本号继承父工程的版本号。这样就不会造成版本号的冲突。 --> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <!-- 当子类指定特定的版本号的时候,此时就不会继承父工程的版本号--> <version>2.7.1</version> </dependency> </dependencies> <!-- 声明JDK的版本 --> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project> 复制代码
此时子工程引用的就是父工程的pom.xml中的依赖。
注意:当我们创建的时候忘记选择的时候,还可以手动添加这个父工程依赖。
1.3.2 父工程的最终管理
父工程最终管理的就是依赖的版本号
<?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"> <!-- Maven模块的版本号 --> <modelVersion>4.0.0</modelVersion> <!-- 组织id --> <groupId>com.yunbocheng</groupId> <!-- 项目名 --> <artifactId>Maven-parent</artifactId> <!-- 版本号码 --> <version>1.0-SNAPSHOT</version> <!-- 打包方式:pom、jar、war pom是给父项使用的,父项目用作项目的整合,maven install 之后,不会生成jar包或者war包。 jar:打包java项目使用的。是默认的打包方式。如果不给定packaging标签属性,就会打包为jar包 war:打包web项目使用。不过现在SpringBoot一般情况下也打包成jar包 --> <packaging>pom</packaging> <!-- 项目名称,maven生成文档用到,只起到说明的作用--> <name>${project.artifactId}</name> <!-- 同上,声明该pom.xml文件的地址 --> <url>https://github.com/pnoker/iot-dc3</url> <!-- 同上,成立年份--> <inceptionYear>2017-2020</inceptionYear> <!-- 针对该pom.xml文件的描述 --> <description> 针对多模块之间继承的父工程。实现分布式的功能。 </description> <!-- 声明继承该父工程的子工程 --> <modules> <module>dc3-gateway</module> <module>dc3-center</module> <module>dc3-transfer</module> <module>dc3-driver</module> <module>dc3-api</module> <module>dc3-common</module> </modules> <!-- properties中声明的是该工程的最提参数值 --> <properties> <!-- Maven依赖的JDK版本号 --> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <!-- 父管理依赖其实就是管理依赖的版本号 --> <!-- 这个版本号的标签是自定义的:一般是项目名称(artifactId)+字段version --> <!-- 语法为两种:项目名称.version 或者 项目名称-version --> <dubbo-version>2.6.2</dubbo-version> <lombok.version>1.18.22</lombok.version> <spring-boot-starter-test.version>2.6.2</spring-boot-starter-test.version> <spring-cloud.version>Hoxton.SR8</spring-cloud.version> <mybatis.plus.version>3.3.2</mybatis.plus.version> </properties> <!-- 实际导入的依赖,子模块将会继承这些依赖, 这种定义的方式缺点是:任何一个子模块一定会继承这些依赖 子模块不能进行选择性的继承哪些依赖。 --> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <!-- 使用EL表达式来获取这个依赖的版本号 --> <version>${dubbo-version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <!-- 使用EL表达式来获取这个依赖的版本号 --> <version>${lombok.version}</version> </dependency> <!-- Test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>${spring-boot-starter-test.version}</version> <!-- scope表示一个以来的作用范围,通常有一下几个取值 compile:默认值, 表示参与项目构建的一切流程 test: 仅仅测试阶段用到,项目打包的时候不会打包进去 runtime: 与compile相比,不参与编译,其他过程例如运行、测试等都参与。 provided: 但是打包的时候不包括他,其他所有流程都参与。 system: 和 systemPath一起用,从本地加载依赖。 作用范围和provided一样。 --> <scope>test</scope> <!-- exclusions 把不需要的部分排除在外 比如springboot不需要内置的tomcat时,就可以用这个排除 --> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <!-- 依赖管理,这个是依赖管理的加强。 区别于上面的dependencies,dependencyManagement只是“定义依赖”,并没有实际引入。 他的作用是提前定义版本号,子模块需要引入jar包时,就不需要再加版本了。 在 dependencyManagement 标签中声明的依赖。子模块可以选择性的继承,不必全部的继承。 --> <dependencyManagement> <dependencies> <!-- Spring Cloud 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Mybatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis.plus.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>${mybatis.plus.version}</version> </dependency> </dependencies> </dependencyManagement> <!--配置一些插件--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> </plugin> </plugins> </build> <!-- 开发者信息 --> <developers> <developer> <id>yunbocheng</id> <name>yunbocheng</name> <email>2484720940@qq.com</email> <organization>https://github.com/yunbocheng</organization> </developer> </developers> <!-- 项目使用的协议 --> <licenses> <license> <name>The Apache Software License, Version 2.0</name> <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> <distribution>repo</distribution> </license> </licenses> <!-- 打包上传到私服或者github, 需要和配置文件中的server节点配合使用 --> <distributionManagement> <repository> <id>github</id> <name>GitHub DC3 Apache Maven Packages</name> <url>https://maven.pkg.github.com/pnoker/iot-dc3</url> </repository> </distributionManagement> </project>
子模块还会无条件的继承父模块中的插件。
以上就是针对Maven多模块管理的一个操作以及针对pom.xml文件中内容的一个分析。