一、基本概念
- 作用 依赖管理 一键构建(自身集成tomcat插件)
- 结构(约定优于配置) 项目目录:/ 用于maven的配置文件:pom.xml 源代码目录:/src 工程源代码目录:/src/main 核心代码:/src/main/java 配置文件:/src/main/resources 测试代码:/src/test/java 测试配置文件:/src/test/resources 页面资源:/src/main/webapp 输出目录:/target 编译之后的class文件:/target/classes
- 仓库 依据:maven工程,jar包坐标 本地仓库(local)、远程仓库(b2b,私服,局域网)、中央仓库(central,英特网)
二、常用命令
- mvn clean 删除编译的项目
- mvn compile 编译项目,放置在target目录下(有classes)
- mvn test 编译项目,包含test
- mvn package 执行test命令,并根据packageing配置打出相应的格式。
- mvn install 执行package命令,并把项目包放进本地仓库中。
- mvn deploy
三、生命周期
默认生命周期:编译(compile)、测试(test)、打包(package)、安装(install)、发布(deploy) 清理生命周期:清除编译信息(clean) 站点生命周期:
四、概念模型
- 项目对象模型(POM) 项目自身信息、运行时所依赖的jar包信息、运行环境信息(jdk、tomcatt)
- 依赖管理模型(依赖管理) jar包坐标:公司组织名称(groupId)、项目名(artifactId)、版本号(version,开发中的项目可以加上“SNAPSHOT”标记,LATEST指某个构建的最新发布,RELEASE指最后一个发布版)
packing:项目的类型,默认为jar,描述了项目打包后的输出。 classifier:不常用,分类器,生成两个单独的构件。
- 生命周期(一键构建) 每一个构建项目的命令都对应了maven底层的一个插件。
五、常见问题
1. 未联网时可以从本地已下载仓库中找资源:
VM Option:-DarchetypeCatalog=internal
2. Jar包冲突
代码语言:javascript复制常见报错:
Caused by:java.lang.NoSuchMethodError
Caused by: java.lang.ClassNotFoundException
Maven默认处理策略:最短路径优先,相同则最先声明优先。
方法一:
Maven Helper插件中的Dependency Analyzer可以分析冲突的jar包,找到标红jar包execute即可。mvn dependency:tree
命令。
方法二:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>zookeeper</artifactId>
<version>3.3.1</version>
<exclusions>
<exclusion>
<groupId>jline</groupId>
<artifactId>jline</artifactId>
</exclusion>
</exclusions>
</dependency>
方法三: 版本锁定原则,一般用在继承项目的父项目中,统一定义jar包版本。
方法四: 某些场景可以使用scope来避免。
代码语言:javascript复制<!-->provied仅在编译时使用<-->
<scope>***</scope>
1.compile
默认,参与整个默认生命周期。
2.test
进参与测试代码编译,如junit。
3.runtime
无需参与项目的编译,不过后期的测试和运行周期需要其参与,类似compile除去编译阶段。
4.provided
不好含打包环境,类似compile除去打包阶段。一般其他地方会提供,只是避免编译时jar包错误。
5.system
类似provided,依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用。
3. 修改运行环境
代码语言:javascript复制<build>
<plugins>
<plugin>
<gorupId>org.apache.tomcat.maven</gorupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8888</port>
</configuration>
</plugin>
<plugin>
<gorupId>org.apache.maven.maven</gorupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-->jdk版本<-->
<target>1.8</target>
<!-->classes文件版本<-->
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
4. sql使用
数据驱动、链接数据库的地址、数据库用户名称、数据库密码
5. 配置文件修改
代码语言:javascript复制<localRepository>/Path/to/local/repo</localRepository>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<mirror>
<id>ibiblio</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>
</mirror>
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name>
<url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
六、参数介绍
1. 多项目管理
maven要求同一个工程的所有子项目都放置到同一个目录下,每一个字目录代表一个项目。 所有的子项目pom.xml都会继承父项目pom的内容,取值为子项目pom内容优先。
代码语言:javascript复制<!-- 父项目 -->
<modules>
<module>module1</module>
<module>module2</module>
</modules>
<!-- 子项目 -->
<parent>
<groupId>com.ustc.cn</groupId>
<artifactId>module_parent</artifactId>
<version>1.0</version>
</parent>
除了继承,maven还支持引用方式。
代码语言:javascript复制<project>
<description>...</description>
...
<dependencies>
...
<dependency>
<groupId>com.ustc.cn</groupId>
<artifactId>module3</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
- 参数 (1)groupId:必须。 (2)artifactId:必须。
(3)version
可以使用区间表达式来表示。
例如:(2.0,)表示>2.0
,[2.0,3.0)表示2.0<=version<3.0
;多个条件之间用逗号分隔[1,3),[5,7]。
(4)scope:作用域限制。 (5)type:一般在pom引用依赖时出现,其他时候不用。
(6)optional 是否可选依赖。maven认为程序对外部的依赖会随着所处的阶段和应用场景而变化,所以maven中的依赖关系有作用域scope的限制。scope又如下取值: 1)compile:编译范围 默认的范围,在所有的classpath中可用,同时它们也会被打包。 2)provided:已提供范围 只有在当JDK或一个容器已提供该依赖之后才使用,在编译classpath可用。 3)runtime:运行时范围 只有在运行和测试系统的时候需要,在编译的时候不需要。如:在编译时不需要JDBC API JAR,,而只有在运行时才需要JDBC驱动实现。 4)test:测试范围 在一般的编译和运行时都不需要,只有在测试编译和测试运行阶段时可用。 5)system:系统范围 和provided类似,但是必须显示的提供一个对本地系统中JAR文件的路径。即必须同时提供一个systemPath元素。