maven是html
而JAVA世界的ant只是一个构建工具,不具有依赖管理的功能,须要配合使用ivy进行依赖管理。java
下载maven,配置环境变量。
升级的技巧:使用符号连接,环境变量指向符号连接,升级的时候修改符号连接便可。web
命令以下mvn archetype:generate
实际上上述命令的完整格式是:mvn groupId:artifactId:version:goal
即运行的是archetype插件的generate目标。
也能够为本身的项目开发archetype。apache
mvn clean compile
mvn clean test
mvn clean package
mvn clean install
mvn clean install
,从新生成jar包。java -jar xxx.jar
三种classpath:编译classpath,测试classpath,运行classpath。tomcat
依赖范围不只能够控制依赖与三种classpath的关系,还对传递性依赖产生影响。网络
传递性依赖机制:maven会解析各个直接依赖的pom,将那些必要的间接依赖以传递性依赖的形式引入到当前项目中。(咱们只须要关心项目的直接依赖)eclipse
maven会自动解析全部项目的直接依赖和传递性依赖,确保每一个构件只有惟一的版本在依赖中存在。最后解析后的这些依赖被称为已解析依赖
。
相关命令
查看已解析依赖:mvn dependency:list
依赖树:mvn dependency:tree
分析依赖:mvn dependency:analyze
maven
maven对构建过程进行了抽象,被称为生命周期
。生命周期自己不作具体任务,实际的任务由插件
完成。这是一种模板方法模式。ide
生命周期包含一些阶段
(phase),这些阶段有先后依赖关系,后面的阶段依赖前面的阶段。能够定义多个生命周期,生命周期之间彼此是独立的,不存在依赖关系。工具
Maven拥有三套独立的生命周期,分别是clean、default和site。
包含三个阶段:
包含的阶段太多,详情 Introduction to the Build Lifecycle。
经常使用的mvn clean compile
命令实际上调用的是clean生命周期的clean阶段和default生命周期的compile阶段。
对于插件而言,为了可以复用代码,它可以执行多个任务,实现多个功能,这些功能汇集在一个插件里,每一个功能就是一个插件目标
。好比maven-dependency-plugin插件,它能够分析项目依赖,列出项目的依赖树,找出无用依赖。
一般写法是:插件:插件目标
。
将生命周期中的阶段和插件目标绑定。
那么在命令行输入生命周期的阶段,则对应的插件目标就会执行相应的任务。
Q:是否能够直接在命令行中直接指定执行某个插件目标'???
A:能够。
多个插件目标能够绑定到同一个阶段。
A Build Lifecycle is Made Up of Phases
A Build Phase is Made Up of Plugin Goals
解决以下需求:想要用一条命令一次性构建多个项目(模块)。
这就是maven聚合(多模块)特性。
方法:增长一个聚合模块,其中的pom.xml中的packaging为pom。
不必定是父子关系,也能够是平行的目录结构。
目的:解决多模块maven项目的配置重复问题。
方法:增长一个父模块,在父pom中声明一些配置供子pom继承。
父模块和聚合模块通常同时存在多模块maven项目中。父模块也要在聚合模块中的modules标签中配置。
能够将一些依赖放到父模块的dependencies元素中,这样子类就无需配置了。但会存在一个问题:全部的子模块都会依赖父模块dependencies元素中声明的依赖,即便一些子模块并不须要这些依赖。
解决方法:
在父模块中使用dependencyManagement元素声明依赖,这些依赖不为直接被子模块继承。子模块若要继承父模块dependencyManagement中声明的某个依赖的话,则须要在子模块中的dependencies元素中从新声明(只须要配置groupId和artifactId便可)。
虽然这种方式不会大幅度的减小配置,可是因为在父模块的pom中统一申明了依赖的版本,能够避免在子模块中使用的依赖版本不一致的状况。
名为import的依赖范围只在dependencyManagement元素下采用效果。其做用是将目标pom中的dependencyManagement配置导入并合并到当前pom中的dependencyManagement元素中。
pluginManagement和dependencyManagement相似。
目的不一样:
聚合模块 vs. 被聚合模块:聚合模块知道被聚合模块,但被聚合模块不知道聚合模块的存在。
父模块 vs. 子模块:父模块不知道那些子模块继承自它,但子模块都知道本身的父模块。
相同点:父模块和聚合模块都没有实际内容,而且二者的pom中的packaging都必须是pom。
实际项目中,会发现一个pom既是父pom,又是聚合pom,这么作主要是为了方便。
全部的pom都继承自超级POM。
对于Maven3,超级POM在$MAVEN_HOME/lib/maven-model-builder-x.x.x.jar中的org/apache/maven/model/pom-4.0.0.xml路径下。
对于Maven2,超级POM在$MAVEN_HOME/lib/maven-model-x.x.x-uber.jar中的org/apache/maven/pom-4.0.0.xml路径下。
在超级POM中已经定义了源代码的路径、构建的输出路径等信息。
构建一个多模块项目时,因为模块间存在继承或者聚合关系,模块间的构建是有前后关系的,总体构成一个有向无环图DAG。反应堆就是全部模块组成的一个构建结构。
好比TensorFlow的持续集成:http://ci.tensorflow.org/
todo
todo
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>8.1.13.v20130916</version> <configuration> <webApp> <contextPath>/</contextPath> </webApp> <connectors> <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> <port>8081</port> <maxIdleTime>60000</maxIdleTime> </connector> </connectors> </configuration> </plugin>
http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin
Cargo支持两种本地部署的方式:standalone模式和existing模式。以下是standalone模式:
<plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.6.2</version> <configuration> <container> <containerId>tomcat8x</containerId> <home>D:\Program Files\apache-tomcat-8.0.23</home> </container> <configuration> <type>standalone</type> <home>${project.build.directory}/tomcat8x</home> <properties> <cargo.servlet.port>8181</cargo.servlet.port> </properties> </configuration> </configuration> </plugin>
existing模式:
<plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.6.2</version> <configuration> <container> <containerId>tomcat8x</containerId> <home>D:\Program Files\apache-tomcat-8.0.23</home> </container> <configuration> <type>existing</type> <home>D:\Program Files\apache-tomcat-8.0.23</home> <!-- existing模式下好像没法更改端口 --> <!--<properties>--> <!--<cargo.servlet.port>8080</cargo.servlet.port>--> <!--</properties>--> </configuration> </configuration> </plugin>
mvn archetype:generate
卡住的问题缘由:
执行命令mvn archetype:generate
时,maven-archetype-plugin插件会先寻找archetype-catalog.xml文件,默认是从中央库中寻找该文件。因为中央库访问比较慢,因此出现卡顿现象。
解决方案:
方案(1):加上archetypeCatalog参数mvn archetype:generate -DarchetypeCatalog=internal
方案(2):配置一个国内的镜像,加速对archetype-catalog.xml的访问。好比阿里云的maven镜像,以下:
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
mvn dependency:get -Dartifact=com.alibaba.citrus:citrus-webx-all:3.2.4:jar:sources mvn dependency:get -Dartifact=com.alibaba.citrus:citrus-webx-all:3.2.4:jar:javadoc