如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。
以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。
而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。
安装Maven 和 Maven的Eclipse插件
安装Maven和Maven的Eclipse插件,用Eclipse的同学可以参考,推荐使用IDEA开发;
Maven规定的目录结构
若要使用Maven,那么项目的目录结构必须符合Maven的规范,其目录结构如
下:
Maven基本命令
-v:查询Maven版本
本命令用于检查maven是否安装成功。
Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。
compile:编译
将java源文件编译成class文件
test:测试项目
执行test目录下的测试用例
package:打包
将项目打成jar包
clean:删除target文件夹
install:安装
将当前项目放到Maven的本地仓库中。供其他项目使用
什么是Maven仓库?
Maven仓库用来存放Maven管理的所有Jar包。分为:本地仓库 和 中央仓库。
本地仓库:Maven本地的Jar包仓库。
中央仓库: Maven官方提供的远程仓库。
当项目编译时,Maven首先从本地仓库中寻找项目所需的Jar包,若本地仓库没有,再到Maven的中央仓库下载所需Jar包。
什么是“坐标”?
在Maven中,坐标是Jar包的唯一标识,Maven通过坐标在仓库中找到项目所需的Jar包。
如下代码中,groupId和artifactId构成了一个Jar包的坐标。
<dependency>
<groupId>cn.missbe.web.searchgroupId>
<artifactId>resource-searchartifactId>
<packaging>jarpackaging>
<version>1.0-SNAPSHOTversion>
dependency>
传递依赖 与 排除依赖
<exclusions>
<exclusion>
<groupId>cn.missbe.web.searchgroupId>
<artifactId>resource-searchartifactId>
<packaging>pompackaging>
<version>1.0-SNAPSHOTversion>
exclusion>
exclusions>
依赖范围scope
在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。
依赖冲突
若项目中多个Jar同时引用了相同的Jar时,会产生依赖冲突,但Maven采用了两种避免冲突的策略,因此在Maven中是不存在依赖冲突的。
本项目——>A.jar——>B.jar——>X.jar
本项目——>C.jar——>X.jar
若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X.jar,并且C.jar也引用了X.jar。
在此时,Maven只会引用引用路径最短的Jar。
若引用路径长度相同时,在pom.xml中谁先被声明,就使用谁。
聚合
什么是聚合?
将多个项目同时运行就称为聚合。
如何实现聚合?
只需在pom中作如下配置即可实现聚合:
<modules>
<module>web-connection-poolmodule>
<module>web-java-crawlermodule>
modules>
什么是继承?
在聚合多个项目时,如果这些被聚合的项目中需要引入相同的Jar,那么可以将这些Jar写入父pom中,各个子项目继承该pom即可。
如何实现继承?
cn.missbe.web.search
resource-search
pom
1.0-SNAPSHOT
<parent>
<groupId>父pom所在项目的groupIdgroupId>
<artifactId>父pom所在项目的artifactIdartifactId>
<version>父pom所在项目的版本号version>
parent>
<parent>
<artifactId>resource-searchartifactId>
<groupId>cn.missbe.web.searchgroupId>
<version>1.0-SNAPSHOTversion>
parent>
New Maven项目:选择WebApp:
若使用JSP,需添加Servlet依赖:
注:Servlet依赖只在编译和测试时使用!
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.0.1version>
<scope>providedscope>
dependency>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
<plugin>
<groupId>org.eclipse.jettygroupId>
<artifactId>jetty-maven-pluginartifactId>
<version>9.3.10.v20160621version>
<executions>
<execution>
<phase>packagephase>
execution>
executions>
plugin>
plugins>
运行项目:
输入:jetty:run
访问127.0.0.1:8080
若出现如下界面,表示成功!
pom.xml是Maven的核心,你的项目需要什么Jar包就在pom.xml里面配置。当编译项目时Maven读取该文件,并从仓库中下载相应的Jar包。
<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.0http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId/>
<groupId/>
<version/>
parent>
<modelVersion>4.0.0modelVersion>
<groupId>cn.missbe.webgroupId>
<artifactId>search-resourcesartifactId>
<packaging>warpackaging>
<version>1.0-SNAPSHOTversion>
<name>search-resourcesname>
<url>http://www.missbe.cnurl>
<description>A maven project to study maven.description>
<prerequisites>
<maven/>
prerequisites>
<build>
<sourceDirectory/>
<scriptSourceDirectory/>
<testSourceDirectory/>
<outputDirectory/>
<testOutputDirectory/>
<extensions>
<extension>
<groupId/>
<artifactId/>
<version/>
extension>
extensions>
<resources>
<resource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
resource>
resources>
<testResources>
<testResource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
testResource>
testResources>
<directory/>
<finalName/>
<filters/>
<pluginManagement>
<plugins>
<plugin>
<groupId/>
<artifactId/>
<version/>
<extensions/>
<executions>
<execution>
<id/>
<phase/>
<goals/>
<inherited/>
<configuration/>
execution>
executions>
<dependencies>
<dependency>......dependency>
dependencies>
<inherited/>
<configuration/>
plugin>
plugins>
pluginManagement>
<plugins>
<plugin>
<groupId/>
<artifactId/>
<version/>
<extensions/>
<executions>
<execution>
<id/>
<phase/>
<goals/>
<inherited/>
<configuration/>
execution>
executions>
<dependencies>
<dependency>......dependency>
dependencies>
<goals/>
<inherited/>
<configuration/>
plugin>
plugins>
build>
<modules/>
<repositories>
<repository>
<releases>
<enabled/>
<updatePolicy/>
<checksumPolicy/>
releases>
<snapshots>
<enabled/>
<updatePolicy/>
<checksumPolicy/>
snapshots>
<id>banseon-repository-proxyid>
<name>banseon-repository-proxyname>
<url>http://192.168.1.169:9999/repository/url>
<layout>defaultlayout>
repository>
repositories>
<pluginRepositories>
<pluginRepository>......pluginRepository>
pluginRepositories>
<dependencies>
<dependency>
<groupId>org.apache.mavengroupId>
<artifactId>maven-artifactartifactId>
<version>3.8.1version>
<type>jartype>
<classifier/>
<scope>testscope>
<systemPath/>
<exclusions>
<exclusion>
<artifactId>spring-coreartifactId>
<groupId>org.springframeworkgroupId>
exclusion>
exclusions>
<optional>trueoptional>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>......dependency>
dependencies>
dependencyManagement>
<distributionManagement>
<repository>
<uniqueVersion/>
<id>banseon-maven2id>
<name>banseon maven2name>
<url>file://${basedir}/target/deployurl>
<layout/>
repository>
<snapshotRepository>
<uniqueVersion/>
<id>banseon-maven2id>
<name>Banseon-maven2 Snapshot Repositoryname>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshoturl>
<layout/>
snapshotRepository>
<site>
<id>banseon-siteid>
<name>business api websitename>
<url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-weburl>
site>
<downloadUrl/>
<status/>
distributionManagement>
<properties/>
project>
seon:/var/www/localhost/banseon-web