Maven
经过前面ssm等知识的学习,从这篇开始打算着手众筹小项目的练习,用于融合之前学过的知识,以此来记录自己的学习过程;
首先来学习使用maven。
1.Maven简介
1.1 Maven翻译为“专家”,“内行”
1.2 Maven是跨平台的项目管理工具。作为Apache组织提供的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手。
①项目构建
<1>什么是项目构建?项目构建指的是程序模块从清理、编译直到部署的整个过程。
<2>什么是理想的项目构建?高度自动化,跨平台,可重用组件,标准化
②依赖管理(这是我们的主要用途)
<1>应用程序运行时会依赖很多其他应用程序。有些依赖是直接而明确的,例如我们在类中import一个第三方JAR包中的类,缺失所需要的JAR包时编译无法通过;而有些依赖是含蓄而不明显的,例如在使用Strust2时,它的核心Filter,编码时无法发现缺少对应的JAR包,到运行时才会报错,所以依赖管理是十分复杂的,特别是使用第三方程序很多的情况下。
<2>Maven能够提供自动的依赖管理,将所需要的JAR自动导入到工程中,根据既定的规则很好的解决JAR包之间的冲突。
③项目信息管理
<1>Maven能够提供高质量的项目信息,包括依赖关系、测试报告、站点信息等详细内容,并自动生成静态页面,拷贝到服务器上就可以直接使用。
2 Maven核心概念
2.1 项目对象模型 Project Object Model
2.2 约定的目录结构
2.3 坐标
2.4 依赖管理
2.5 仓库管理
2.6 生命周期
2.7 插件和目标
2.8 聚合和继承
3 Maven安装
1.解压部署Maven核心程序
①检查JAVA_HOME环境变量
C:\Windows\System32>echo %JAVA_HOME%
C:\Program Files\java\jdk1.7.0_07
②解压Maven的核心程序
将apache-maven-3.2.2-bin.zip解压到一个非中文无空格的目录下。例如:D:\devsoft\apache-maven-3.2.2
③配置环境变量
M2_HOME D:\devsoft\apache-maven-3.2.2
path D:\devsoft\apache-maven-3.2.2\bin
④查看Maven版本信息验证安装是否正确
C:\Windows\System32>mvn -v
Apache Maven 3.2.2 (45f7c06d68e745d05611f7fd14efb6594181933e; 2014-06-17T21:51:42+08:00)
Maven home: D:\devsoft\apache-maven-3.2.2\bin\..
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: D:\devsoft\jdk1.7.0_07\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
2.修改本地仓库
①默认本地仓库位置:~\.m2\repository
~表示当前用户的家目录,例如:C:\Users\[你当前登录系统的用户名]
②指定本地仓库位置的配置信息文件:apache-maven-3.2.2\conf\settings.xml
③在根标签settings下添加如下内容:<localRepository>[本地仓库路径,也就是RepMaven.zip的解压目录]</localRepository>
3.第一个Maven工程
①目录结构
Hello
|---src
|---|---main
|---|---|---java
|---|---|---resources
|---|---test
|---|---|---java
|---|---|---resources
|---pom.xml
②POM文件内容
<?xml version="1.0" ?>
<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.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version> <name>Hello</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
③编写主程序代码
在src/main/java/com/atguigu/maven目录下新建文件Hello.java,内容如下
package com.atguigu.maven;
public class Hello {
public String sayHello(String name){
return "Hello "+name+"!";
}
}
④编写测试代码
在/src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java
package com.atguigu.maven;
import org.junit.Test;
import static junit.framework.Assert.*;
public class HelloTest {
@Test
public void testHello(){
Hello hello = new Hello();
String results = hello.sayHello("litingwei");
assertEquals("Hello litingwei!",results);
}
}
⑤运行几个基本的Maven命令
mvn compile 编译
mvn clean 清理
mvn test 测试
mvn package 打包
※注意:运行Maven命令时一定要进入pom.xml文件所在的目录!
4 eclipse中使用maven
1)、添加自己已经安装了的maven地址
2)、使用maven自带的配置文件;
项目对象模型 Project Object Model;
pom.xml:是maven工程最重要的配置文件。在这个文件中声明了都导入哪些jar包;
<?xml version="1.0" ?>
<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">
<!--pom模型标准版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- groupId -->说明当前项目是哪个公司开发的;公司网址的反转
<groupId>com.atguigu.maven</groupId>
<!-- artifactId -->说明当前是什么模块;项目名;
<artifactId>Hello</artifactId>
<!-- version -->说明当前模块的版本号;
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name> 工程名字
<!-- 指定要引入哪些jar包;
<dependencies>
<!-- 表示导入junit包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
jar包的坐标;
- Maven坐标包含三个向量
①groupId:定义当前Maven项目所隶属的项目,通常为公司或组织的域名的倒序+项目名。例如:org.apache.commons
②artifactId:定义实际项目中的一个模块
③version:定义当前项目的当前版本
组织名+模块名+版本号就能定位到一个jar包;
我们需要告诉maven导入的jar包的这些信息;maven就会自动去下载这个jar包(如果没有)
5、eclispe默认创建的maven工程;默认是jre1.5,
修改一下maven的配置,让其默认创建jdk1.7及以上的工程!
1、找到maven 的配置文件(比如D:\maven\apache-maven-3.3.9\conf\settings.xml);
2、在标签 <profiles> </profiles>中添加
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>
标签就可以啦!!!
我们以后导包步骤;
1、去网站maven respository查询jar包(比如webmvc)的坐标
2、写在maven工程的pom.xml文件中
3、看到这个jar包以及他运行期间依赖的所有包全进来了;
Maven程序的下载地址:;下载后直接解压到无中文路径就可以使用,为了使用方便还上传了本地的maven库,免得什么都去远程下载;
pom:
Project Object Model:项目对象模型
Document Object Model:文档对象模型;
maven工程中有一个文件pom.xml
(当前工程所有信息的描述文件)
1、不仅描述当前工程是哪个组织哪个项目的哪个模块的哪个版本;
2、当前项目要依赖其他什么jar包
3、等等....
pom.xml在maven工程中的作用
web.xml在web工程中的作用
坐标:
每一个jar就是通过坐标进行定位;
<groupId>com.gome</groupId>:组织名反写;
在实际开发中;一般写 公司域名反写+项目名称
<artifactId>hello02</artifactId>
在实际开发中一般写模块名称;
以Spring的这些jar为例
本地仓库里面
本地仓库\org\springframework\spring-aop\4.0.0.RELEASE\存了jar包以及源码等....
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.0.0.RELEASE</version>
<version>0.0.1</version>
gav:jar包的坐标
仓库:
maven用来保存jar包的;
本地仓库:在自己电脑上的maven仓库;默认在用户目录/.m2/repository;
修改了本地目录;去maven的conf文件夹下的setting.xml
直接看有一个注释了的LocalRepository标签。把它打开;配置自己的仓库
私服:局域网范围的一个仓库;
远程仓库:
maven的官方仓库在英国的一个中央仓库;
镜像仓库:中央仓库的本地化;在某个国家本地有一个镜像;
maven自动下jar包的步骤;
去本地仓库看------>私服------->中央仓库;
配置镜像仓库:
在setting.xml中找到mirros标签,在他里面加上
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
麻烦的问题怎么解决:
1)、联网;
2)、如果报各种maven-plugins;
本地仓库的\org\apache\maven文件夹下把plugins整个删掉,让maven重新下载plugins
3)、一但有报错,看problems问题;如果发现有提示
maven-->update project;
我们就在工程上右键,选中maven--->update project;
选中
生命周期插件:
mvn运行各种命令都是插件完成的;
比如 mvn clean;mvn compile;
每个生命周期的各个环节都是由各种插件完成
- clean生命周期:清理工程:
①pre-clean 执行一些需要在clean之前完成的工作
②clean 移除所有上一次构建生成的文件
③post-clean 执行一些需要在clean之后立刻完成的工作
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building hello02 0.0.1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ hello02 ---
[INFO] Deleting F:\0325EE\hello02\target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.359 s
[INFO] Finished at: 2017-07-01T10:25:55+08:00
[INFO] Final Memory: 6M/121M
[INFO] ------------------------------------------------------------------------
- Site生命周期:生成站点信息;
①pre-site 执行一些需要在生成站点文档之前完成的工作
②site 生成项目的站点文档
③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
④site-deploy 将生成的站点文档部署到特定的服务器上
mvn site:帮我们生成站点的文档(站点信息,依赖..)
- Default生命周期:
Default生命周期
Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如JAR。
pre-integration-test
integration-test
post-integration-test
verify
install将包安装至本地仓库,以让其它项目依赖。
deploy将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
mvn clean:清理编译的项目
mvn compile:编译项目
mvn test:测试项目(运行测试类)
mvn package:负责将我们的项目打包
mvn install:将这个项目安装到仓库中;
我们尝试用eclipse运行maven命令出现这个问题;
-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
解决办法:jre不知道maven的安装目录;设置jre运行参数
依赖的范围(scope):
compile、编译范围
test、测试范围
provided、
maven创建web工程;
web工程创建是选中war:
1)、创建一个普通maven工程
2)、先掉对号,再打上对号;
3)、自动生成web.xml
web工程还是在pom.xml中导包;
maven-web工程一但创建jsp页面,或者写servlet都会报错;
原因:tomcat里面的jar包有解析jsp,servlet的类定义;
解决办法:
第一种)、绑定tomcat运行环境
添加后可以用浏览器访问到index.jsp
第二种)、导入这些jsp、servlet、el表达式等要用的jar(这里推荐第二种)
这种方法也很简单,就是直接都让jsp、servlet的相关依赖,方法我们前边提到过,就是去Maven Repository网站搜索jsp需要的 jar包,添加到pom.xml文件中就可以了
问题也轻松的解决了,嘻嘻。。。
provided范围体验;
只有compile范围的jar包,在项目打包的时候才会带上,其他都不会;
非compile范围的包,maven在打包项目的时候,不会带上;runtime除外;
依赖的传递、排除、依赖原则;
1)、依赖传递
02工程依赖01工程;01工程自己所用的jar包,默认02工程也能用;
非compile范围的jar包不会依赖传递下去;
2)、依赖排除
<dependencies>
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>maven-01</artifactId>
<version>0.0.1-beta</version>
<!-- 可以依赖这个jar的时候,将这个jar所依赖的其他包去除掉 -->
<exclusions>
<!-- 排除一个包 -->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
3)、依赖原则?
统一管理依赖的版本号;
我们可以先定义一个变量spring.version来统一管理版本号
<properties>
<spring.version>4.3.9.RELEASE</spring.version>
</properties>
<dependencies>
<!-- 导入spring的所有模块 -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 运行环境 -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
继承
1、依赖:
工程的几个方式:
jar:打包成一个普通的jar
war:打包成一个web工程的war包
pom:当前工程不会被打包成什么,这个工程就是保存一些配置;
项目之间可以有父子关系;
子工程里面的配置可以是继承于父工程(父工程必须是pom形式);
父工程里面的东西子工程都是继承来的;
1、创建一个父工程
2、注意点:
1、安装到仓库
1)、父子工程:先安装父,在安装子,否则报错
如果说我们要把子工程安装到maven仓库中,方便别人引用;
就必须先把父工程安装进仓库;
因为我们使用的是gav坐标,maven默认先从本地仓库找;
2)、工程依赖;
安装到仓库;先安装被依赖的这些包,再安装本工程;
聚合
1、在父工程里面写;聚合的子工程
<modules>
<module>child01</module>
<module>child02</module>
</modules>
2、在子工程里面写;parent;说明当前是继承哪个父工程;
<parent>
<groupId>com.atguigu.maven</groupId>
<artifactId>parent01</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>child02</artifactId>
3、聚合的好处:我们可以让maven打包或者部署的时候,自动解决依赖的先后顺序,这样我们只需要对父工程进行编译、清除、安装等操作,就不用先操作依赖工程了,maven会自动帮我们查找并添加依赖的工程;
后来开发;分模块开发;
某个模块;
user:
子模块;
子模块;
子模块;
order:
子模块;
子模块;
子模块;
manager:
子模块;
子模块;
子模块;
----------------------------------------------------------------------------------
maven类似的项目构建工具(依赖管理)
maven,gradle,ant,xxx;