Maven build配置

Maven build配置 Maven 的build是 POM 文件pom.xml中核心配置节点之一用于定义项目构建的全生命周期行为编译、打包、测试、部署等。下面我会从「核心配置项」「常用子节点」「实战示例」三个维度用通俗易懂的方式讲解关键配置重点聚焦新手最常用的部分。Maven build一、build 核心结构先看build节点的基础骨架核心子节点如下project!-- 其他配置groupId/artifactId/version 等 --build!-- 1. 构建基础配置 --defaultGoalcompile/defaultGoaldirectorytarget/directoryfinalName${project.artifactId}-${project.version}/finalName!-- 2. 源码/资源文件配置 --sourceDirectorysrc/main/java/sourceDirectorytestSourceDirectorysrc/test/java/testSourceDirectoryresources.../resourcestestResources.../testResources!-- 3. 插件配置最核心 --plugins.../plugins!-- 4. 插件管理统一版本 --pluginManagement.../pluginManagement/build/project二、核心配置项详解1. 基础构建配置通用项配置项作用默认值defaultGoal执行mvn无参数时默认触发的构建目标如compile/packagecompiledirectory构建产物class、jar 等的输出根目录targetfinalName打包后的文件名如 jar/war 包名支持 Maven 内置变量${project.artifactId}-${version}示例自定义打包后的 jar 名finalNamemy-project-1.0.0-release/finalName!-- 最终输出target/my-project-1.0.0-release.jar --2. 源码/资源文件配置用于指定源码、测试源码、资源文件的路径默认路径满足 99% 场景特殊情况才修改。sourceDirectory主源码目录Java 文件默认src/main/javatestSourceDirectory测试源码目录默认src/test/javaresources主资源文件目录如application.yml、配置文件默认src/main/resourcestestResources测试资源文件目录默认src/test/resources实战场景自定义资源文件路径过滤资源变量resourcesresource!-- 资源文件目录 --directorysrc/main/resources/directory!-- 是否过滤资源文件中的 Maven 变量如 ${project.version} --filteringtrue/filtering!-- 包含/排除指定文件 --includesinclude**/*.yml/includeinclude**/*.properties/include/includesexcludesexclude**/*.log/exclude/excludes/resource/resources3. 插件配置plugins最核心Maven 的所有构建行为编译、打包、运行都依赖插件plugins是build中最常用的节点用于配置插件的版本、参数、执行目标。高频插件示例1编译插件maven-compiler-plugin指定 Java 编译版本解决「源码使用了更高版本 Java 特性」报错pluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.11.0/version!-- 推荐指定版本避免默认版本兼容问题 --configurationsource1.8/source!-- 源码编译版本Java 8 --target1.8/target!-- 生成的 class 文件兼容版本 --encodingUTF-8/encoding!-- 解决中文乱码 --/configuration/plugin/plugins2打包插件maven-jar-plugin/maven-war-plugin自定义 jar 包的 MANIFEST.MF如指定主类、依赖plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-jar-plugin/artifactIdversion3.3.0/versionconfigurationarchivemanifestaddClasspathtrue/addClasspath!-- 包含依赖类路径 --classpathPrefixlib//classpathPrefix!-- 依赖存放目录 --mainClasscom.example.MyMainClass/mainClass!-- 可执行 jar 的主类 --/manifest/archive/configuration/plugin3打包可执行胖包maven-shade-plugin将所有依赖打包到一个 jar 包解决「运行时找不到依赖」问题plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-shade-plugin/artifactIdversion3.5.1/versionexecutionsexecutionphasepackage/phase!-- 在 package 阶段执行 --goalsgoalshade/goal!-- 执行 shade 目标 --/goalsconfigurationtransformerstransformerimplementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformermainClasscom.example.MyMainClass/mainClass!-- 主类 --/transformer/transformers/configuration/execution/executions/plugin4. 插件版本管理pluginManagement用于统一管理插件版本避免多模块项目中重复指定版本仅定义版本不执行插件子模块可直接引用无需再指定版本。示例父 POM 中统一管理插件版本buildpluginManagementplugins!-- 定义编译插件版本 --plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.11.0/version/plugin!-- 定义打包插件版本 --plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-jar-plugin/artifactIdversion3.3.0/version/plugin/plugins/pluginManagement!-- 子模块/当前项目引用时无需指定版本 --pluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdconfigurationsource1.8/sourcetarget1.8/target/configuration/plugin/plugins/build三、常见实战配置示例示例 1Java 8 项目基础构建配置buildfinalNamemy-app-1.0.0/finalNameplugins!-- 编译配置 --plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.11.0/versionconfigurationsource8/sourcetarget8/targetencodingUTF-8/encoding/configuration/plugin!-- 打包可执行 jar --plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-jar-plugin/artifactIdversion3.3.0/versionconfigurationarchivemanifestmainClasscom.example.App/mainClassaddClasspathtrue/addClasspathclasspathPrefixlib//classpathPrefix/manifest/archive/configuration/plugin/plugins/build示例 2多模块项目统一插件版本!-- 父 POM --buildpluginManagementpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.11.0/versionconfigurationsource11/sourcetarget11/target/configuration/plugin/plugins/pluginManagement/build!-- 子模块 POM --buildplugins!-- 直接引用父 POM 定义的插件无需版本 --plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactId/plugin/plugins/build总结build核心作用是定义 Maven 构建规则最关键的是plugins插件配置和pluginManagement版本统一新手优先掌握「编译插件指定 Java 版本」「打包插件自定义 jar 名/主类」解决 80% 的构建问题resource节点用于管理资源文件开启filteringtrue可替换资源中的 Maven 变量多模块项目务必用pluginManagement统一插件版本避免版本冲突。Maven 内置属性一、${basedir} 核心解析${basedir} 是 Maven 最常用的内置属性之一代表当前项目的根目录即包含 pom.xml 文件的那个文件夹是 Maven 路径相关操作的核心变量无需手动定义即可直接使用。1. 基础用法示例?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.example/groupIdartifactIddemo-project/artifactIdversion1.0.0-SNAPSHOT/versionbuild!-- 示例1指定资源文件目录默认就是basedir/src/main/resources此处仅演示 --resourcesresourcedirectory${basedir}/src/main/resources/directory/resource/resources!-- 示例2插件中指定文件路径 --pluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-antrun-plugin/artifactIdversion3.1.0/versionexecutionsexecutionphasecompile/phasegoalsgoalrun/goal/goalsconfigurationtarget!-- 打印项目根目录路径 --echo项目根目录${basedir}/echo!-- 引用根目录下的自定义文件 --copyfile${basedir}/custom-config.propertiestofile${project.build.directory}/config.properties//target/configuration/execution/executions/plugin/plugins/build/project2. 核心特性路径基准所有相对路径在 Maven 中默认以${basedir}为基准比如src/main/java等价于${basedir}/src/main/java多模块适配在多模块项目中父模块的${basedir}是父 pom 所在目录子模块的${basedir}是子模块自身的根目录子模块 pom 所在目录不可修改该值由 Maven 自动识别无法通过 POM 手动赋值修改。二、Maven 常用内置属性系统/项目属性Maven 内置属性分为两类项目核心属性和当前项目强相关、环境/系统属性和运行环境相关以下是开发中高频使用的内置属性无需手动定义即可直接使用1. 项目核心属性最常用属性名含义${project.version}当前项目的版本号即 pom 中version的值${project.groupId}当前项目的 GroupId即 pom 中groupId的值${project.artifactId}当前项目的 ArtifactId即 pom 中artifactId的值${project.name}当前项目的名称pom 中name的值未声明则默认groupId:artifactId${project.packaging}项目打包类型pom/jar/war/ear 等默认 jar${basedir}当前项目根目录pom.xml 所在目录${project.build.directory}项目构建输出目录默认${basedir}/target${project.build.sourceDirectory}主源码目录默认${basedir}/src/main/java${project.build.testSourceDirectory}测试源码目录默认${basedir}/src/test/java${project.build.outputDirectory}编译后的类文件输出目录默认${target}/classes${project.version}同${project.version}简写形式效果一致2. 构建路径相关属性属性名含义${project.build.finalName}项目打包后的最终文件名默认${artifactId}-${version}如 demo-1.0.0${project.resources}主资源文件目录默认${basedir}/src/main/resources${project.testResources}测试资源文件目录默认${basedir}/src/test/resources${project.build.scriptSourceDirectory}脚本源码目录默认${basedir}/src/main/scripts3. 环境/系统属性和运行环境相关属性名含义${user.home}当前操作系统登录用户的主目录如 Windows 下C:\Users\用户名Linux 下/home/用户名${user.dir}Maven 命令执行的当前目录注意不一定等于${basedir}若在子目录执行 mvn 命令则不同${java.home}JDK 安装目录如C:\Program Files\Java\jdk1.8.0_301${java.version}当前使用的 JDK 版本如 1.8.0_301${os.name}操作系统名称如 Windows 10、Linux${file.separator}系统文件分隔符Windows 是\Linux/Mac 是/${path.separator}系统路径分隔符Windows 是;Linux/Mac 是:${line.separator}系统换行符Windows 是\r\nLinux/Mac 是\n4. 实用示例组合使用内置属性!-- 示例自定义打包后的文件名和输出路径 --build!-- 最终打包文件名demo-1.0.0-release --finalName${project.artifactId}-${project.version}-release/finalNamepluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-jar-plugin/artifactIdversion3.3.0/versionconfiguration!-- 输出目录项目根目录/build/libs --outputDirectory${basedir}/build/libs/outputDirectory!-- 包含JDK版本信息 --archivemanifestaddDefaultImplementationEntriestrue/addDefaultImplementationEntriesimplementationVersion${java.version}/implementationVersion/manifest/archive/configuration/plugin/plugins/build三、总结${basedir}是 Maven 内置属性代表当前项目根目录pom.xml 所在目录是路径配置的核心基准Maven 内置属性分项目属性如${project.version}/${basedir}和系统属性如${user.home}/${java.version}无需手动定义即可直接使用核心价值是统一配置、适配环境避免硬编码路径/版本/环境信息提升 POM 灵活性和可维护性。