maven
maven
maven实战:许晓斌
1,maven的初步
1.1 安装
下载maven的3.0.4版本
设置环境变量中的path
1.2 本地仓库安装
1、修改maven目录下的conf中的setting.xml

参见: 3.1 本地仓库
1.3新建一个简单的项目
主要创建文件pom.xml
1.4 创建代码和测试代码
源代码应该放置到src/main/java中
源代码的资源文件应该放置在src/main/resources文件夹中
测试代码应该放置到src/test/java中
测试代码的资源文件应该放置在src/test/resources文件夹中
1.5 运行mvn
mvn clean -->表示运行清理操作(会默认把target文件夹中的数据清理)
mvn clean compile-->表示先运行清理之后运行编译,会见代码编译到target文件夹中
mvn clean test-->运行清理和测试
mvn clean package-->运行清理和打包
mvn clean install-->运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用
mvn clean deploy-->运行清理和发布(发布到私服上面)
1.6 maven的生成方式
·由于maven有一些固定的生成模式,所以使用
mvn archetype generate可以自动完成这个骨架的建立
·使用eclipse开发maven项目
默认STS和myeclipse都自带了maven的支持
如果是eclipse需要安装m2eclipse
2,依赖
2.1 依赖包的查询
1、所有的依赖都是通过坐标来进行存储的(GAV-->groupId、artifactId、version)
2、有一些网上的仓库提供了坐标的查询(http://mvnrepository.com)
3、通过<dependencies>设置依赖
maven是如何搜索依赖的?首先会在本地仓库查询如果本地仓库没有,就去中央仓库查询
2.2 依赖的传递性
1、依赖是会被传递
A-->C B-->A ==> B-->C(这种依赖是基于compile这个范围进行传递)
对于依赖的传递而言,主要是针对compile作用域传递
传递的冲突问题
1、a-->b1.0 c-->b1.1 d-->a和c,这个时候在d的pom中,哪一个依赖先写就使用先写依赖的版本
如果d--><d>a</d><d>c</d>-->依赖版本是b1.0
2、a-->b1.0 c-->b1.1 d-->a和c-->b1.0 f-->d,c,如果路径的长短不一致就选择最小路径
f-->b1.1
3、如果希望精确的控制依赖包,可以使用依赖的排除功能进行控制
2.3 依赖的范围
1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖
2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去
3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突
4、runtime在运行的时候依赖,在编译的时候不依赖
默认的依赖范围是compile
2.4 聚合和继承
在一个pom.xml中执行打包,其他多个包都会执行打包 聚合
新建一个maven工程 ,只需要一个pom.xml文件
默认的中央工厂在maven-model-builderxxx.jar的pom.xml中
一个id为 central的配置下
可以在自己工程中的pom.xml也写个central覆盖他 重写个url
变量,如jar的版本变量
在父pom.xml的dependencyManagement 中配置GAV
在子pom.xml中继承时只需写上GA 不用指明版本,通过继承得到版本
在子pom.xml中继承配置
公共配置都可以移到parent pom.xml
如子pom.xml的groupId version scope properties都可移到到父pom.xml
maven常用属性
${project.groupId}
${project.version}
2.5版本管理
总版本号,分支版本号,小版本号-里程碑版本
总版本号的变动一般表示框架的变动
分支版本号:一般表示增加了一些功能
小版本号:在分支版本上进行bug的修复
里程碑版本:SNAPSHOT快照-->alpha内部测试版本-->beta-->release发布版本-->GA投入市场
user0.0.1-SNAPSHOT-->user0.0.1-release-->user1.0.0SNAPSHOT
--> user0.1.0-SNAPSHOT-->user0.1.0-release
最终合并版本
3仓库
3.1 本地仓库
install
参见: 1.2 本地仓库安装
3.2 中央仓库
3.3 私有仓库
deplooy发布到私有库
局域网内部的仓库
1,nexus安装
nexus有2中版本 jetty war
1,下载nexus -xxx-bundle.tar解压
2,配置bin环境变量
3,执行nexus install安装服务
4修改nexus bin/jsw/conf/wrapper.conf
5、nexus start启动服务
nexus start/stop/status
jetty默认端口8081
http://localhost:8081/nexus/
admin/admin123
JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home'
export JAVA_HOME
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH
export PATH
MAVEN_HOME=/usr/local/apache-maven-3.5.0
PATH=$PATH:$MAVEN_HOME/bin
export MAVEN_HOME
export PATH
NEXUS_HOME=/usr/local/nexus-2.14.4-03-bundle/nexus-2.14.4-03/bin
PATH=$PATH:$NEXUS_HOME
export PATH
2,仓库讲解
1,hosted仓库,内部项目的发布仓库
第3方包如oracle
2,proxy仓库,从远程中央仓库中寻找数据的仓库,仓库地址可以修改
3、group仓库。组仓库用来方便开发人员进行设置的仓库
组可以选择多个仓库
3,私有库设置
在自己的工程pom.xml中设置仓库配置 只有自己工程可用
可以在本地库的一个settings.xml maven/settings.xml设置profile, url没意义因为镜像
这里属于设置releases snapshots
1,更新私有库索引
或者直接下载索引,将其拷贝到中央仓库的索引存储中
2、设置镜像(设置setting.xml)
3、在settings.xml配置仓库,此时本机中的所有maven项目都会去私有仓库中查询依赖
激活配置
4,项目发布
在页面上设置允许发布
1,工程pom.xml的distributionManagement中配置发布
2、设置访问的权限
5,创建项目工厂和设置权限
1、创建两个工厂:release和policy的
2、配置权限

3、创建角色并且分配权限
4、创建用户
5、创建发布的工厂

4,生命周期和插件
生命周期
1,三套生命周期
1、clean
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
2、compile
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 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
3、site
pre-site 执行一些需要在生成站点文档之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到特定的服务器上
插件
插件是maven的核心,所有执行的操作都是基于插件来完成的
为了让一个插件中可以实现众多的类似功能,maven为插件设定了目标,一个插件中有可能有多个目标
其实生命周期中的重要的每个阶段都是由插件的一个具体目标来执行的
发布web工程
1,创建maven web工程
pom.xml配置
创建一个servlet
1 package com.lxl.user.servlet; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 /** 10 * Servlet implementation class HelloServlet 11 */ 12 public class HelloServlet extends HttpServlet { 13 private static final long serialVersionUID = 1L; 14 15 /** 16 * Default constructor. 17 */ 18 public HelloServlet() { 19 // TODO Auto-generated constructor stub 20 } 21 22 /** 23 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 24 */ 25 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 26 request.setAttribute("hello", "lxl"); 27 request.getRequestDispatcher("index.jsp").forward(request, response); 28 } 29 30 /** 31 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 32 */ 33 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 34 // TODO Auto-generated method stub 35 doGet(request, response); 36 } 37 38 }
1 <!DOCTYPE web-app PUBLIC 2 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 3 "http://java.sun.com/dtd/web-app_2_3.dtd" > 4 5 <web-app> 6 <display-name>Archetype Created Web Application</display-name> 7 <servlet> 8 <servlet-name>HelloServlet</servlet-name> 9 <display-name>HelloServlet</display-name> 10 <description></description> 11 <servlet-class>com.lxl.user.servlet.HelloServlet</servlet-class> 12 </servlet> 13 <servlet-mapping> 14 <servlet-name>HelloServlet</servlet-name> 15 <url-pattern>/HelloServlet</url-pattern> 16 </servlet-mapping> 17 </web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page isELIgnored="false" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>hello ${hello}</h1> </body> </html>
发布
1,可以配置jetty插件发布
输入jetty:run发布
访问地址 http://localhost:8787/kk/HelloServlet
2,使用ecplice tomcat 发布
访问地址:http://localhost:8080/user-web/HelloServlet