1.概念:Maven主要服务于基于java平台的项目构建(编译、测试、生成文档、打包、部署等),依赖管理和项目信息管理。
2.四大特性:
2.1:依赖管理系统(jar包管理, jar 升级时修改配置文件即可)
依赖(Coordination):由groupId、artifactId、version组成
例如:
<dependency>
<!--依赖的group ID-->
<groupId>org.apache.maven</groupId> //定义当前Maven项目隶属的实际项目-公司名称。(jar包所在仓库路径) 由于Maven中模块的概念,因此一个实际项目往往会被划分为很多模块。 比如spring是一个实际项目,其对应的Maven模块会有很多,如spring-core,spring-webmvc等
<!--依赖的artifact ID-->
<artifactId>maven-artifact</artifactId> // 该元素定义实际项目中的一个Maven模块-项目名,推荐的做法是使用实际项目名称作为artifactId的前缀。比如:spring-bean、spring-webmvc等
<!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。-->
<version>3.8.1</version> //该元素定义Maven项目当前所处的版本
<!-- 依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应, 尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在 plugin里定义新的类型。所以前面的类型的例子不完整。-->
<type>jar</type>
<!-- 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成 JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。-->
<classifier></classifier>
<!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。
- compile :默认范围,用于编译
- provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
- runtime: 在执行时需要使用
- test: 用于test任务时使用
- system: 需要外在提供相应的元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径
- optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用-->
<scope>test</scope>
<!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。-->
<systemPath></systemPath>
<!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题-->
<exclusions>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
<!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。-->
<optional>true</optional>
</dependency>
2.2:多模块构建
项目分离:dao层、Service层、Controller层
在Maven中需要定义一个parent POM作为一组module的聚合POM。在该POM中可以使用 标签来定义一组子模块。parent POM不会有什么实际构建产出。而parent POM中的build配置以及依赖配置都会自动继承给子module。
2.3:一致的项目结构
Maven在设计之初的理念就是Conversion over configuration(约定大于配置)。其制定了一套项目目录结构作为标准的Java项目结构,解决不同ide 带来的文件目录不一致问题。
2.4:一致的构建模型和插件机制
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<contextPath>/test</contextPath>
</configuration>
</plugin>
3.Maven的安装与配置
3.1:检查jdk版本(1.7或1.7以上):
java -version
3.2:maven下载地址:https://maven.apache.org/download.cgi
3.3.配置Maven环境变量
3.3.1:解压
3.3.2:我的电脑--->属性--->高级系统设置--->环境变量--->点系统变量下边的新建,然后按照我下边的配置即可
3.3.3:在系统变量中的path中添加 %MAVEN_HOME2%\bin
3.3.4:检测maven是否配置成功
4.MAVEN的项目结构:
${basedir} //存放pom和所有子项目
|-- pom.xml
|-- src
| |-- main
| | -- java //项目源码
| | -- resources //项目资源
| | -- test
| | -- java //项目的测试类(如junit)
| | -- resources //测试使用的资源
5.MAVEN的命令:
5.1:命令格式:
mvn [plugin-name]:[goal-name] //命令代表的含义:执行 plugin-name 插件的 goal-name 目标
5.2:常用命令:
mvn –version 显示版本信息
mvn clean 清理项目生产的临时文件,一般是模块下的target目录
mvn compile 编译源代码,一般编译模块下的src/main/java目录
mvn package 项目打包工具,会在模块下的target目录生成jar或war等文件
mvn test 测试命令,或执行src/test/java/下junit的测试用例.
mvn install 将打包的jar/war文件复制到你的本地仓库中,供其他模块使用
mvn deploy 将打包的文件发布到远程参考,提供其他人员进行下载依赖
mvn site 生成项目相关信息的网站
mvn eclipse:eclipse 将项目转化为Eclipse项目
mvn dependency:tree 打印出项目的整个依赖树
mvn archetype:generate 创建Maven的普通java项目
mvn tomcat7:run 在tomcat容器中运行web应用
mvn jetty:run 调用 Jetty 插件的 Run 目标在 Jetty Servlet 容器中启动 web 应用
5.3:命令参数:
5.3.1:-D 传入属性参数
mvn package -Dmaven.test.skip=true 以 -D 开头,将 maven.test.skip 的值设为 true ,就是告诉maven打包的时候跳过单元测试。
mvn deploy-Dmaven.test.skip=true 代表部署项目并跳过单元测试。
5.3.2:-P 使用指定的Profile配置
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>pre</id>
<properties>
<env>pre</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
......
<build>
<filters>
<filter>config/${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
......
</build>
//profiles 定义了各个环境的变量 id , filters 中定义了变量配置文件的地址,其中地址中的环境变量就是上面 profile 中定义的值, resources 中是定义哪些目录下的文件会被配置文件中定义的变量替换。通过maven可以实现按不同环境进行打包部署,例如:mvn package -Pdev -Dmaven.test.skip=true
6:IDEA编辑器集成Maven环境
6.1:修改conf里settings.xml文件
6.1.1:在MAVEN中的conf找到settings.xml,然后进去编辑localRepository,这里编辑的地址是你自己设置的
<localRepository>/path/to/local/repo</localRepository>
6.1.2:找到mirrors在其中间添加阿里云镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
6.2:idea集成Maven
7.idea创建MAVEN项目
maven普通项目创建完成。
7.Maven的常见错误
- 创建Maven后,plugins全部报错
解决方案:
首先,进入maven本地仓库,找到对应的包对应的下载失败的文件(不是jar是last开头的)全部删除
然后在idea中File | Settings | Build, Execution, Deployment | Build Tools | Maven中找到Maven home path 配置成自己所下载的Maven文件,并把User settings file ,Local repository与自己的文件对应
其次,在File | Settings | Build, Execution, Deployment | Build Tools | Maven | Importing中找到 VM options for importer 在其中填上
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
并把JDK for importer 改为c盘下载的jdk版本并点击右下方的apply,还要找到Runner并在Runner 中的VM Options也加上上边的话,JRE也换成c盘所下载jre的版本,最后返回主页面重新运行maven即可解决该问题,如果没解决,重新建一个项目,按照如上方法一步一步走。
- 在上一步建好的基础上,有可能pom文件中build报错
解决方案:
把里面错的全删了,然后刷新
- 在下载依赖的时候,下载完成后依赖爆红
解决方案:
下载对应文件的Download Sources and Documentation即可解决
最后,创作不易,请大家多多支持