工具篇--maven
(只整干货)
Maven官网:https://maven.apache.org/(下载,安装,配置环境变量)
中央仓库下载:http://repo1.maven.org/maven2/
Maven是干啥的?
就是管理项目用的工具。Maven还为全世界的Java开发者提供了一个免费的中央仓库,只要定位了坐标
Maven目录结构
既然管理项目,就应该与项目结合在一起说,创建一个maven企业级项目,我们看一下目录特征:
路径 | 说明 |
src | 源码目录 |
src/main | 源码主目录 |
src/test | 测试源码主目录 |
src/main/java | java源文件目录 |
src/main/resources | 资源目录 |
src/main/webapp | 前端资源目录 |
src/test/java | 测试java源文件目录 |
src/test/resources | 测试资源文件目录 |
README.md | 项目描述 |
pom.xml | maven项目定义 |
LICENSE.txt | 版本声明 |
CHANGELOG.md | 更变日志 |
support | 附加支持工具 |
tools | 附加工具 |
bin | 有用脚本 |
target | 构建输出目录 |
Maven坐标解释
<groupId>com.baidu.checker</groupId>
<artifactId>checker-bill-</artifactId>
<version>0.2.1</version>
<packaging>pom</packaging>
groupId:定义当前maven是项目隶属的实际工程,与java包命名基本相似,通常和域名相反。
artifactId:该元素定义实际项目的一个版块,通常以实际项目名称作为前缀
version:该元素定义maven当前版本
packaging:该元素定义maven打包方式pom、jar、war
其中groupId,artifactId,version 是必须定义的,packaging是可选的,打包的默认值。
初步分析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/maven4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--坐标定位-->
<groupId>com.baidu.check</groupId>
<artifactId>check-bill</artifactId>
<!--版本迭代特别快的时候使用快照版本-SNAPSHOT-->
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<finalName>project-test</finalName> <!---不必要但是推荐添加-->
</build>
<!-- 属性配置 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖配置 -->
<dependencies>
<!-- 添加JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope> <!--依赖范围-->
<optional> false</optional><!--是否允许继承-->
</dependency>
<!--版本统一控制-->
<properties>
<org.springframework.version>4.3.5.RELEASE</org.springframework.version>
</properties>
<!--spring-begin-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artfactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
<!--禁止传递依赖-->
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!--spring-end-->
</dependencies>
</project>
scope
maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。
scope包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围)
optional
设置指依赖是否可选,默认为false,即子项目默认都继承:为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似
maven指令
Maven普通常用命令列表 | |
指令名称 | 指令含义 |
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 tomcat:run | 在tomcat容器中运行web应用 |
mvn jetty:run | 调用 Jetty 插件的 Run 目标在 Jetty Servlet 容器中启动 web 应用 |
在pom.xml中配置skip属性
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
打包发布
mvn clean package -Dmaven.test.skip=true -Pdev -U
安装构件到本地仓库
mvn clean install -Dmaven.test.skip=true -Pdev -U
发布构件到远程仓库
mvn clean deploy -Dmaven.test.skip=true -Pdev -U
聚合与继承
聚合
在使用Maven的过程中,手边可能有很多个项目,都需要打包,或者同时进行一些操作,这时候,如果一个一个手动的去操作,就会显得很麻烦。这时候,使用聚合就可以解决问题了。
现在想将son-1和son-2同时进行打包,这个maven的聚合功能就可已满足需求。如果不会创建聚合项目请参考
http://blog.csdn.net/smd2575624555/article/details/79586024
son-1和son-2是正常项目,father是一个空项目,将son-1和son-2聚合到father项目中,通过打包father项目就可以打包son-1和son-2项目。pom.xml是通过modules这个标签实现的。
聚合项目father的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.father.dome</groupId>
<artifactId>father</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>father</name>
<url>http://maven.apache.org</url>
<modules> <!--聚合项目-->
<module>son-one</module>
<module>son-two</module>
</modules>
</project>
继承
继承的意思和java聚成意义相似,只不过maven继承的pom。继承的方式与添加所需要的jar差不多,通过parent标签实现的。
项目继承pather项目pom文件如下:
<?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.father.dome</groupId>
<artifactId>dome-father</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>father</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- 添加JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
项目继承son项目pom文件如下
<?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>
<parent> <!--项目继承-->
<groupId>com.father.dome</groupId>
<!--father项目一致-->
<artifactId>dome-father</artifactId>
<!--father项目一致-->
<version>1.0-SNAPSHOT</version>
<!--father项目一致-->
</parent>
<groupId>com.son.dome</groupId>
<artifactId>dome-son</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>son</name>
<url>http://maven.apache.org</url>
</project>
环境隔离
工程化项目组中开发时会有很多的项目部署环境,比如开发自测环境,测试环境,线上运行环境等等。maven实现了对不同环境进行隔离,不需要更改配置文件,避免出现问题。
三个环境隔离的pom.xml配置文件
<profile>
<!--测试环境 -->
<profile>
<id>uat</id
<profiles>
<profile>
<!--开发环境 -->
<id>dev</id> <!--环境说明 -->
<properties>
<profile.folder>dev</profile.folder>
</properties>
<activation>
<activeByDefault>false</activeByDefault><!--配置默认自动激活状态 -->
</activation>
<build>
<finalName>ROOT</finalName>
<resources> <!--不同环境替换资源 -->
<resource>
<directory>src/main/profiles/dev</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
<properties>
<profile.folder>uat</profile.folder>
</properties>
<build>
<finalName>ROOT</finalName>
<resources>
<resource>
<directory>src/main/profiles/uat</directory> </resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
<!--生产环境 -->
<profile>
<id>live</id>
<properties>
<profile.folder>live</profile.folder>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<build>
<finalName>ROOT</finalName>
<resources>
<resource>
<directory>src/main/profiles/live</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
</profiles>
使用不同环境进行项目打包:
mvn clean package -Dmaven.test.skip=true -Pdev(环境)