这篇博文记录学习maven的过程,使用Eclipse Version: Neon.3 Release (4.6.3)
已经内置了maven 3.3.3 但是我使用的是3.3.9版本的maven
介绍
Maven是Apache下一个纯Java开发的开源项目,它是一款项目管理工具,使用maven对java项目进行构建、依赖管理。项目的构建就是一个项目从编写源代码到编译、测试、运行、打包、部署的过程。
优点
1.一个命令完成构建运行,方便快捷
2.maven对每个构建阶段进行规范,有利于团队开发。
依赖管理
什么是依赖?一个java项目可能要使用一些第三方的jar才可以运行,那么我们说这个项目依赖了这些第三方jar包。
比如我们想构建ssh,那么这个项目就依赖struts spring hibernate 所需的jar包
什么是依赖管理?就是对所依赖的jar包进行规范化的管理。因为以往我们需要jar包的话是从网上直接下载jar然后添加到项目的lib目录下。
maven项目的依赖管理
maven管理jar包不需要手动向工程添加jar包,只需要在pom.xml(这是maven项目的配置文件)添加jar包的坐标,自动从maven仓库中下载jar包。
使用maven管理jar包的好处:
1.通过pom.xml文件对jar包的版本进行统一管理,可避免版本冲突。
2.maven维护了一个非常全的maven仓库,里面包括了主流的jar包,maven工程可以自动从仓库下载jar包。
maven的好处
1.一步构建
maven对项目构建的过程进行标准化,通过一个命令就可以完成构建过程
2.依赖管理
maven工程不需要手动导jar包,会自动下载,另外你导入一个jar会导入这个jar依赖的其他jar包
3.跨平台
maven可以在linux,windows上使用
4.maven提高了开发效率降低了维护成本
maven的安装
1.当我们下载好安装包解压后,配置系统变量 MAVEN_HOME 变量值写刚刚解压的目录
2.将 %MAVEN_HOME%/bin 加入到环境变量path中
3.打开cmd输入 mvn -v 如果看到版本信息则配置成功
maven仓库的作用
maven仓库分为远程库本地库中央库,maven就是从远程或中央下载jar到本地,项目中,先去寻找本地库,如果没发现对应的jar,那么就去请求远程库,在没有就去中央库下载到本地库。
本地仓库:
用来存储从远程或中央仓库下载的jar或插件,项目中使用的jar优先从本地库中找。
默认本地仓库位置:${user.dir}/.m2/repository user.dir代表windows的用户目录
我们可以打开maven的安装目录,里面有conf目录里面的settings.xml在里面配置
<localRepository></localRepository>可以改变本地库的位置
远程仓库:
如果本地仓库没有所需要的jar,默认去远程仓库下载,远程库可以在互联网也可以在局域网内。
中央仓库:
在maven软件中内置一个远程仓库,服务于整个互联网,它是由maven团队自己维护,里面存储了非常全的jar包。
maven项目工程目录约定
使用maven创建的工程我们称它为maven工程,maven工程具有一定的目录规范
src/main/java 存放项目的.java文件
src/main/resources 存放项目的配置资源文件
src/test/java 存放所有单元测试 .java文件 如Junti测试类
src/test/resources 测试资源文件
target 编译后的class文件.progect等文件
pom.xml maven项目的核心配置文件
Progect
|-src
| |-main
| | |-java ----存放项目.java
| | |-resources ----存放项目资源文件,如spring配置文件
|-webapps ----web工程的主目录
|-WEB-INF
|-web.xml
|-pom.xml 核心配置文件
maven常用命令
compile
compile是maven工程的编译命令,作用是将src/main/java下的文件编译为class文件输出到target目录下
在maven项目根下 cmd 执行 mvn compile
查看target目录,class文件生成,编译完成。
test
test是maven工程的测试命令,会执行src/test/java 下的单元测试类。
clean
clean是maven工程的清理命令,执行clean会删除target目录。
package
package是maven工程的打包命令,对于java工程执行package打成jar包,对于web工程打成war包
install
install是maven工程的安装命令,执行install会将项目打成jar或war发布到本地仓库
三套生命周期
clean Lifecycle 在进行真正的构建之前进行一些清理工作
Default Lifecycle 构建的核心部分,编译测试打包部署等
Site Lifecycle 生成项目报告,站点,发布站点
maven在eclipse里面的使用
我们打开Window-Prefereces-Maven-Installations
配置完再配置本地仓库 User settings
配置好这些再配置 show view 选择 Maven Repositories
在视图中构建索引,就可以看到本地库中的内容了,前提是你本地库不为空。。。
定义maven坐标
我自己的理解就是告诉maven帮我管理哪个公司的哪个项目的哪个版本的jar
<dependency>
<!-- 项目名称,定义为组织名+项目名,包名 -->
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId><!-- 模块名称 项目名 -->
<version>2.5</version><!-- 版本号 -->
<scope>provided</scope></dependency><!-- 作用范围 -->
new 一个maven项目
finish之后,项目可能pom.xml报错,去因为缺少web.xml文件导致的。自己加进去就行啦。
我们再来看看第二种方式
什么都不选。直接next
next
完成之后项目结构不完整。。不推荐使用。。哈哈。。
配置pom.xml
打开pom.xml
接着
然后ctrl+s保存一下,就可以啦,我们去pom.xml看的时候会发现多了一个struts的配置。
Scope依赖范围详解
A依赖B,需要在A的pom.xml文件添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括:
compile :编译范围,A在编译时依赖B,此范围为默认依赖范围,编译范围的依赖会用在编译、测试、运行
由于运行时需要所以编译范围的依赖会被打包
provided:依赖只有在当jdk或者一个容器已提供该依赖之后才使用,provided依赖在编译和测试时需要,在运行时不需要,比如servlet api我们设置了provided,就是为了防止冲突。
runtime:依赖在运行和测试时需要,但是在编译的时候不需要,比如jdbc驱动包,由于运行时需要所以runtime范围的依赖会被打包。
test:依赖在编译和运行都不需要,只在测试编译和测试运行阶段可用。比如 junit 由于运行时不需要,所以test范围的依赖不会被打包
system: system范围依赖与provided类似,但是必须显式的提供一个对于本地系统中jar文件路径,需要指定systemPath磁盘路径,system依赖不推荐使用。
总结
默认引入的jar ----compile 默认范围可以不写(编译、测试、运行都有效)
servlet-api,jsp-api----provided(编译测试有效,运行无效,防止和tomcat下jar冲突)
jdbc驱动 ----runtime(测试运行有效)
junit----test(测试有效)
依赖范围由强到弱的顺序是:compile>provided>runtime>test
<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>cn.itcast</groupId>
<artifactId>helloStruts</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.24</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<!-- 配置了很多插件,第一个插件是指定项目的jdk版本,添加完此项之后,项目会报错,
直接 右键项目,Maven UpdateProgect就好了,第二个是指定tomcat版本 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port>
<path>/hellostruts</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后我们自己编写一个action测试一下,把struts.xml放到 src/main/respurces下,然后web.xml配置struts的核心过滤器
写好后右键项目run as mavenBuild.. 输入命令tomcat7:run
断点调试
右键项目
二选一,选项目的话,就勾选当前项目即可。
如果不进行这一步进行bug测试,会拦不住bug..拦住了也不显示代码。。必须注意这点。
互联网上找maven JAR的网站 https://mvnrepository.com/
配置远程仓库:
在maven的settings.xml 文件里配置mirrors的子节点,添加如下mirror
例如阿里的maven
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>