Maven

在 Docker 中构建多模块 Maven 项目

1、概览 本文将带你了解如何利用 Docker 的多阶段构建功能高效地为多模块 Maven 项目构建 Docker 镜像,,以充分利用 Docker 的缓存机制。 然后,还会介绍 Google Jib Maven 插件,用于在没有 Dockerfile 或 Docker 的情况下构建 Docker 镜像。 2、多模块 Maven 项目 多模块 Maven 应用由不同功能的独立模块组成。Maven 通过管理依赖关系来构建应用,并将这些模块组装成一个可部署的单元。 在本文的代码示例中,我们将使用一个包含两个 Maven 模块的基本 Spring Boot 项目,这两个模块分别代表应用程序的 Domain 和 API。 Maven 项目的结构如下: +-- parent +-- api | `-- src | `-- pom.xml +-- domain | `-- src | `-- pom.xml `-- pom.xml 查看父模块的 pom.xml 文件,就会发现它继承了 spring-boot-starter-parent,并包含了 domain 和 api 模块: <project> <groupId>com.baeldung.docker-multi-module-maven</groupId> <artifactId>parent</artifactId> <packaging>pom</packaging> <version>0.

Maven 环境变量:M2_HOME、MAVEN_HOME 和 PATH

1、概览 在 Apache Maven 安装的过程中,我们需要配置各种环境变量,以确保 Maven 能正常运行。本文将带你了解与之相关的三个变量:M2_HOME、MAVEN_HOME 和 PATH。 先来看看如何配置最早版本的 Maven。 注意:Apache Maven 1.x 和 Maven 2.x 已停止使用。第 2 节和第 3 节展示的配置仅供参考,不提倡使用。 2、Maven 1.x 下载并解压 Maven 压缩文件,进入到解压目录的 bin 文件夹。在这个目录中,你可以尝试执行一下 maven 命令,看看它是否能正常工作: $ maven -v 该命令输出如下,表示我们缺少一个必需的环境变量: MAVEN_HOME must be set MAVEN_HOME 环境变量指定了 Maven 目录(解压后的)的位置,而且该环境变量是必须的。 在系统中添加这个环境变量后,再次运行之前的命令(需要新的终端中运行): $ maven -v 结果如下: __ __ | \/ |__ _Apache__ ___ | |\/| / _` \ V / -_) ' \ ~ intelligent projects ~ |_| |_\__,_|\_/\___|_||_| v.

Spring Boot 使用 git-commit-id-maven-plugin 打包应用

原文地址:https://www.cnblogs.com/Naylor/p/18024689 简介 git-commit-id-maven-plugin 是一个maven 插件,用来在打包的时候将 git-commit 信息打进 Jar 中。 这样做的好处是可以将发布的某版本和对应的代码关联起来,方便查阅和线上项目的维护。至于它的作用,用官方说法,这个功能对于大型分布式项目来说是无价的。 功能 你是否经常遇到这样的问题: 测试提交了一个bug,开发人员无法确认是哪个版本有这个问题?当前测试环境部署的是某个版本吗?生产环境会不会也有这个问题? 公司内部的项目,总共几十、几百个服务,每天都有服务的生产环境部署,一个服务甚至一天上线好几次,对于项目管理来说无法清晰了解某一时刻某个服务的版本 如何验证我的代码是否已经上线? 。。。。。。 以上种种,都有一个共同的诉求,就是我希望在打包的时候将最后一次 git commit id 和当前 jar 关联起来并可试试查询 jar 对应的 git commit id 。 实践 引入插件 本例 Spring Boot 版本为 2.7.6,java 版本为 11 此插件已经上传到中央仓库(https://central.sonatype.com/artifact/io.github.git-commit-id/git-commit-id-maven-plugin?smo=true) 在项目pom.xml 中引入如下插件 <project> ...... <build> <plugins> <!-- git-commit-id-maven-plugin :打包的时候携带git提交信息 --> <plugin> <groupId>io.github.git-commit-id</groupId> <artifactId>git-commit-id-maven-plugin</artifactId> <version>5.0.0</version> <executions> <execution> <id>get-the-git-infos</id> <goals> <goal>revision</goal> </goals> <phase>initialize</phase> </execution> </executions> <configuration> <generateGitPropertiesFile>true</generateGitPropertiesFile> <generateGitPropertiesFilename>${project.build.outputDirectory}/git.</generateGitPropertiesFilename> <includeOnlyProperties> <includeOnlyProperty>^git.build.(time|version)$</includeOnlyProperty> <includeOnlyProperty>^git.commit.id.(abbrev|full)$</includeOnlyProperty> </includeOnlyProperties> <format>txt</format> <commitIdGenerationMode>full</commitIdGenerationMode> </configuration> </plugin> </plugins> </build> </project> generateGitPropertiesFilename:用于指定生成的 gitCommitInfo 存放到哪个位置,后缀可以任意指定,如果不指定将使用 format 的值 format:指定文件后缀,一般为 properties、json commitIdGenerationMode:记录完整信息,若 format 为 json,此值必须为 full 此外为了能成功打出 jar 包,还需要如下插件的配合:

