一.Maven四大特性
1.Maven给java引入了一个新的依赖管理系统jar包管理,jar升级时修改相应配置文件即可。
2. 以groupId,artifactId,version组成的Coordination (坐标)唯一标识一个依赖,任何基于Maven构建的项目自身也必须定义这三项属性,生成的包可以是jar包,也可以是war包或者jar包。
<dependency>
<groupId>com.javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
3.坐标的理解: Maven坐标为各种组件引入了秩序,任何一个组件都必须明确定义自己的坐标。
4.groupId: (jar包所在的仓库路径),定义当前Maven项目隶属的实际项目-公司名称。通常一个项目会划分为多个模块,如spring ,spring-mvc,spring-core。
5.artifactId: 该元素定义实际项目中一个Maven模块-项目名
6.version: 该元素定义Maven项目当前所处的版本。
二.多模块构建:
1. 项目复查时 dao(mapper) ,service, controller 层分离,从而将一个项目分解为多个模块。
2. 在Maven中需要定义一个parent POM 作为一组module的聚合POM,在POM中可以使用标签来定义一组子模块。 parent POM 不会有什么实际构建产出。而parent POM中的build配置以及依赖配置都会继承给子module。
3.一致的项目结构: Maven设计之初的理念:Conversion over configuration (约定大于配置)。从而制定了一套项目目录结构作为标准的java项目结构,解决不同ide 带来文件目录不一致问题。
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>
三.配置Maven环境变量
1.解压后把Maven的根目录配置到系统环境变量中MAVEN_HOME, 将bin目录配置到path变量中。(maven解压后存放的 目录不要包含中文和空格)
2.检查maven是否配置成功,打开dos窗口,执行mvn -v
四.认识Maven目录结构:
${basedir} : 存放 pom.xml和所有的子目录
${basedir}/src/main/java : 项目的java源代码
${basedir}/src/main/resources :项目的资源,比如说property,mapper等
${basedir}/src/test/java: 项目的测试类,如 JUnit代码
${basedir}/src/test/resources: 测试使用的资源
2.Maven 的 POM.xml 基本配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.Vodka</groupId>
<artifactId>HelloVodka-main</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- java JDK 版本配置-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>14</source>
<target>14</target>
</configuration>
</plugin>
</plugins>
</build>
<!--项目需要的依赖配置-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--jstl依赖-->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
</project>
3.可以修改Maven默认仓库的位置,(maven所有的本地jar包都会放在私有仓库里面),其默认位置是当前用户目录下.m2文件夹中。通过修改下面的路径可以修改本地仓库的位置:
-打开Maven目录 -> conf -> settings.xml
添加仓库位置配置:
F:xxxx/repository
-更换阿里镜像,加快依赖下载
<mirror>
<id> nexus-aliyun</id>
<mirrorOf>central </mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
4.Maven命令
-作为开发利器,了解Maven命令十分有必要,命令格式:
mvn [plugin-name]:[goal-name] (指定某某插件的目标功能)
-常用命令:
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 eclipse:eclipse 将项目转换成eclipse项目
mvn site 生产项目相关信息的网站
mvn dependency: tree 打印出项目的整个依赖树
mvn archetype:generate 创建Maven的普通java项目
mvn tomcat7:run 在tomcat容器中运行工web应用
mvn jetty:run 调用Jetty插件的Run目标在Jetty Servlet 容器中启动web应用
!!!运行maven命令时,首先需要定位到maven项目的目录,也就是项目pom.xml文件所在的目录,否则,必须通过参数来指定项目的目录
5.命令参数:
-D传入属性参数
例如: mvn package -Dmaven.test.skip=true
以-D开头,将maven.test.skip的值设为 true, 该指令打包的时候跳过单元测试。同理,
mvn deploy-Dmaven.test.skip=true , 就是代表部署项目并跳过单元测试。
-P使用过指定的Profile配置:一个项目开发需要多个环境,一般为开发(dev),测试(qa),预发(pre),正式(prod)4个环境。
-profiles 定义了各个环境的变量id, filters 定义了变量配置文件的地址,其中地址中的环境变量就是上面profile中定义的值,resources中是定义哪些目录下的文件会被配置文件中定义的变量替换。
五,Maven环境下构建多模块项目
使用maven 提供的多模块构建的特性完成maven环境下多个模块的项目管理与构建:
以四个模块为例搭建项目:
1. 基模块: maven_parent (POM)
2. 数据库的访问层,例如jdbc操作:maven_dao (jar)
3.项目的业务逻辑层: maven_service (jar)
4.控制层,用于接收请求,响应数据(webapp): maven_controller (war)
(比如: service层调用 dao层的方法, controller层调用service层的方法)
-一个模块要使用另一个模块的方法,就需要在当前模块的pom.xml文件中加入被调用模块的依赖(service层添加Dao层依赖,controller层添加service层依赖,controller层添加service依赖, Dao层添加mysql依赖等等。。。。):
如service.pom.xml:
<dependency>
<!-- 加入Dao层的依赖-->
<groupId>com.Vodka</groupId>
<artifactId>DataAccessObject</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--加入Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
六,Maven的打包操作:
1.Maven可以通过pom.xml配置的方式来实现打包时的环境选择,相比其他打包工具,简化了很多步骤
2.添加Profile文件配置:
<!-- 打包环境配置 开发环境 测试环境 正式环境-->
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<!-- 未指定环境时,默认打包dev环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<profile>
<id>product</id>
<properties>
<env>product</env>
</properties>
</profile>
</profiles>
<!-- 设置资源文件配置-->
<resources>
<resource>
<directory>
src/main/resources/${env}
</directory>
</resource>
<resource>
<directory>
src/main/java
</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
3.打包 : 打开Run/Debug Configurations ,添加要打包的项目目录 ,以及打包命令行:
-clean compile package -Pdev -Dmaven.test.skip=ture (清除缓存,编译,并打包,跳过测试 ,打包成开发版)
-clean compile package -Ptest -Dmaven.test.skip=ture (清除缓存,编译,并打包,跳过测试 ,打包成测试版)
-clean compile package -Pproduct -Dmaven.test.skip=ture (清除缓存,编译,并打包,跳过测试 ,打包成正式版)
-package (简单的打包)
4.依赖的基本配置:
-根元素下projiect下的 dependencies 可以包含多个dependence元素,以声明多个依赖,每个依赖都可以包含以下元素:
1.groupId,artifactId,version: 依赖的基本坐标,Maven根据这仨坐标才能找到相应的依赖。
2.Type: 依赖的类型,大部分情况下不需要声明,默认值为jar
3.Scope: 依赖范围(compile,test,provided,runtime,system(范围与provided一致,慎选,因为不经过Maven仓库解析,可能构建不可移植),Optional,Exclusions)
(provided: 已提供依赖范围,使用此依赖范围的依赖,只对于测试classpath有效,运行时无效。典型例子就是Servlet-api ,编译和测试项目时需要该依赖,但运行该项目时,由于容器已经提供,就不需要Maven重复地引入一遍.
(Optional: 标记依赖是否可选 , Exclusions: 用来排除传递性依赖)