经过前面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.1 项目对象模型 Project Object Model
2.2 约定的目录结构
2.3 坐标
2.4 依赖管理
2.5 仓库管理
2.6 生命周期
2.7 插件和目标
2.8 聚合和继承
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下添加如下内容:
3.第一个Maven工程
①目录结构
Hello
|---src
|---|---main
|---|---|---java
|---|---|---resources
|---|---test
|---|---|---java
|---|---|---resources
|---pom.xml
②POM文件内容
③编写主程序代码
在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文件所在的目录!
1)、添加自己已经安装了的maven地址
2)、使用maven自带的配置文件;
项目对象模型 Project Object Model;
pom.xml:是maven工程最重要的配置文件。在这个文件中声明了都导入哪些jar包;
说明当前项目是哪个公司开发的;公司网址的反转
说明当前是什么模块;项目名;
说明当前模块的版本号;
jar包的坐标;
- Maven坐标包含三个向量
①groupId:定义当前Maven项目所隶属的项目,通常为公司或组织的域名的倒序+项目名。例如:org.apache.commons
②artifactId:定义实际项目中的一个模块
③version:定义当前项目的当前版本
组织名+模块名+版本号就能定位到一个jar包;
我们需要告诉maven导入的jar包的这些信息;maven就会自动去下载这个jar包(如果没有)
修改一下maven的配置,让其默认创建jdk1.7及以上的工程!
1、找到maven 的配置文件(比如D:\maven\apache-maven-3.3.9\conf\settings.xml);
2、在标签
标签就可以啦!!!
我们以后导包步骤;
1、去网站maven respository查询jar包(比如webmvc)的坐标
2、写在maven工程的pom.xml文件中
3、看到这个jar包以及他运行期间依赖的所有包全进来了;
Maven程序的下载地址:https://download.csdn.net/download/qq_25106373/10953623;下载后直接解压到无中文路径就可以使用,为了使用方便还上传了本地的maven库,免得什么都去远程下载;
Project Object Model:项目对象模型
Document Object Model:文档对象模型;
maven工程中有一个文件pom.xml
(当前工程所有信息的描述文件)
1、不仅描述当前工程是哪个组织哪个项目的哪个模块的哪个版本;
2、当前项目要依赖其他什么jar包
3、等等....
pom.xml在maven工程中的作用
web.xml在web工程中的作用
每一个jar就是通过坐标进行定位;
com.gome :组织名反写;
在实际开发中;一般写 公司域名反写+项目名称
hello02
在实际开发中一般写模块名称;
以Spring的这些jar为例
本地仓库里面
本地仓库\org\springframework\spring-aop\4.0.0.RELEASE\存了jar包以及源码等....
org.springframework
spring-aop
4.0.0.RELEASE
0.0.1
gav:jar包的坐标
maven用来保存jar包的;
本地仓库:在自己电脑上的maven仓库;默认在用户目录/.m2/repository;
修改了本地目录;去maven的conf文件夹下的setting.xml
直接看有一个注释了的LocalRepository标签。把它打开;配置自己的仓库
私服:局域网范围的一个仓库;
远程仓库:
maven的官方仓库在英国的一个中央仓库;
镜像仓库:中央仓库的本地化;在某个国家本地有一个镜像;
maven自动下jar包的步骤;
去本地仓库看------>私服------->中央仓库;
配置镜像仓库:
在setting.xml中找到mirros标签,在他里面加上
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
麻烦的问题怎么解决:
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运行参数
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)、依赖排除
com.atguigu.maven
maven-01
0.0.1-beta
log4j
log4j
3)、依赖原则?
我们可以先定义一个变量spring.version来统一管理版本号
4.3.9.RELEASE
org.springframework
spring-aop
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-jdbc
${spring.version}
工程的几个方式:
jar:打包成一个普通的jar
war:打包成一个web工程的war包
pom:当前工程不会被打包成什么,这个工程就是保存一些配置;
项目之间可以有父子关系;
子工程里面的配置可以是继承于父工程(父工程必须是pom形式);
父工程里面的东西子工程都是继承来的;
1、创建一个父工程
2、注意点:
1、安装到仓库
1)、父子工程:先安装父,在安装子,否则报错
如果说我们要把子工程安装到maven仓库中,方便别人引用;
就必须先把父工程安装进仓库;
因为我们使用的是gav坐标,maven默认先从本地仓库找;
2)、工程依赖;
安装到仓库;先安装被依赖的这些包,再安装本工程;
1、在父工程里面写;聚合的子工程
child01
child02
2、在子工程里面写;parent;说明当前是继承哪个父工程;
com.atguigu.maven
parent01
0.0.1-SNAPSHOT
child02
3、聚合的好处:我们可以让maven打包或者部署的时候,自动解决依赖的先后顺序,这样我们只需要对父工程进行编译、清除、安装等操作,就不用先操作依赖工程了,maven会自动帮我们查找并添加依赖的工程;
后来开发;分模块开发;
某个模块;
user:
子模块;
子模块;
子模块;
order:
子模块;
子模块;
子模块;
manager:
子模块;
子模块;
子模块;
----------------------------------------------------------------------------------
maven类似的项目构建工具(依赖管理)
maven,gradle,ant,xxx;