Maven 笔记
maven是什么
- 依赖管理:对 jar 的统一管理(Maven 提供了一个 Maven 的中央仓库,https://mvnrepository.com/,当我们在项目中添加完依赖之后,Maven 会自动去中央仓库下载相关的依赖,并且解决依赖的依赖问题)
- 项目构建:对项目进行编译、测试、打包、部署、上传到私服等
snapshot
如果是快照板,表示都是小更新,每次构建都会拉最新的。
依赖范围

依赖优先级
1.第一原则,路径最近依赖原则
A - B - sb.jar
A - sb.jar (√)
2.第二原则,最先声明依赖原则
A - B - sb.jar (√)
A - C - sb.jar
聚合
其存在的意义在于快速构建项目
<!-- 目录结构
parent
父pom.xml
account-email
pom.xml
account-persist
pom.xml -->
<!-- 配置 -->
<modules>
<module>../account-email</module>
<module>../account-persist</module>
</modules>
<!-- 目录结构
父pom.xml
account-email
pom.xml
account-persist
pom.xml -->
<!-- 配置 -->
<modules>
<module>account-email</module>
<module>account-persist</module>
</modules>
多模块项目展示
|--javaboy-parent
|-- javaboy-cms
|-- javaboy-crm
|-- javaboy-manger
|-- javaboy-manager-model
|-- javaboy-manager-dao
|-- javaboy-manager-service
|-- javaboy-manager-web
以 javaboy-manger 为例,javaboy-manager 本身并不提供功能,它只负责管理他自己的子模块,而他的子模块每一个都无法独立运行,需要四个结合在一起,才可以运行。项目打包时,model、dao、service 都将打包成 jar,然后会自动将打包好的 jar 复制到 web 中,再自动将 web 打包成 war 包。
Idea可以通过new module来创建, 会默认指明了当前 Module 的 parent。
然后此时parent的pom.xml里会自动加modules等配置项。
注意这个parent有继承作用。可以在parent里做依赖管理。
有一个需要注意的地方,在多模块项目中,web 项目打包需要注意以下问题:
- 不可以直接单独打包
- 如果要打包,有两种方式:
- 第一种就是先手动挨个将 model、dao、service 安装到本地仓库
- 从聚合工程处打包,即从 web 的parent 处打包。
继承
继承是为了消除重复配置而存在的
表现为pom.xml的parent元素,子pom可以继承父pom中的配置,如依赖、属性等。
父模块只能打包为pom。
属性继承比较常用的有以下几个:
properties:属性,类似于java的静态常量
dependencies:依赖
distributionManagement:部署配置,比如自定义组件的上传,会结合settings.xml里的server进行账号认证。
依赖管理(不会实际引入依赖):
<dependencyManagement>元素,子模块引入时可以省略版本号的配置
依赖管理scope元素可以设置为import,这个import必须结合dependencyManagement来使用。使用import通常指向一个pom文件,作用是将目标pom中的dependencyManagement配置导入合并到当前pom的dependencyManagement元素中使用。
父项目的dependency元素,子项目可以直接用。
dependencyManagement 子模块可以自助通过声明来引入,如果引入则只需要配置依赖的groupId以及artifactId即可
聚合与继承的关系
从上面可以看到多模块 Maven 项目中的聚合与继承其实是两个概念,其目的是完全不同的。聚合是为了方便快速构建项目,继承是为了消除重复配置。
对于聚合模块来说,它知道哪些被聚合的模块(通过modules元素),但那些被聚合的模块不知道这个聚合模块的存在。
对于继承关系的父 POM 来说,它不知道哪些子模块继承于它,但那些子模块都必须知道自己的父 POM 是什么。
在实际项目中,大家会发现一个 pom 即是聚合 pom,又是父 pom,这么做主要是为了方便。就像上面我们定义的聚合模块为 taobao-aggregator,父级模块为 taobao-parent,我们可以将其合并成为一个名为 taobao 的 pom 文件。这样清晰明了。
聚合和继承唯一的共性是其<packaging>元素的值都是pom
约定优于配置
Maven会假设用户的项目是这样的:
- 源码目录为:
src/main/java/ - 编译输出目录为:
target/classes/ - 打包方式为:
jar - 包输出目录为:
target/
遵循约定虽然损失了一定的灵活性,用户不能随意安排目录结构,但是却能减少配置。更重要的是,遵循约定能够帮助用户遵守构建标准
没有约定,意味着10个项目可能使用10种不同的项目目录结构,这意味着交流学习成本的增加,而这种增加的成本往往就是浪费
任何一个Maven项目都隐式地继承自超级POM($MAVEN_HOME/lib/maven-model-builder-x.x.jar中的org/apache/maven/model/pom-4.0.0.xml),这有点类似于任何一个Java类都隐式地继承于Object类。因此大量超级POM的配置都会被所有Maven项目继承,这些配置也就成了Maven所提倡的约定
Maven 骨架archetype
Maven 的41种骨架
- internal -> appfuse-basic-jsf (创建一个基于Hibernate,Spring和JSF的Web应用程序的原型)
- internal -> appfuse-basic-spring (创建一个基于Hibernate,Spring和Spring MVC的Web应用程序的原型)
- internal -> appfuse-basic-struts (创建一个基于Hibernate,Spring和Struts 2的Web应用程序的原型)
- internal -> appfuse-basic-tapestry (创建一个基于Hibernate, Spring 和 Tapestry 4的Web应用程序的原型)
- internal -> appfuse-core (创建一个基于 Hibernate and Spring 和 XFire的jar应用程序的原型)
- internal -> appfuse-modular-jsf (创建一个基于 Hibernate,Spring和JSF的模块化应用原型)
- internal -> appfuse-modular-spring (创建一个基于 Hibernate, Spring 和 Spring MVC 的模块化应用原型)
- internal -> appfuse-modular-struts (创建一个基于 Hibernate, Spring 和 Struts 2 的模块化应用原型)
- internal -> appfuse-modular-tapestry (创建一个基于 Hibernate, Spring 和 Tapestry 4 的模块化应用原型)
- internal -> maven-archetype-j2ee-simple (一个简单的J2EE的Java应用程序)
- internal -> maven-archetype-marmalade-mojo (一个Maven的 插件开发项目 using marmalade)
- internal -> maven-archetype-mojo (一个Maven的Java插件开发项目)
- internal -> maven-archetype-portlet (一个简单的portlet应用程序)
- internal -> maven-archetype-profiles ()
- internal -> maven-archetype-quickstart ()
- internal -> maven-archetype-site-simple (简单的网站生成项目)
- internal -> maven-archetype-site (更复杂的网站项目)
- internal -> maven-archetype-webapp (一个简单的Java Web应用程序)
- internal -> jini-service-archetype (Archetype for Jini service project creation)
- internal -> softeu-archetype-seam (JSF+Facelets+Seam Archetype)
- internal -> softeu-archetype-seam-simple (JSF+Facelets+Seam (无残留) 原型)
- internal -> softeu-archetype-jsf (JSF+Facelets 原型)
- internal -> jpa-maven-archetype (JPA 应用程序)
- internal -> spring-osgi-bundle-archetype (Spring-OSGi 原型)
- internal -> confluence-plugin-archetype (Atlassian 聚合插件原型)
- internal -> jira-plugin-archetype (Atlassian JIRA 插件原型)
- internal -> maven-archetype-har (Hibernate 存档)
- internal -> maven-archetype-sar (JBoss 服务存档)
- internal -> wicket-archetype-quickstart (一个简单的Apache Wicket的项目)
- internal -> scala-archetype-simple (一个简单的scala的项目)
- internal -> lift-archetype-blank (一个 blank/empty liftweb 项目)
- internal -> lift-archetype-basic (基本(liftweb)项目)
- internal -> cocoon-22-archetype-block-plain ([http.//cocoapacorg2/maven-plugins/])
- internal -> cocoon-22-archetype-block ([http.//cocoapacorg2/maven-plugins/])
- internal -> cocoon-22-archetype-webapp ([http.//cocoapacorg2/maven-plugins/])
- internal -> myfaces-archetype-helloworld (使用MyFaces的一个简单的原型)
- internal -> myfaces-archetype-helloworld-facelets (一个使用MyFaces和Facelets的简单原型)
- internal -> myfaces-archetype-trinidad (一个使用MyFaces和Trinidad的简单原型)
- internal -> myfaces-archetype-jsfcomponents (一种使用MyFaces创建定制JSF组件的简单的原型)
- internal -> gmaven-archetype-basic (Groovy的基本原型)
- internal -> gmaven-archetype-mojo (Groovy mojo 原型)
常用的3种
建立Maven项目时,网上建议的分别是
- cocoon-22-archetype-webapp
- maven-archetype-quickstart 常用,表示是一个java项目,其实就是带了maven的java项目
- maven-archetype-webapp 一个简单的Java Web应用程序。 有jsp的MVC。
具体参考link