maven的作用
1.管理jar
增加第三方jar (例如我要上传文件,commons-fileupload.jar commons-io.jar )(版本可能下错)maven下载就不会冲突
jar包之间的依赖关系 (commons-fileupload自动关联下载所有依赖的jar)
2.讲项目拆分成若干个模块
maven概念
基于java平台的自动化构建工具
make-ant-maven-gradle
maven能干的事
清理 将编译结果进行删除,为重新编译做准备
编译 java->class
测试 单元测试 开发人员 测试人员 (针对于项目中的关键点进行测试,亦可用项目中的测试代码去测试开发代码)
报告 将测试结果进行显示
打包 将项目中包含的多个文件 压缩成一个文件 用于安装 或者部署 (java项目打包成jar,web项目打包成war)
安装 将打成的包,放到本地仓库(现在有三个模块(项目),一个用来写DAO,一个是service,service依赖于dao,但是这是两个不同的项目,所以就要把它放到本地仓库,让其他模块去安装它,供其他项目使用)
本地仓库
中央仓库 (私服nexus)
中央仓库镜像 缓解服务器压力,不可能只有一个仓库,分流
(本地仓库是远程仓库的一个缓冲和子集,当你构建maven项目的时候,首先会从本地仓库查找资源,如果没有,那么maven会从远程仓库下载到你本地仓库。)
部署 将打成的包,放到服务器上准备运行(将java,js,jsp等各个文件进行筛选,组装,变成一个可以直接运行的项目)
-eclipse中部署的web项目可以运行
-将eclipse中的项目,复制到tmocat/webapps中则不能运行
-项目可以在webapps中直接运行
-eclipse中的项目,在部署时,会生成一个对应的部署项目(在wtpwebapps中)
区别在于:部署项目,没有源码文件,只有编译后的class文件
因为二者目录结构不一致,因此tomcat无法直接运行eclipse中复制过来的项目(因为 如果要在tomcat中运行一个项目,则该项目要严格遵循tomcat目录结构)
可以右键eclipse的项目export,变成war包,然后放到wtpwebapps中,不需要解压,会自动解压(里面的文件结构符合tomcat)
eclipse中的项目要在tomcat里运行,就需要部署
自动化构建工具:将原材料(java,js,css,html,图片)->产品(可发布项目)
编译-打包-部署-测试 (如果没有maven) -》自动构建(maven)
---------------------------
1.下载配置maven
配置JAVA_HOME
配置MAVEN_HOME
M2_HOME
配置path(bin目录)
验证
mvn -v
配置本地仓库
默认本地仓库(可以在maven目录中的conf的settings.xml中查看) : ${user.home}/.m2/repository
修改本地仓库 : <localRepository>路径(例如D:/xxx)</localRepository>
2.使用maven
约定 优于 配置
硬编码方式 job.setPath("d://abc");
配置方式 job conf.xml <path>d:\\abc</path>
约定:使用默认值
maven约定的目录结构:
项目
src
main 程序功能代码
java java代码
resources 资源代码,配置代码
test 测试代码
java
resources
pom.xml 项目对象模型
gav:
<groupId>域名翻转+大项目名</groupId>
<artifactId>子模块名</artifactId>
<version>版本号</version>
-----------------3 坐标详解----------------------------
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>
groupId
定义当前maven项目隶属的实际项目。
groupId的表示方式与Java包名的表示方式类似,如: <groupId>org.sonatype.nexus</groupId>
artifactId
该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目的名称作为artifactId的前缀。
如:<artifactId>nexus-indexer</artifactId>
在默认情况下,maven生成的构件,其文件名会以artifactId作为开头,如:nexus-indexer-2.0.0.jar。
packaging【可选的,默认为jar】:
当不定义packaging时,maven会使用默认值jar。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.6.ga</version>
</dependency>
它被下载后将会被存放至
%repository%/org/hibernate/hibernate/3.2.6.ga/hibernate-3.2.6.ga.jar
其中%repository%就是你本地的repository目录!
不知大家看出来了没有,它是按你的Dependency的groupid + artifactid + version,然后以点号作分隔,来建立文件夹的,最后建立的文件夹如下
|--org
|--hibernate
|--hibernate
|--3.2.6.ga
|--hibernate-3.2.6.ga.jar
可能会有些人会问那个jar包的名字是怎么来的,细心的人或许早己观察出来了,没错,就是artifactId + "-" + version + ".jar"。
依赖:
一开始讲过
在maven项目中,如果要使用一个当时存在的jar或模块,则可以通过依赖实现(本地仓库,远程仓库去寻找)
执行mvn:必须在pom.xml所在的目录中执行(项目路径)
编译(第一次会先下载maven基础jar包,从远程仓库下载后,放到本地仓库,第二次就不用了): mvn compile --只编译main目录
测试(第一次会先下载测试基础环境):mvn test
mvn package(第一次也是会下载执行该命令的基础环境) 打成jar/war
mvn install(同) 将开发的模块 放入本地仓库 供其他模块使用 (路径在仓库的/groupId/ artifactId/ version/下)
mvn clean(同) 清理项目里的编译文件的目录(target目录)
<dependency>
<groudId>junit</groudId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
<dependency>
依赖的范围,依赖的有效性
complie(默认) test provided
compile test provided
(编译)主程序(main) √ × √
(测试)测试程序(test) √ √ √
部署(运行) √ × ×
compile test provided
(编译)主程序(main) A.jar × A.jar
(测试)测试程序(test) A.jar A.jar A.jar
部署(运行) A.jar × ×
maven在编译,测试,运行项目时,各自使用一套classpath
在eclipse中创建maven工程:
1.配置maven
windows -> preferences 输入maven,找到installation,eclipse通常自带,最好使用自己下载的maven,然后user Settings,在User Settings找到自己的settings.xml路径,然后下方的localRepository会更改为你设置的本地仓库路径
在eclipse中编写完pom.xml依赖后,需要右键项目 maven-update project
运行:
Run As:
1 Maven build 执行上次Maven build...
2 Maven build... Goals中可以写clean compile test package等
maven生命周期:
生命周期和构建关系;
生命周期中的顺序:a b c d e
当我们执行c命令,实际执行abc
像package就是处于比较靠后的位置
package命令后,实际执行了:
resources
compile
test
package