参考: https://www.iteye.com/blog/elim-2055745

maven基础回顾

maven通过groupdId:artifactId:version三者来唯一确定一个项目, 因此在pom.xml文件中这三者是必须配置的

  1. <groupId>org.example</groupId>
  2. <artifactId>demo-web</artifactId>
  3. <version>1.0-SNAPSHOT</version>

maven命令

参考: https://blog.csdn.net/shenzhou_yh/article/details/105988113

  1. 常见参数
  2. -D D代表Property属性 定义一个property, 示例$mvn clean package -Dmaven.test.skip=true
  3. -P P代表Profile, 激活指定的profile文件列表, 以逗号隔开, 示例$mvn clean package -P prod
  4. -f 使用指定的pom文件替换当前的pom文件
  5. -ff 最快失败模式, 多模块构建时, 遇到第一个失败的构建时停止
  6. -e 显示详细错误信息
  7. -am 构建指定模块, 同时构建指定模块依赖的其他模块
  8. -amd 构建指定模块, 同时构建依赖于指定模块的其他模块
  9. -pl 手动选择要构建的项目, 项目间以逗号隔开

maven中的属性

在pom.xml中可以使用${propertyName}来引用属性, propertyName有以下几种形式:

  • env.propertyName:环境变量,比如当前系统的环境变量${env.PATH}。
  • project.propertyName:当前这个pom.xml中project根元素下面的子元素的值。比如${project.version}。
  • settings.propertyName:Maven本地配置文件settings.xml或本地Maven安装目录下的settings.xml文件根元素settings下的元素。比如${settings.localRepository}
  • java的系统属性,所有在java中使用java.lang.System.getProperties()能够获取到的属性都可以在pom.xml中引用,比如${java.home}。
  • pom.xml中properties元素下面的子元素作为属性。假如在pom.xml中有如下一段代码helloWorld,那么我们就可以使用${hello.world}引用到对应的helloWorld。

资源文件的打包

maven允许资源文件中的值在编译时动态指定, 建立文件时以${propertyName}的形式指定. maven这种动态替换属性值的功能默认是关闭的,如果要打开的话需要在项目的pom.xml文件中指定filtering的值为true,默认是false

