知识总是在总结中发酵的,去年在公司做过容器化相关的东西,涉及到制作发布包等内容,对maven有了进一步的理解,但是一直没有时间整理,最近找些时间总结一下,希望对大家也有帮助吧
感谢技术人们来看,相逢即缘分~请入座
翠花,切一根面肠!热一杯酒!
文章内容
- maven生命周期都有哪些?都什么含义
- 介绍下maven-dependency-plugin的作用以及常用配置
- 介绍下maven-resources-plugin的作用以及常用配置
- 介绍下maven-assembly-plugin的作用以及常用配置
- 介绍下docker-maven-plugin的作用以及常用配置
<component>
<role>org.apache.maven.lifecycle.Lifecycle</role>
<implementation>org.apache.maven.lifecycle.Lifecycle</implementation>
<role-hint>default</role-hint>
<configuration>
<id>default</id>
<phases>
<phase>validate</phase>
<phase>initialize</phase>
<phase>generate-sources</phase>
<phase>process-sources</phase>
<phase>generate-resources</phase>
<phase>process-resources</phase>
<phase>compile</phase>
<phase>process-classes</phase>
<phase>generate-test-sources</phase>
<phase>process-test-sources</phase>
<phase>generate-test-resources</phase>
<phase>process-test-resources</phase>
<phase>test-compile</phase>
<phase>process-test-classes</phase>
<phase>test</phase>
<phase>prepare-package</phase>
<phase>package</phase>
<phase>pre-integration-test</phase>
<phase>integration-test</phase>
<phase>post-integration-test</phase>
<phase>verify</phase>
<phase>install</phase>
<phase>deploy</phase>
</phases>
</configuration>
</component>
在Maven的构建生命周期中,一共包含了以下阶段(phase):
- validate:验证项目是否正确且所有必要的信息都可用。
- initialize:初始化构建,设置必要的属性。
- generate-sources:生成任何需要的源代码。
- process-sources:处理源代码,例如过滤资源。
- generate-resources:生成除了Java源代码之外的资源文件。
- process-resources:复制并处理资源到目标目录(一般是target目录下)。
- compile:编译项目的源代码。
- process-classes:处理编译生成的字节码文件,例如对类进行字节码增强。
- generate-test-sources:生成测试源代码。
- process-test-sources:处理测试源代码。
- generate-test-resources:生成测试资源。
- process-test-resources:复制并处理测试资源到测试目标目录。
- test-compile:编译测试源代码到测试目标目录。
- process-test-classes:处理编译后的测试类文件。
- test:使用合适的单元测试框架运行测试。
- prepare-package:在实际打包之前做准备工作。
- package:把编译好的代码打包成可发布的格式,如JAR、WAR或EAR文件。
- pre-integration-test:在集成测试之前执行的动作。
- integration-test:处理任何集成测试。
- post-integration-test:在集成测试之后执行的动作。
- verify:运行任何检查以验证包是否有效且满足质量标准。
- install:将包安装到本地仓库,可供本地其他Maven项目作为依赖使用。
- deploy:将最终的包发布到远程仓库,供其他开发人员和项目作为依赖使用。
这些阶段构成了Maven构建的生命周期,插件的目标(goals)可以绑定到这些阶段中执行。执行(execution)就是在pom.xml中定义的插件目标与生命周期阶段的绑定关系。
maven-dependency-plugin
maven-dependency-plugin是Maven中一个非常强大的插件,用于处理项目依赖相关的任务。以下是关于此插件的一些关键知识和配置示例:
常用Goals(目标)
-
dependency:copy
-
- 用途:将指定的依赖项复制到指定的位置,支持重命名或移除版本号。
- 配置示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.3.0</version> <!-- 使用最新版本 -->
<executions>
<execution>
<id>copy</id>
<phase>package</phase>//作用到maven的哪个周期
<goals>
<goal>copy</goal>//动作目标
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
<type>jar</type>
<overWrite>false</overWrite>
//输出目录
<outputDirectory>${project.build.directory}/lib</outputDirectory>
//修改名称
<destFileName>optional-guava.jar</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
-
dependency:copy-dependencies
-
- 用途:将项目的所有依赖复制到指定目录。
- 配置示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
-
dependency:unpack
-
- 用途:解压缩依赖的jar文件到指定目录。
- 配置示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>unpack</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.example</groupId>
<artifactId>example-artifact</artifactId>
<version>1.0.0</version>
<type>jar</type>
<overWrite>true</overWrite>//是否允许被覆盖
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<includes>**/*.class</includes>
<excludes>META-INF/**</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
-
dependency:get
-
- 用途:从远程仓库下载依赖项到本地。
-
dependency:resolve
-
- 用途:解析项目依赖,不下载缺失的依赖,仅验证已存在的依赖。
配置属性
- outputDirectory:指定输出目录。
- overWrite:是否覆盖已存在的文件。
- includeScope:指定要包含的依赖范围,如compile, runtime, test等。
- artifactItems:用于指定需要操作的具体依赖项列表。
注意事项
- 确保使用的是插件的最新或兼容版本,以获得最佳功能和支持。
- 在执行特定操作时,需明确操作的生命周期阶段(),以确定何时执行该操作。
- 根据实际需求调整配置,比如使用相对路径${project.build.directory}以保持构建的可移植性。
maven-resources-plugin
Maven Resources Plugin 是 Maven 中用于处理项目资源文件的一个重要插件。它负责将项目的资源文件(如配置文件、静态资源等)从源目录复制到输出目录,并支持资源过滤等功能。以下是该插件的一些关键知识点和可配置参数:
基本用途
- 复制资源文件:从src/main/resources和src/test/resources目录复制文件到编译后的类路径和测试类路径。
- 资源过滤:替换资源文件中的Maven属性和表达式(如${project.version})。
- 文件排除与包含:指定哪些文件应该被包含或排除在处理之外。
- 文件过滤器:基于文件类型或内容模式进行过滤处理。
- 国际化支持:处理多语言资源文件,支持创建语言特定的资源包。
配置示例(放置于pom.xml的部分):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.0</version> <!-- 使用最新的版本 -->
<configuration>
<!-- 主要配置 -->
<encoding>UTF-8</encoding> <!-- 设置资源文件编码 -->
<!-- 资源过滤控制 -->
<useDefaultDelimiters>true</useDefaultDelimiters> <!-- 是否使用默认的表达式分隔符 -->
<delimiters> <!-- 自定义表达式分隔符 -->
<delimiter>${*}</delimiter>
</delimiters>
<filtering>true</filtering> <!-- 是否开启资源过滤 -->
<!-- 包含与排除规则 -->
<includes> <!-- 包含的文件模式 -->
<include>**/*.properties</include>
</includes>
<excludes> <!-- 排除的文件模式 -->
<exclude>**/*-dev.properties</exclude>
</excludes>
<!-- 特定资源的处理 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 对该目录下的资源启用过滤 -->
</resource>
<resource>
<directory>src/extra-resources</directory> <!-- 添加额外的资源目录 -->
<targetPath>META-INF</targetPath> <!-- 指定目标路径 -->
<filtering>false</filtering> <!-- 可以针对每个资源集单独设置过滤开关 -->
</resource>
</resources>
<!-- 文件类型过滤 -->
<fileSets> <!-- 对特定文件类型应用过滤规则 -->
<fileSet>
<directory>src/main/config</directory>
<includes>
<include>*.xml</include>
</includes>
<filtered>true</filtered>
</fileSet>
</fileSets>
<!-- 国际化资源处理 -->
<nonFilteredFileExtensions> <!-- 定义不应被过滤的文件扩展名 -->
<nonFilteredFileExtension>jpg</nonFilteredFileExtension>
<nonFilteredFileExtension>png</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
注意事项
- version标签中的版本号应根据实际可用的最新版本进行调整。
- filtering配置可以是全局的,也可以在每个标签内单独设置,以提供更细粒度的控制。
- 使用可以防止某些二进制文件或不需要过滤的文本文件被错误处理。
以上就是Maven Resources Plugin的一些核心配置和知识点。根据项目具体需求,可以选择性地配置这些参数来优化资源处理流程。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resource</id>
<phase>prepare-package</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
<execution>
<id>copy-jars</id>
<phase>install</phase>
<goals>
<goal>resources</goal>
</goals>
<!--0将打包好的jar复制到image中 -->
<configuration>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<filtering>false</filtering>
<includes>
<include>${project.build.finalName}.jar</include>
</includes>
<targetPath>${project.build.directory}/${project.build.finalName}-docker-image</targetPath>
</resource>
</resources>
</configuration>
</execution>
</executions>
<configuration>
<encoding>UTF-8</encoding>
<resources>
<!-- 以下镜像包处理开始 -->
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>constant.properties</include>
</includes>
<targetPath>${project.build.directory}/classes</targetPath>
</resource>
</resources>
</configuration>
maven-assembly-plugin
Maven Assembly Plugin 是一个强大的Maven插件,用于创建项目的分发包,它可以将项目的编译输出、依赖、资源以及其他文件组织成一个可分发的归档文件,如ZIP、TAR、JAR、WAR等。以下是关于 Maven Assembly Plugin 的一些核心知识点和配置项:
知识点概览
目的
简化项目的部署和分发过程,使得项目更易于管理。特别适用于需要将应用程序及其依赖、配置文件、脚本等整合为单一可部署单元的场景。
- 装配描述符
核心功能之一是使用Assembly描述符文件(默认为assembly.xml),该文件详细定义了如何组装最终的归档文件,包括文件结构、过滤、依赖关系处理等。
- 预定义描述符
提供了一些预定义的描述符引用(如jar-with-dependencies),可以直接在POM中使用,无需自定义描述符文件。
- 多格式支持
能够生成多种类型的归档文件,不仅限于Java应用,也适合于任何需要打包的项目。
配置示例
在pom.xml中配置Maven Assembly Plugin的基本形式如下:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version> <!-- 使用最新的稳定版本 -->
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase> <!-- 绑定到package阶段 -->
<goals>
<goal>single</goal> <!-- 执行single goal来创建归档 -->
</goals>
<configuration>
<archive>
<manifest>
<mainClass>com.example.MainClass</mainClass> <!-- 可选,如果需要生成可执行jar -->
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef> <!-- 使用预定义描述符 -->
</descriptorRefs>
<!-- 或者使用自定义描述符文件 -->
<!--<descriptors>
<descriptor>src/main/assembly/custom-assembly.xml</descriptor>
</descriptors>-->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
关键配置项
- 定义归档文件的元数据,如Manifest条目,用于生成可执行JAR。
- 指定使用的预定义装配描述符引用。
- 指定自定义的Assembly描述符文件路径,当需要更复杂的打包逻辑时使用。
- 是否在最终归档文件名后追加Assembly ID,默认为true。
- 指定最终归档文件的名称。
- 是否在归档中包含基目录,默认为true。
docker-maven-plugin
Docker Maven Plugin 是一个用于与 Docker 进行交互的 Maven 插件,它允许你在 Maven 构建周期中自动化 Docker 镜像的构建、标记、推送等操作。以下是一些关键的配置项及其说明:
基础配置
在 pom.xml 文件中,首先需要声明 Docker Maven Plugin 插件及其版本,然后在 -> 节点内配置该插件的具体行为:
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId> <!-- 或其他合适的groupId,根据使用的插件版本 -->
<artifactId>docker-maven-plugin</artifactId>
<version>VERSION</version> <!-- 使用最新或合适的版本号 -->
<configuration>
<!-- 插件配置项 -->
</configuration>
</plugin>
</plugins>
</build>
主要配置项
- 指定 Docker 镜像的名称(含仓库地址),例如:myregistry/myapp:latest。
- 指定 Dockerfile 的路径,如果不指定,默认使用项目根目录下的 Dockerfile。
- 配置 Docker 守护进程的地址,例如:unix:///var/run/docker.sock 或 tcp://localhost:2375。
- 传递给 Docker 构建过程的构建参数,格式为 v a l u e ,例如: {value},例如: value,例如:{project.build.finalName}.jar。
- 定义要拷贝到 Docker 镜像中的资源,可以用来指定额外的文件或目录。
- 是否使用 Docker 层缓存,默认为 true。
- 是否强制覆盖已存在的标签,默认为 false。
- 为镜像添加额外的标签,可以配置多个 。
- 构建完成后是否自动推送镜像到仓库,默认为 false。
- 指定 Docker 镜像仓库的URL,当需要推送镜像时使用。
- 认证配置,用于 Docker 仓库的认证,包含用户名和密码等信息。
- 覆盖 Dockerfile 中的入口点和命令。
- 定义 Docker 容器运行时挂载的卷
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>build-push</id>
<phase>install</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<!--此处对应maven配置的serverId -->
<serverId>harbor</serverId>
<!-- 镜像名称 -->
<imageName>${registry.address}/${registry.name}/${app.name}:${app.version}</imageName>
<!--docker远程服务器地址 -->
<dockerHost>http://${docker.host}:2375</dockerHost>
<!-- Dockerfile文件存放目录 -->
<dockerDirectory>${project.build.directory}/${project.build.finalName}-docker-image</dockerDirectory>
<resources>
<resource>
<directory>${project.build.directory}/${project.build.finalName}-docker-image</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
感谢技术人们来看,相逢即缘分~
翠花,辛苦捡桌子了!