| 知乎专栏 |
对于大型互联网项目,不可能把所有代码都放在一个项目目录下,常常会将一个项目拆分成多个子项目
例如一个电商系统
在开发过程中常常会遇到这种需求,有一个部分代码是共用的,所有项目都会使用到。所以需要将这部分代码独立成一个项目。
测试目录深度
Project
|
|--- common -> https://example.com/xxxx/common.git
| | ---pom.xml
|--- project1
| |--- pom.xml
|--- project2
| |--- pom.xml
|---pom.xml
common 是公共项目,独立仓库。通过git submodule 技术挂载到项目目录。project1,project2 构建依赖 common 项目产生的 jar 包。
例 23.4. Maven parent
<?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>demo</groupId>
<artifactId>maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>maven</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>${maven.compiler.source}</maven.compiler.target>
<junit.jupiter.version>5.4.0</junit.jupiter.version>
</properties>
<dependencies>
</dependencies>
<modules>
<module>project1</module>
<module>project2</module>
<module>common</module>
</modules>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
</plugins>
</build>
</project>
注意
<packaging>pom</packaging> 必须是 pom
项目下面的子模块
<modules>
<module>project1</module>
<module>project2</module>
<module>common</module>
</modules>
例 23.5. watir-webdriver example
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>demo</groupId> <artifactId>maven</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>demo</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> <name>common</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> </dependencies> </project>
添加 parent 标签, 声明项目的父子关系
<parent>
<groupId>demo</groupId>
<artifactId>maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>demo</groupId> <artifactId>maven</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>demo</groupId> <artifactId>project1</artifactId> <version>0.0.1-SNAPSHOT</version> <name>project1</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>demo</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
声明项目的父子关系
<parent>
<groupId>demo</groupId>
<artifactId>maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
由于 project1 依赖 common 加入下面依赖
<dependency> <groupId>demo</groupId> <artifactId>common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
project2 跟 project1 类似
在父项目目录运行 mvn package
neo@MacBook-Pro ~/workspace/maven % mvn package [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] maven [pom] [INFO] common [jar] [INFO] project1 [jar] [INFO] project2 [jar] [INFO] [INFO] -----------------------------< demo:maven >----------------------------- [INFO] Building maven 0.0.1-SNAPSHOT [1/4] [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] ----------------------------< demo:common >----------------------------- [INFO] Building common 0.0.1-SNAPSHOT [2/4] [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ common --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/neo/workspace/maven/common/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ common --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ common --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/neo/workspace/maven/common/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ common --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:3.0.0-M3:test (default-test) @ common --- [INFO] [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] [INFO] Results: [INFO] [INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ common --- [INFO] Building jar: /Users/neo/workspace/maven/common/target/common-0.0.1-SNAPSHOT.jar [INFO] META-INF/maven/demo/common/pom.xml already added, skipping [INFO] META-INF/maven/demo/common/pom.properties already added, skipping [INFO] [INFO] ---------------------------< demo:project1 >---------------------------- [INFO] Building project1 0.0.1-SNAPSHOT [3/4] [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ project1 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/neo/workspace/maven/project1/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ project1 --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ project1 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/neo/workspace/maven/project1/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ project1 --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/neo/workspace/maven/project1/target/test-classes [INFO] [INFO] --- maven-surefire-plugin:3.0.0-M3:test (default-test) @ project1 --- [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ project1 --- [INFO] Building jar: /Users/neo/workspace/maven/project1/target/project1-0.0.1-SNAPSHOT.jar [INFO] META-INF/maven/demo/project1/pom.xml already added, skipping [INFO] META-INF/maven/demo/project1/pom.properties already added, skipping [INFO] [INFO] ---------------------------< demo:project2 >---------------------------- [INFO] Building project2 0.0.1-SNAPSHOT [4/4] [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ project2 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/neo/workspace/maven/project2/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ project2 --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ project2 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/neo/workspace/maven/project2/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ project2 --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/neo/workspace/maven/project2/target/test-classes [INFO] [INFO] --- maven-surefire-plugin:3.0.0-M3:test (default-test) @ project2 --- [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ project2 --- [INFO] Building jar: /Users/neo/workspace/maven/project2/target/project2-0.0.1-SNAPSHOT.jar [INFO] META-INF/maven/demo/project2/pom.xml already added, skipping [INFO] META-INF/maven/demo/project2/pom.properties already added, skipping [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for maven 0.0.1-SNAPSHOT: [INFO] [INFO] maven .............................................. SUCCESS [ 0.006 s] [INFO] common ............................................. SUCCESS [ 2.317 s] [INFO] project1 ........................................... SUCCESS [ 0.539 s] [INFO] project2 ........................................... SUCCESS [ 0.101 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.115 s [INFO] Finished at: 2019-02-28T17:03:29+08:00 [INFO] ------------------------------------------------------------------------ neo@MacBook-Pro ~/workspace/maven %
我们可以看到有三个包产生
neo@MacBook-Pro ~/workspace/maven % find . -iname '*.jar' ./project1/target/project1-0.0.1-SNAPSHOT.jar ./common/target/common-0.0.1-SNAPSHOT.jar ./project2/target/project2-0.0.1-SNAPSHOT.jar
我们也可以单独编译子项目
neo@MacBook-Pro ~/workspace/maven/project1 % mvn package [INFO] Scanning for projects... [INFO] [INFO] ---------------------------< demo:project1 >---------------------------- [INFO] Building project1 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ project1 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/neo/workspace/maven/project1/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ project1 --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/neo/workspace/maven/project1/target/classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ project1 --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/neo/workspace/maven/project1/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ project1 --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/neo/workspace/maven/project1/target/test-classes [INFO] [INFO] --- maven-surefire-plugin:3.0.0-M3:test (default-test) @ project1 --- [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ project1 --- [INFO] Building jar: /Users/neo/workspace/maven/project1/target/project1-0.0.1-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.015 s [INFO] Finished at: 2019-02-28T17:09:18+08:00 [INFO] ------------------------------------------------------------------------
共享库 common-0.0.1-SNAPSHOT.jar 已经安装到 ~/.m2 目录下。
neo@MacBook-Pro ~/workspace/maven/project1 % find ~/.m2 -iname 'common-0.0.1-SNAPSHOT.jar' /Users/neo/.m2/repository/demo/common/0.0.1-SNAPSHOT/common-0.0.1-SNAPSHOT.jar