Maven
安装:
解压缩Maven文件夹
配置一个M2_HOME和MAVEN_HOME环境变量,指向变量的Maven的安装目录。
配置PATH环境变量。变量添加%MAVEN_HOME%/bin。
通过Maven文件目录下/confi/setting.xml修改本地仓库地址(localRepository标签)
由于国内你懂的,需要配置mirrors配置国内云
大概流程
当你创建项目时,Maven根据配置文件pom.xml查询jar包。查询规则是:
- 先从你的本地库查询所需的jar包
- 如果差找不到,再从中央仓库下载。
2-1:pom.xml配置一个包的配置方法可以通过该网站搜索对应包的配置信息(http://search.maven.org/)
- 当中央仓库也没有的时候,需要在pom.xml中配置,远程仓库(没有找到的那个jar的仓库)。
3-1:如下例子:
POM.xml文件中 <dependency> <groupId>org.jvnet.localizer</groupId> <artifactId>localizer</artifactId> <version>1.8</version> </dependency> 注意:org.jvnet.localizer并不存在于中央仓库,这时我们需要制定远程仓库:
|
MAVEN的依赖机制
存在的原因:
传递依赖的出现:当A依赖B,而B依赖于C,(A与C是间接依赖;A与B是直接依赖)。当然有可能会依赖出很多不必要的可选依赖。从而导致依赖项越来越多。本地仓库被挤爆了。
MAVEN的两把刷子(依赖机制)
那么当我们使用Maven构建项目的时候,我们只需要在POM中指定直接依赖关系。MAVEN会自动处理其他间接依赖关系。
1.依赖调停(Dependency mediation)
MAVEN会自动引入间接依赖。那么问题来了一个依赖项有多个版本。那么MAVEN如何选择呢?
“MAVEN会选择最近的那一个“ 下面通过一个例子说明。
依赖关系如下: (1)A->B->C->D 2.0 (2)A->E->D1.0 (A直接依赖B、E;E依赖D1.0,而B依赖C,C又依赖D2.0). 那么此时MAVEN如何选择? (1)中有两层间接依赖。(2)中有一层间接依赖。此时MAVEN会选择D1.0,因为(2)比较近 |
2、依赖管理(Dependency management)
(1)依赖管理是“依赖信息”集中化处理。类似java中的子类继承父类
(2)当你有多个项目用到一些相同的依赖项目,可以将这些共同的依赖项放置到一个公共的POM.xml文件中。然后在子pom.xml中引用该公共的pom.xml文件。
参照MAVEN官方代码段
- 依赖范围(Dependency scope)
- compile
这个也是默认的scope。编译的时候需要什么就给你添加什么jar。
2. provided
典型的就是web应用,很多jar在web 容器里面就提供了,那我们就没有必要在发布的时候包含它了。不过编译和测试的时候也还是得要,因为这时还没有容器为你提供。这种scope的jar不能被传递?为什么?不同的容器有不同的内容吧。
3. runtime
运行时需要,编译的时候不用。但是test的时候肯定得要,不run怎么test啊。我一时想不出什么例子。你给点?
4. test
仅仅为test的用的,你肯定一下子就能想到junit。别的不多说。
5. system
如果你有一些包你自己的系统里有,你不想让maven从repository里面下载,你可以用这个选项。
6. import
你知道java是不能多继承的,maven也是。如果这样,似乎不太强大,所以maven可以让你用import从别的project中导入依赖。
4、排除项依赖(Excluded Dependency)
有些包的部分功能我们是不使用的。然而,这部分功能又恰好依赖一个包,
所以我们可以排除这个包。
例子: 第五行到第十行就是。
- <dependency>
- <groupId>group-a</groupId>
- <artifactId>artifact-a</artifactId>
- <version>1.0</version>
- <exclusions>
- <exclusion>
- <groupId>group-c</groupId>
- <artifactId>excluded-artifact</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
5、可选依赖(Optional dependency)
若 D是C的可选依赖,D是E的可选依赖,那么没有D的时候,C和E还是可以工作的。那么可以在C和E里面可以指定D为可选。
Maven 坐标
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
上面的XML代码片段被称为“Maven坐标”,如果你需要 JUnit 的 jar,你需要找出其相应的 Maven 坐标。
它适用于所有其他的依赖,如Spring,Hibernate,Apache 普通的等,只要到Maven中心储存库,并找出哪些是依赖正确的 Maven 坐标。
.Maven的生命周期
下面列出了default、clean和site生命周期的所有构建阶段,这些阶段按照指定的顺序执行。
clean生命周期
执行阶段 | 描述说明 |
pre-clean | 在实际的项目清理之前执行所需的过程 |
clean | 删除前一个构建生成的所有文件 |
post-clean | 执行完成项目清理所需的过程 |
Default生命周期
执行阶段 | 描述说明 |
validate | 验证项目是正确的,所有必要的信息都是可用的。 |
initialize | 初始化构建状态,例如设置属性或创建目录。 |
generate-sources | 生成包含在编译中的任何源代码。 |
process-sources | 处理源代码,例如过滤任何值。 |
generate-resources | 生成包含在包中的资源。 |
process-resources | 将资源复制并处理到目标目录中,准备打包。 |
compile | 编译项目的源代码。 |
process-classes | 从编译后生成生成的文件,例如在Java类上执行字节码增强。 |
generate-test-sources | 生成包含在编译中的任何测试源代码。 |
process-test-sources | 处理测试源代码,例如过滤任何值。 |
generate-test-resources | 为测试创建资源。 |
process-test-resources | 将资源复制并处理到测试目标目录中。 |
test-compile | 将测试源代码编译到测试目标目录 |
process-test-classes | 从测试编译后post-process生成文件,例如在Java类上执行字节码增强。对于Maven 2.0.5和以上。 |
test | 使用合适的单元测试框架运行测试。这些测试不应该要求打包或部署代码。 |
prepare-package | 在实际包装前执行必要的准备工作。这通常会导致包的一个未打包的、经过处理的版本。(Maven 2.1及以上) |
package | 使用已编译的代码,并将其打包成可部署格式,例如JAR。 |
pre-integration-test | 执行集成测试之前需要执行的操作。这可能涉及到设置所需的环境等问题。 |
integration-test | 在需要集成测试的环境中,处理并部署包。 |
post-integration-test | 执行集成测试后所需要的操作。这可能包括清理环境。 |
verify | 运行任何检查以验证包是否有效,并满足质量标准。 |
install | 将该包安装到本地存储库中,作为本地其他项目的依赖项。 |
deploy | 在集成或发布环境中完成,将最终包复制到远程存储库中,以便与其他开发人员和项目共享。 |
Site生命周期
执行阶段 | 描述说明 |
pre-site | 在实际的项目站点生成之前执行过程 |
site | 生成项目的站点文档 |
post-site | 执行确定站点生成的过程,并为站点部署做好准备 |
site-deploy | 将生成的站点文档部署到指定的web服务器 |
Maven创建一般JAVA项目
第一步:创建一个maven项目
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name}-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
第二步:转换成eclipse项目
mvn eclipse:eclipse
(当修改了pom.xml时,也可再调用这个方法进行更新)
注意:可以打包成jar包
mvn package
Maven创建一个web项目
第一步:创建一个web项目
mvn archetype:generate -DgroupId=com.yiibai -DartifactId=CounterWebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
第二步 转换为exlipse web项目
mvn eclipse:eclipse -Dwtpversion=2.0
(注意,此选项 -Dwtpversion=2.0 告诉 Maven 将项目转换到 Eclipse 的 Web 项目(WAR),而不是默认的Java项目(JAR)。)为方便起见,声明 maven-eclipse-plugin,并配置wtpversion 来避免输入参数 -Dwtpversion=2.0。现在,每次使用 mvn eclipse:eclipse,Maven将这个项目导入转换为 Eclipse Web 项目。
POM.xml文件如下:
<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/maven-v4_0_0.xsd">
<dependencies..... </dependencies>
<build><finalName>CounterWebApp</finalName>
<plugins>
<!-- Eclipse project -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>false</downloadJavadocs>
<!-- Avoid type mvn eclipse:eclipse -Dwtpversion=2.0 -->
<wtpversion>2.0</wtpversion>
</configuration>
</plugin>
<!-- Set JDK Compiler Level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/CounterWebApp</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
Maven模板
Maven有很多模板
通常情况下,我们只需要使用下面的两个模板:
maven-archetype-webapp – Java Web Project (WAR)
maven-archetype-quickstart – Java Project (JAR)
使用maven构造项目(package)
基于maven项目打开控制台,进入pom.xml文件所放的项目文件夹,运行
mvn package
你运行“mvn package”命令,它会编译源代码,运行单元测试和包装这取决于在pom.xml文件的“packaging”标签。 例如,
1. If “packaging” = jar, 将您的项目打包成一个“jar”文件,并把它变成你的目标文件夹。
File : pom.xml
<project...><modelVersion>4.0.0</modelVersion><groupId>com.yiibai</groupId><artifactId>Maven Example</artifactId><packaging>jar</packaging> ...
2. 如果 “packaging” = war,将您的项目打包成“war”文件,并把它变成目标文件夹。
File : pom.xml
<project...><modelVersion>4.0.0</modelVersion><groupId>com.yiibai</groupId><artifactId>Maven Example</artifactId><packaging>war</packaging> ...
使用MAVEN清理项目(clean)
在基于Maven的项目中,很多缓存输出在“target”文件夹中。如果想建立项目部署,必须确保清理所有缓存的输出,从面能够随时获得最新的部署。
要清理项目缓存的输出,发出以下命令:
mvn clean
部署进行生产
要部署您的项目进行生产,它总是建议使用 “mvn clean package“, 以确保始终获得最新的部署
Maven运行单元测试(test)
通过Maven运行单元测试,发出此命令:
mvn test
//这样会运行项目中所有的test
若要运行某一个test
mvn -Dtest=类名 test
将项目安装到maven本地库中(install)
在Maven中,可以使用“mvn install”打包项目,并自动部署到本地资源库,让其他开发人员使用它。
mvn install
注意,
当“install”在执行阶段,上述所有阶段 “validate“, “compile“, “test“, “package“, “integration-test“, “verify” 阶段, 包括目前的“install”阶段将被执行有序。
mvn install 示例
一个Java项目,具有以下 pom.xml 文件
File : pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yiibai.core</groupId>
<artifactId>yiibai-core</artifactId>
<packaging>jar</packaging>
<version>99</version>
<name>yiibai-core</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
基于以上pom.xml文件,在“mvn install”被执行,它会打包项目为“yiibai-core-99.jar”文件,并复制到本地存储库。
警告 建议运行“clean”和“install”在一起,让您能始终部署最新的项目到本地存储库。
mvn clean install
生成基于Maven的项目文档站点(site)[鸡肋]
在Maven中,可以使用“mvn site”,为您的项目信息生成文档站点。
mvn site
生成的网站是在项目的“target/site”文件夹中。
Eclipse创建MAVEN的java web项目
【Maven】Eclipse 使用Maven创建Java Web项目