《Netkiller Project 手札》·Jenkins 如何构建 Maven module 以及共享库

Netkiller Project 手札

Mr. Neo Chan, 陈景峯(BG7NYT)


中国广东省深圳市望海路半岛城邦三期
518067
+86 13113668890

<netkiller@msn.com>html

MMDVM Hotspot: 

YSF80337 - CN China 1 - W24166/TG46001
BM_China_46001 - DMR Radio ID 4600441java

 

$Date: 2013-04-10 15:03:49 +0800 (Wed, 10 Apr 2013) $git

2009-12-12github

版权 © 2009-2019 Neo Chanweb

 

版权声明apache

转载请与做者联系,转载时请务必标明文章原始出处和做者信息及本声明。微信

http://www.netkiller.cn
http://netkiller.github.io
http://netkiller.sourceforge.net
微信订阅号 netkiller-ebook (微信扫描二维码)
QQ:13721218 请注明“读者”
QQ群:128659835 请注明“读者”

 

系列文档:maven

Netkiller Linux 手札 Netkiller FreeBSD 手札 Netkiller Shell 手札
Netkiller Security 手札 Netkiller Web 手札 Netkiller Monitoring 手札
Netkiller Storage 手札 Netkiller Mail 手札 Netkiller Virtualization 手札

2.3.5. Maven Module

对于大型互联网项目,不可能把全部代码都放在一个项目目录下,经常会将一个项目拆分红多个子项目单元测试

例如一个电商系统测试

  1. 网站
  2. 资讯中心
  3. 商品中心
  4. 物流中心
  5. 订单中心
  6. 客服中心
  7. 后台

在开发过程当中经常会遇到这种需求,有一个部分代码是共用的,全部项目都会使用到。因此须要将这部分代码独立成一个项目。

测试目录深度

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 包。

2.3.5.1. Parent

 

例 2.2. 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>

2.3.5.2. 公共项目 common

 

例 2.3. 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>

2.3.5.3. 常规项目

<?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 相似

2.3.5.4. 如今测试效果

在父项目目录运行 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

 

Jenkinfiles Maven 子模块范例

Maven 子模块建立方法 https://www.netkiller.cn/java/build/maven.html#maven.module

目录结构

Project
    |
    |--- common (Shared)
    |     | ---pom.xml
    |--- project1 (depend common)
    |     |--- pom.xml
    |--- project2 (depend common)
    |     |--- pom.xml
    |---pom.xml

构建 父项目

pipeline {
    agent {
        label "default"
    }
    stages  {
        
        stage("检出") {
            steps {
                checkout(
                  [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
                )
            }
        }

        stage("构建") {
            steps {
                echo "构建中..."
              	sh 'mvn package -Dmaven.test.skip=true' // mvn 示例
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物              	
                echo "构建完成."
            }
        }

        stage("测试") {
            steps {
                echo "单元测试中..."
                // 请在这里放置您项目代码的单元测试调用过程,例如:
                sh 'mvn test' // mvn 示例
                echo "单元测试完成."
                junit '**/target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
            }
        }

        stage("部署") {
            steps {
                echo "部署中..."
                echo "部署完成"
            }
        }
    }
}

构建共享项目

pipeline {
    agent {
        label "default"
    }
    stages  {
        
        stage("检出") {
            steps {
                checkout(
                  [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
                )
            }
        }

        stage("构建") {
            steps {
                echo "构建中..."
                dir(path: 'common') {
              		sh 'mvn package -Dmaven.test.skip=true' // mvn 示例
              		archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
              	}
                echo "构建完成."
            }
        }

        stage("测试") {
            steps {
                echo "单元测试中..."
                sh 'mvn test' // mvn 示例
                echo "单元测试完成."
                junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
            }
        }

        stage("部署") {
            steps {
                echo "部署中..."
                dir(path: 'common') {
                	sh 'mvn install'
                }
                echo "部署完成"
            }
        }
    }
}

构建 project1 和 project2

pipeline {
    agent {
        label "default"
    }
    stages  {
        
        stage("检出") {
            steps {
                checkout(
                  [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
                )
            }
        }
		stage("共享库") {
            steps {
                echo "构建中..."
                dir(path: 'common') {
              		sh 'mvn install -Dmaven.test.skip=true' // mvn 示例
              		archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
              	}
                echo "构建完成."
            }
        }
        stage("构建") {
            steps {
                echo "构建中..."
	            dir(path: 'project1') {
    	            sh 'mvn package -Dmaven.test.skip=true' // mvn 示例
   		            archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
                }
                echo "构建完成."
                
            }
        }

        stage("测试") {
            steps {
                echo "单元测试中..."
                sh 'mvn test' // mvn 示例
                echo "单元测试完成."
                junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
            }
        }

        stage("部署") {
            steps {
                echo "部署中..."
                // 部署脚本
                echo "部署完成"
            }
        }
    }
}
相关文章
相关标签/搜索