示例场景: 当项目资源路径下有excel等模板文件时, 若开启了filter后, 打包会将模板文件中的${变量}替换掉, 影响模板的正常功能, 因此需要配置将相关文件的filter设为false

  1. <build>
  2. <resources>
  3. <resource>
  4. <directory>src/main/resources</directory>
  5. <targetPath>${dist.path}</targetPath>
  6. <filtering>true</filtering>
  7. </resource>
  8. <resource>
  9. <directory>src/main/resources</directory>
  10. <targetPath>${dist.path}</targetPath>
  11. <filtering>false</filtering>
  12. <includes>
  13. <include>excel/**</include>
  14. <include>es/**</include>
  15. </includes>
  16. </resource>
  17. </resources>
  18. </build>

多模块之间的关系

继承

形成继承关系需要在子项目pom.xml中定义指向父项目parent标签

继承的作用:
和java里面的继承类似,子pom.xml会完全继承父pom.xml中所有的元素,而且对于相同的元素,一般子pom.xml中的会覆盖父pom.xml中的元素,但是有几个特殊的元素它们会进行合并而不是覆盖。这些特殊的元素是:

  • dependencies
  • developers
  • contributors
  • plugin列表,包括plugin下面的reports
  • resources ```json 示例: 工程结构如下, B在A项目目录下 projectA —projectB ——————-projectB的pom.xml———————- <?xml version=”1.0” encoding=”UTF-8”?>
4.0.0 projectA org.example 1.0-SNAPSHOT projectB

注意: 若A与B在同级目录, 须通过relativePath指定父工程的pom.xml位置, relativePath指的是目录路径 —projectA —projectB ——————-projectB的pom.xml———————- <?xml version=”1.0” encoding=”UTF-8”?>

4.0.0

  1. <parent>
  2. <artifactId>projectA</artifactId>
  3. <groupId>org.example</groupId>
  4. <version>1.0-SNAPSHOT</version>
  5. <relativePath>../projectA/pom.xml</relativePath>
  6. </parent>
  7. <artifactId>projectB</artifactId>

  1. <a name="pd5GF"></a>
  2. #### 聚合
  3. 示例: 工程结构如下, B在A项目目录下
  4. <br />projectA
  5. <br />--projectB<br />如示例的工程结构, B项目聚合到A项目, 可以说B是A的子模块, A是被聚合的项目, 也是聚合的主体
  6. 形成聚合关系需要:
  7. 1. 修改被聚合项目的pom.xml中的packaging元素的值为pom
  8. 1. 在**主体项目**pom.xml中定义**聚合项目**为`module`
  9. 聚合的作用:<br />在主体项目目录下使用maven命令时, 这些命令都会在聚合项目下执行.
  10. ```json
  11. 示例: 工程结构如下, B在A项目目录下
  12. projectA
  13. --projectB
  14. -------------projectA的pom.xml---------------
  15. <?xml version="1.0" encoding="UTF-8"?>
  16. <project xmlns="http://maven.apache.org/POM/4.0.0"
  17. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  19. <modelVersion>4.0.0</modelVersion>
  20. <groupId>org.example</groupId>
  21. <artifactId>projectA</artifactId>
  22. <packaging>pom</packaging>
  23. <version>1.0-SNAPSHOT</version>
  24. <modules>
  25. <module>projectB</module>
  26. </modules>
  27. 注意: 若A与B在同级目录, 须在module中指定正确的目录路径
  28. --projectA
  29. --projectB
  30. -------------projectA的pom.xml---------------
  31. <?xml version="1.0" encoding="UTF-8"?>
  32. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  33. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  34. <modelVersion>4.0.0</modelVersion>
  35. <groupId>org.example</groupId>
  36. <artifactId>projectA</artifactId>
  37. <packaging>pom</packaging>
  38. <version>1.0-SNAPSHOT</version>
  39. <modules>
  40. <module>../projectB</module>
  41. </modules>
  42. </project>

Reactor

参考: https://blog.csdn.net/weixin_30408309/article/details/94972603
对于多模块的项目, maven的Reactor包含了各模块之间继承与依赖的关系, 从而能自动计算出合理的模块构建顺序.

  • 当需要构建整个项目时, 直接在项目目录下执行maven命令
  • 当只需要构建某个模块时, 就需要对反应堆进行裁剪
    1. 示例: 以下命令表示构建模块A并且构建A依赖的其他模块
    2. mvn clean package -Dmaven.test.skip=true -pl moduleA -am

依赖

  1. <dependency>
  2. <groupId>xxx</groupId>
  3. <artifactId>xxx</artifactId>
  4. <version>xxx</version>
  5. <type>jar</type> // 依赖项目的打包类型, 默认jar
  6. <scope>compile</scope>
  7. // 表示依赖项目的作用范围:
  8. - compile, 默认值, 表示所有情况有效, 且可传递
  9. - provided, 测试和编译有效, 运行时将有jdk或容器提供, 不可传递
  10. - runtime, 运行时必须
  11. - test, 测试时必须
  12. - system, 类似provided, 结合systemPath使用
  13. <systemPath></systemPath> // 指定依赖的jar包在系统的绝对路径, 只在scopesystem时才可以使用
  14. <optional></optional> // 可选的
  15. <exclusions> // 排除依赖
  16. <exclusion>
  17. <artifactId></artifactId>
  18. <groupId></groupId>
  19. </exclusion>
  20. </exclusions>
  21. </dependency>

补充: 只能有一个父工程, 其他依赖可以通过import方式导入

  1. <!--springboot-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-dependencies</artifactId>
  5. <version>2.1.3.RELEASE</version>
  6. <type>pom</type>
  7. <scope>import</scope>
  8. </dependency>

多模块聚合工程的构建

由上面的总结, 一般多模块项目都会定义成父子以及聚合结构, 其中

  • 父子结构: 父pom.xml中统一定义依赖版本以及插件版本, 子工程无需对版本进行管理
  • 聚合结构: 用于构建项目时, 子工程一并构建, 但此时若要单独构建子工程, 则需要配合-pl am命令食用

    1. 示例项目结构:
    2. demo-cloud
    3. --demo-common // 定义通用实体
    4. --demo-web // 定义web接口, 依赖于demo-common

    demo-cloud父工程的pom.xml ```xml <?xml version=”1.0” encoding=”UTF-8”?> <project xmlns=”http://maven.apache.org/POM/4.0.0

    1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0

    org.example demo-cloud pom 1.0-SNAPSHOT

    demo-web demo-common 1.8 ${basedir}/../target 1.8 1.8 UTF-8 1.0-SNAPSHOT

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.example</groupId>
    4. <artifactId>demo-common</artifactId>
    5. <version>${project.version}</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.example</groupId>
    9. <artifactId>demo-web</artifactId>
    10. <version>${project.version}</version>
    11. </dependency>
  1. <!--springboot-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-dependencies</artifactId>
  5. <version>2.1.3.RELEASE</version>
  6. <type>pom</type>
  7. <scope>import</scope>
  8. </dependency>
  9. <!--fastjson-->
  10. <dependency>
  11. <groupId>com.alibaba</groupId>
  12. <artifactId>fastjson</artifactId>
  13. <version>1.2.33</version>
  14. </dependency>
  15. </dependencies>
  16. </dependencyManagement>

org.springframework.boot spring-boot-maven-plugin 2.1.3.RELEASE

  1. demo-web工程的pom.xml
  2. ```xml
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <project xmlns="http://maven.apache.org/POM/4.0.0"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  7. <modelVersion>4.0.0</modelVersion>
  8. <parent>
  9. <artifactId>demo-cloud</artifactId>
  10. <groupId>org.example</groupId>
  11. <version>1.0-SNAPSHOT</version>
  12. </parent>
  13. <artifactId>demo-web</artifactId>
  14. <dependencies>
  15. <dependency>
  16. <groupId>org.example</groupId>
  17. <artifactId>demo-common</artifactId>
  18. </dependency>
  19. <!--springbootTest-->
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-test</artifactId>
  23. <scope>test</scope>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-web</artifactId>
  28. </dependency>
  29. <!--fastjson-->
  30. <dependency>
  31. <groupId>com.alibaba</groupId>
  32. <artifactId>fastjson</artifactId>
  33. </dependency>
  34. </dependencies>
  35. <build>
  36. <plugins>
  37. <plugin>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-maven-plugin</artifactId>
  40. <executions>
  41. <execution>
  42. <goals>
  43. <goal>repackage</goal>
  44. </goals>
  45. </execution>
  46. </executions>
  47. </plugin>
  48. </plugins>
  49. </build>
  50. </project>

demo-common工程的pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <artifactId>demo-cloud</artifactId>
  8. <groupId>org.example</groupId>
  9. <version>1.0-SNAPSHOT</version>
  10. </parent>
  11. <artifactId>demo-common</artifactId>
  12. </project>

此时若要单独构建demo-web(以及需要将依赖的demo-common打包进来), 在demo-cloud目录下命令如下

  1. \demo-cloud> $mvn clean package -Dmaven.test.skip=true -pl ./demo-web -am