公司动态

Maven实际开发总结

📅 2026/7/28 17:46:07
Maven实际开发总结
文章目录maven概念优点核心点仓库生命周期配置文件 settings.xmlpom.xml文件源码包下载maven概念maven是项目开发的依赖管理工具也是服务的构建工具非常方便遵循着约定大于配置的思想使得项目的构建更加快速同时也解决了很多需要开发人员去解决的棘手的问题。maven的用处总结如下几点①.服务构建自动化构建②.消除构建重复抽象了生命周期③.依赖管理工具④.约定大于配置项目目录结构优点①.快速构建②.持续集成③.与实际代码解耦核心点pom.xml仓库仓库主要分为3类本地仓库远程仓库中央仓库本地仓库maven 的默认地址${user.home}/.m2/repository远程仓库例如私服中央仓库http://repo1.maven.org 这个仓库包含了世界上绝大部分的项目生命周期clean 生命周期清除target下的包default 生命周期sit 生命周期注在Idea的terminal窗口下输入命令行 mvn clean 默认是先读取settings.xml文件。即使Idea指定了自己项目中需要的settings的文件也是这样。有2种方式可以解决这个问题。①.使用完全隔离的两套maven互不干扰②.在执行maven指令的时候加上参数–setting /path/settings-A.xml配置文件 settings.xml该文件是maven配置的核心文件maven 的默认路径下的配置文件是 conf/setting.xml 全局生效可以将这个配置文件移至 ~/.m2/repository的目录下只对当前用户生效pom.xml文件project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd !--父项目的坐标。如果项目中没有规定某个元素的值 那么父项目中的对应值即为项目的默认值。 坐标包括group IDartifact ID和 version。-- parent !--被继承的父项目的构件标识符-- artifactId/ !--被继承的父项目的全球唯一标识符-- groupId/ !--被继承的父项目的版本-- version/ /parent !--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变虽然如此 但它仍然是必不可少的这是为了当Maven引入了新的特性或者其他模型变更的时候 确保稳定性。-- modelVersion4.0.0/modelVersion !--项目的全球唯一标识符通常使用全限定的包名区分该项目和其他项目。 并且构建时生成的路径也是由此生成 如com.mycompany.app生成的相对路径为 /com/mycompany/app-- groupIdcn.missbe.web/groupId !-- 构件的标识符它和group ID一起唯一标识一个构件。换句话说 你不能有两个不同的项目拥有同样的artifact ID和groupID在某个 特定的group ID下artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西 Maven为项目产生的构件包括JARs源码二进制发布和WARs等。-- artifactIdsearch-resources/artifactId !--项目产生的构件类型例如jar、war、ear、pom。插件可以创建 他们自己的构件类型所以前面列的不是全部构件类型-- packagingwar/packaging !--项目当前版本格式为:主版本.次版本.增量版本-限定版本号-- version1.0-SNAPSHOT/version !--项目的名称, Maven产生的文档用-- namesearch-resources/name !--项目主页的URL, Maven产生的文档用-- urlhttp://www.missbe.cn/url !-- 项目的详细描述, Maven 产生的文档用。 当这个元素能够用HTML格式描述时 例如CDATA中的文本会被解析器忽略就可以包含HTML标 签 不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面 你应该修改你自己的索引页文件而不是调整这里的文档。-- descriptionA maven project to study maven./description !--描述了这个项目构建环境中的前提条件。-- prerequisites !--构建该项目或使用该插件所需要的Maven的最低版本-- maven/ /prerequisites !--构建项目需要的信息-- build !--该元素设置了项目源码目录当构建项目的时候 构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。-- sourceDirectory/ !--该元素设置了项目脚本源码目录该目录和源码目录不同 绝大多数情况下该目录下的内容 会被拷贝到输出目录(因为脚本是被解释的而不是被编译的)。-- scriptSourceDirectory/ !--该元素设置了项目单元测试使用的源码目录当测试项目的时候 构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。-- testSourceDirectory/ !--被编译过的应用程序class文件存放的目录。-- outputDirectory/ !--被编译过的测试class文件存放的目录。-- testOutputDirectory/ !--使用来自该项目的一系列构建扩展-- extensions !--描述使用到的构建扩展。-- extension !--构建扩展的groupId-- groupId/ !--构建扩展的artifactId-- artifactId/ !--构建扩展的版本-- version/ /extension /extensions !--这个元素描述了项目相关的所有资源路径列表例如和项目相关的属性文件 这些资源被包含在最终的打包文件里。-- resources !--这个元素描述了项目相关或测试相关的所有资源路径-- resource !-- 描述了资源的目标路径。该路径相对target/classes目录例如${project.build.outputDirectory}。举个例 子如果你想资源在特定的包里(org.apache.maven.messages)你就必须该元素设置为org/apache/maven /messages。 然而如果你只是想把资源放到源码目录结构里就不需要该配置。-- targetPath/ !--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性 文件在filters元素里列出。-- filtering/ !--描述存放资源的目录该路径相对POM路径-- directory/ !--包含的模式列表例如**/*.xml.-- includes/ !--排除的模式列表例如**/*.xml-- excludes/ /resource /resources !--这个元素描述了单元测试相关的所有资源路径例如和单元测试相关的属性文件。-- testResources !--这个元素描述了测试相关的所有资源路径参见build/resources/resource元素的说明-- testResource targetPath/filtering/directory/includes/excludes/ /testResource /testResources !--构建产生的所有文件存放的目录-- directory/ !--产生的构件的文件名默认值是${artifactId}-${version}。-- finalName/ !--当filtering开关打开时使用到的过滤器属性文件列表-- filters/ !--子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。 给定插件的任何本地配置都会覆盖这里的配置-- pluginManagement !--使用的插件列表 。-- plugins !--plugin元素包含描述插件所需要的信息。-- plugin !--插件在仓库里的group ID-- groupId/ !--插件在仓库里的artifact ID-- artifactId/ !--被使用的插件的版本或版本范围-- version/ !--是否从该插件下载Maven扩展例如打包和类型处理器由于性能原因 只有在真需要下载时该元素才被设置成enabled。-- extensions/ !--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。-- executions !--execution元素包含了插件执行需要的信息-- execution !--执行目标的标识符用于标识构建过程中的目标或者匹配继承过程中需要合并的执行目标-- id/ !--绑定了目标的构建生命周期阶段如果省略目标会被绑定到源数据里配置的默认阶段-- phase/ !--配置的执行目标-- goals/ !--配置是否被传播到子POM-- inherited/ !--作为DOM对象的配置-- configuration/ /execution /executions !--项目引入插件所需要的额外依赖-- dependencies !--参见dependencies/dependency元素-- dependency ...... /dependency /dependencies !--任何配置是否被传播到子项目-- inherited/ !--作为DOM对象的配置-- configuration/ /plugin /plugins /pluginManagement !--使用的插件列表-- plugins !--参见build/pluginManagement/plugins/plugin元素-- plugin groupId/artifactId/version/extensions/ executions execution id/phase/goals/inherited/configuration/ /execution /executions dependencies !--参见dependencies/dependency元素-- dependency ...... /dependency /dependencies goals/inherited/configuration/ /plugin /plugins /build !--模块有时称作子项目 被构建成项目的一部分。 列出的每个模块元素是指向该模块的目录的相对路径-- modules/ !--发现依赖和扩展的远程仓库列表。-- repositories !--包含需要连接到远程仓库的信息-- repository !--如何处理远程仓库里发布版本的下载-- releases !--true或者false表示该仓库是否为下载某种类型构件发布版快照版开启。 -- enabled/ !--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是always一直daily默认每日intervalX这里X是以分钟为单位的时间间隔或者never从不。-- updatePolicy/ !--当Maven验证构件校验文件失败时该怎么做ignore忽略fail失败或者warn警告。-- checksumPolicy/ /releases !-- 如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置 POM就可以在每个单独的仓库中为每种类型的构件采取不同的 策略。 例如可能有人会决定只为开发目的开启对快照版本下载的支持。 参见repositories/repository/releases元素 -- snapshots enabled/updatePolicy/checksumPolicy/ /snapshots !--远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库-- idbanseon-repository-proxy/id !--远程仓库名称-- namebanseon-repository-proxy/name !--远程仓库URL按protocol://hostname/path形式-- urlhttp://192.168.1.169:9999/repository//url !-- 用于定位和排序构件的仓库布局类型-可以是default默认或者legacy遗留。Maven 2为其仓库提供了一个默认的布局然 而Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default默认还是legacy遗留。-- layoutdefault/layout /repository /repositories !--发现插件的远程仓库列表这些插件用于构建和报表-- pluginRepositories !--包含需要连接到远程插件仓库的信息.参见repositories/repository元素-- pluginRepository ...... /pluginRepository /pluginRepositories !--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。 它们自动从项目定义的仓库中下载。要获取更多信息请看项目依赖机制。-- dependencies dependency !--依赖的group ID-- groupIdorg.apache.maven/groupId !--依赖的artifact ID-- artifactIdmaven-artifact/artifactId !--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。-- version3.8.1/version !-- 依赖类型默认类型是jar。它通常表示依赖的文件的扩展名但也有例外 。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应 尽管这也有例外。一些类型的例子jarwarejb-client和test-jar。 如果设置extensions为 true就可以在 plugin里定义新的类型。所以前面的类型的例子不完整。-- typejar/type !-- 依赖的分类器。分类器可以区分属于同一个POM但不同构建方式的构件。 分类器名被附加到文件名的版本号后面。例如如果你想要构建两个单独的构件成 JAR 一个使用Java 1.4编译器另一个使用Java 6编译器你就可以使用分类器来生成两个单独的JAR构件。-- classifier/classifier !--依赖范围。在项目发布过程中帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。 - compile 默认范围用于编译 - provided类似于编译但支持你期待jdk或者容器提供类似于classpath - runtime: 在执行时需要使用 - test: 用于test任务时使用 - system: 需要外在提供相应的元素。通过systemPath来取得 - systemPath: 仅用于范围为system。提供相应的路径 - optional: 当项目自身被依赖时标注依赖是否传递。用于连续依赖时使用-- scopetest/scope !--仅供system范围使用。注意不鼓励使用这个元素 并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。 需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径例如${java.home}。-- systemPath/systemPath !--当计算传递依赖时 从依赖构件列表里列出被排除的依赖构件集。 即告诉maven你只依赖指定的项目不依赖项目的依赖。此元素主要用于解决版本冲突问题-- exclusions exclusion artifactIdspring-core/artifactId groupIdorg.springframework/groupId /exclusion /exclusions !--可选依赖如果你在项目B中把C依赖声明为可选你就需要在依赖于B的项目例如项目A中显式的引用对C的依赖。可选依赖阻断依赖的传递性。-- optionaltrue/optional /dependency /dependencies !-- 继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析, 而是当子项目声明一个依赖必须描述group ID和 artifact ID信息 如果group ID和artifact ID以外的一些信息没有描述 则通过group ID和artifact ID 匹配到这里的依赖并使用这里的依赖信息。-- dependencyManagement dependencies !--参见dependencies/dependency元素-- dependency ...... /dependency /dependencies /dependencyManagement !--项目分发信息 在执行mvn deploy后表示要发布的位置。 有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。-- distributionManagement !--部署项目产生的构件到远程仓库需要的信息-- repository !--是分配给快照一个唯一的版本号由时间戳和构建流水号 还是每次都使用相同的版本号参见repositories/repository元素-- uniqueVersion/ idbanseon-maven2/id namebanseon maven2/name urlfile://${basedir}/target/deploy/url layout/ /repository !--构件的快照部署到哪里如果没有配置该元素默认部署到repository元素配置的仓库 参见distributionManagement/repository元素-- snapshotRepository uniqueVersion/ idbanseon-maven2/id nameBanseon-maven2 Snapshot Repository/name urlscp://svn.baidu.com/banseon:/usr/local/maven-snapshot/url layout/ /snapshotRepository !--部署项目的网站需要的信息-- site !--部署位置的唯一标识符用来匹配站点和settings.xml文件里的配置-- idbanseon-site/id !--部署位置的名称-- namebusiness api website/name !--部署位置的URL按protocol://hostname/path形式-- url scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web /url /site !--项目下载页面的URL。如果没有该元素用户应该参考主页。 使用该元素的原因是帮助定位那些不在仓库里的构件由于license限制。-- downloadUrl/ !-- 给出该构件在远程仓库的状态。不得在本地项目中设置该元素 因为这是工具自动更新的。有效的值有none默认 converted仓库管理员从 Maven 1 POM转换过来partner直接从伙伴Maven 2仓库同步过来deployed从Maven 2实例部 署verified被核实时正确的和最终的。-- status/ /distributionManagement !--以值替代名称Properties可以在整个POM中使用也可以作为触发条件见settings.xml配置文件里activation元素的说明。格式是namevalue/name。-- properties/ /project源码包下载在开发过程中我们经常会遇到源码包下载不下来的情况此时可以通过下面的命令进行下载mvn dependency:resolve-Dclassifiersources