Spring-boot:repackage 和 Maven package

1、概览 Apache Maven 是一种广泛使用的项目依赖管理工具和项目构建工具。 Spring Boot 通过 Spring Boot Maven Plugin 在 Apache Maven 中提供了对 Spring Boot 的支持。 众所周知,在 Maven 中可以使用 mvn package 将应用打包为 JAR 或 WAR 包。不过,Spring Boot Maven 插件额外添加了一个 repackage goal,也可以在 mvn 命令中调用。 有时,这两个 mvn 命令会让人混淆。本文将带你了解 mvn package 和 spring-boot:repackage 之间的区别。 2、Spring Boot 应用示例 首先,创建一个简单的 Spring Boot 应用作为示例: @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } 创建一个简单的 REST 端点来验证应用是否正常运行: @RestController public class DemoRestController { @GetMapping(value = "/welcome") public ResponseEntity welcomeEndpoint() { return ResponseEntity.

如何提高 Maven 的构建速度?

1、概览 在本教程中,我们将学习如何加快 Maven 的构建速度。我们将介绍各种优化构建时间的技术,并评述其优缺点。 2、常规建议 使用正确的 maven phase(阶段) 可以为我们节省大量时间。如果只需要编译代码,就没必要运行完整的 install,并且这会污染我们的本地仓库。 在多模块项目中,可以只重建已更改的模块和依赖于这些模块的模块。例如,如果我们只修改了 module1 和 module2,我们可以运行: $ mvn clean install -pl module1,module2 -am 3、使用多线程 默认情况下,Maven 构建在单线程中顺序运行。不过,如今所有电脑都有多核。让我们利用这一点,使用 -T 选项并行构建我们的模块: $ mvn clean install -T 1C -T 1C 表示 Maven 将在每个可用内核上使用一个线程。 -T 4 会强制 Maven 使用四个线程。 -T auto 会让 Maven 决定使用的线程数。 最后但并非最不重要的一点是,Maven Reactor 可确保所有相互依赖的模块按顺序运行。 4、测试优化 测试是软件开发的重要组成部分。然而,运行测试需要花费大量时间。 4.1、并行运行测试 默认情况下,Surefire 插件会按顺序运行单元测试。不过,我们可以将其配置为并行运行。例如,要并行运行所有测试套件,并在每个可用内核上使用一个线程,我们可以运行: mvn clean install -Dparallel=all -DperCoreThreadCount=true 但是,如果我们的项目中没有大量的单元测试,并行化的开销可能会导致更低的效率。 4.2、跳过测试执行 有时,我们并不需要在本地环境中运行测试。Maven -DskipTests 选项会跳过测试的执行,但仍会编译 test 文件夹: $ mvn clean install -DskipTests 在高度测试的项目中,当我们不需要测试时,跳过测试可以节省我们的时间!