精华内容
下载资源
问答
  • maven POM文件详解

    千次阅读 2019-04-22 22:43:50
    http://www.blogjava.net/hellxoul/archive/2013/05/16/399345.html ...1.前言 Maven,发音是[`meivin],"专家"的意思。它是一个很好的项目管理工具,很早就进入了我的必备工具行列,但是这次为了把project1项...

    http://www.blogjava.net/hellxoul/archive/2013/05/16/399345.html

    http://blog.csdn.net/houpengfei111/article/details/9142869

    1.前言

    Maven,发音是[`meivin],"专家"的意思。它是一个很好的项目管理工具,很早就进入了我的必备工具行列,但是这次为了把project1项目完全迁移并应用maven,所以对maven进行了一些深入的学习。写这个学习笔记的目的,一个是为了自己备忘,二则希望能够为其他人学习使用maven 缩短一些时间。

    2.命令
    
    mvn pom.xml文件配置详解
    http://maven.apache.org/ref/2.0.8/maven-model/maven.html
    
    mvn -version/-v 显示版本信息
    mvn archetype:generate   创建mvn项目
    mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app   创建mvn项目
    
    mvn package    生成target目录,编译、测试代码,生成测试报告,生成jar/war文件
    mvn jetty:run    运行项目于jetty上,
    mvn compile      编译
    mvn test      编译并测试
    mvn clean      清空生成的文件
    mvn site      生成项目相关信息的网站
    mvn -Dwtpversion=1.0 eclipse:eclipse   生成Wtp插件的Web项目
    mvn -Dwtpversion=1.0 eclipse:clean   清除Eclipse项目的配置信息(Web项目)
    mvn eclipse:eclipse     将项目转化为Eclipse项目
    
    在应用程序用使用多个存储库
    <repositories>    
    <repository>      
       <id>Ibiblio</id>      
       <name>Ibiblio</name>      
       <url>http://www.ibiblio.org/maven/</url>    
    </repository>    
    <repository>      
       <id>PlanetMirror</id>      
       <name>Planet Mirror</name>      
       <url>http://public.planetmirror.com/pub/maven/</url>    
    </repository> 
    </repositories>
    
    
    mvn deploy:deploy-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar -DrepositoryId=maven-repository-inner -Durl=ftp://xxxxxxx/opt/maven/repository/
    
    
    发布第三方Jar到本地库中:
    
    mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar
    
    
    -DdownloadSources=true
    
    -DdownloadJavadocs=true
    
    mvn -e    显示详细错误 信息.
    
    mvn validate   验证工程是否正确,所有需要的资源是否可用。 
    mvn test-compile 编译项目测试代码。 。 
    mvn integration-test 在集成测试可以运行的环境中处理和发布包。 
    mvn verify   运行任何检查,验证包是否有效且达到质量标准。 
    mvn generate-sources 产生应用需要的任何额外的源代码,如xdoclet。
    
    1. maven概要

    首先我把maven的概念快速的梳理一下,让我们快速地建立起一个比较精确的maven应用场景。
    2.1 maven不是什么

    读书时候要先限定范围,避免一些有害的遐想。要说maven不是什么,我们可以从如下几个要点来展开

    maven不是ant,也不是make。 
    我们以前接触的构建工具,需要写一些详细的步骤,比如: compile project1/src/*.java 等类似的语句。这些语句正是我们使用ant和make所要编写的东西。maven采用了"约定优于配置"的方法,一些开发常用的操作和步骤已经固化在 maven中,所以使用者不再需要去编写那些烦人的语句了。同时,maven内置了开发流程的支持,它不仅能够编译,同样能够打包、发布,也能够一气呵成做完这些所有的步骤。
    maven不是ivy 
    依赖管理是maven的功能之一,虽然很多人包括我以前都是只用它的依赖管理功能,但是要深入运用的话,我们就可以看到更多的内容。更重要的是,maven在依赖关系中加入了scope的概念,进一步细化了依赖关系的划分。
    

    2.2 maven是什么

    maven将自己定位为一个项目管理工具。它负责管理项目开发过程中的几乎所有的东西:

    版本 
    maven有自己的版本定义和规则
    构建 
    maven支持许多种的应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。
    输出物管理 
    maven可以管理项目构建的产物,并将其加入到用户库中。这个功能可以用于项目组和其他部门之间的交付行为。
    依赖关系 
    maven对依赖关系的特性进行细致的分析和划分,避免开发过程中的依赖混乱和相互污染行为
    文档和构建结果 
    maven的site命令支持各种文档信息的发布,包括构建过程的各种输出,javadoc,产品文档等。
    项目关系 
    一个大型的项目通常有几个小项目或者模块组成,用maven可以很方便地管理
    移植性管理 
    maven可以针对不同的开发场景,输出不同种类的输出结果。
    

    2.3 maven的生命周期

    maven把项目的构建划分为不同的生命周期(lifecycle),在我看来,划分的已经是非常仔细了,大家可以参考这里。粗略一点的话,它这个过程(phase)包括:编译、测试、打包、集成测试、验证、部署。maven中所有的执行动作(goal)都需要指明自己在这个过程中的执行位置,然后maven执行的时候,就依照过程的发展依次调用这些goal进行各种处理。

    这个也是maven的一个基本调度机制。一般来说,位置稍后的过程都会依赖于之前的过程。当然,maven同样提供了配置文件,可以依照用户要求,跳过某些阶段。
    2.4 maven的"约定优于配置"

    所谓的"约定优于配置",在maven中并不是完全不可以修改的,他们只是一些配置的默认值而已。但是使用者除非必要,并不需要去修改那些约定内容。maven默认的文件存放结构如下:

    /项目目录
        pom.xml 用于maven的配置文件
        /src 源代码目录
            /src/main 工程源代码目录
                /src/main/java 工程java源代码目录
            /src/main/resource 工程的资源目录
            /src/test 单元测试目录
                /src/test/java
        /target 输出目录,所有的输出物都存放在这个目录下
            /target/classes 编译之后的class文件
    

    每一个阶段的任务都知道怎么正确完成自己的工作,比如compile任务就知道从src/main/java下编译所有的java文件,并把它的输出class文件存放到target/classes中。

    对maven来说,采用"约定优于配置"的策略可以减少修改配置的工作量,也可以降低学习成本,更重要的是,给项目引入了统一的规范。
    2.5 maven的版本规范

    maven使用如下几个要素来唯一定位某一个输出物: groupId:artifactId:packaging:version 。比如org.springframework:spring:2.5 。每个部分的解释如下:

    groupId 
    团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以org.apache开头的groupId。
    artifactId 
    在groupId下的表示一个单独项目的唯一标识符。比如我们的tomcat, commons等。不要在artifactId中包含点号(.)。
    version 
    一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目可以用一个特殊的标识,这种标识给版本加上一个"SNAPSHOT"的标记。 
    虽然项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。一个项目的 groupId:artifactId:version使之成为一个独一无二的项目;你不能同时有一个拥有同样的groupId, artifactId和version标识的项目。
    packaging 
    项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。
    classifier 
    很少使用的坐标,一般都可以忽略classifiers。如果你要发布同样的代码,但是由于技术原因需要生成两个单独的构件,你就要使用一个分类器(classifier)。例如,如果你想要构建两个单独的构件成JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件,它们有同样的groupId:artifactId:version组合。如果你的项目使用本地扩展类库,你可以使用分类器为每一个目标平台生成一个构件。分类器常用于打包构件的源码,JavaDoc或者二进制集合。
    

    maven有自己的版本规范,一般是如下定义 ..- ,比如1.2.3-beta-01。要说明的是,maven自己判断版本的算法是major,minor,incremental部分用数字比较,qualifier部分用字符串比较,所以要小心 alpha-2和alpha-15的比较关系,最好用 alpha-02的格式。

    maven在版本管理时候可以使用几个特殊的字符串 SNAPSHOT ,LATEST ,RELEASE 。比如"1.0-SNAPSHOT"。各个部分的含义和处理逻辑如下说明:

    SNAPSHOT 
    如果一个版本包含字符串"SNAPSHOT",Maven就会在安装或发布这个组件的时候将该符号展开为一个日期和时间值,转换为UTC时间。例如,"1.0-SNAPSHOT"会在2010年5月5日下午2点10分发布时候变成1.0-20100505-141000-1。 
    这个词只能用于开发过程中,因为一般来说,项目组都会频繁发布一些版本,最后实际发布的时候,会在这些snapshot版本中寻找一个稳定的,用于正式发布,比如1.4版本发布之前,就会有一系列的1.4-SNAPSHOT,而实际发布的1.4,也是从中拿出来的一个稳定版。
    LATEST 
    指某个特定构件的最新发布,这个发布可能是一个发布版,也可能是一个snapshot版,具体看哪个时间最后。
    RELEASE 
    指最后一个发布版。
    

    2.6 maven的组成部分

    maven把整个maven管理的项目分为几个部分,一个部分是源代码,包括源代码本身、相关的各种资源,一个部分则是单元测试用例,另外一部分则是各种maven的插件。对于这几个部分,maven可以独立管理他们,包括各种外部依赖关系。
    2.7 maven的依赖管理

    依赖管理一般是最吸引人使用maven的功能特性了,这个特性让开发者只需要关注代码的直接依赖,比如我们用了spring,就加入spring依赖说明就可以了,至于spring自己还依赖哪些外部的东西,maven帮我们搞定。

    任意一个外部依赖说明包含如下几个要素:groupId, artifactId, version, scope, type, optional。其中前3个是必须的,各自含义如下:

    groupId 必须
    artifactId 必须
    version 必须。 
    这里的version可以用区间表达式来表示,比如(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多个条件之间用逗号分隔,比如[1,3),[5,7]。
    scope 作用域限制
    type 一般在pom引用依赖时候出现,其他时候不用
    optional 是否可选依赖
    

    maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。在maven中,scope包含如下的取值:

    compile(编译范围) 
    compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。
    provided(已提供范围) 
    provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。
    runtime(运行时范围) 
    runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。
    test(测试范围) 
    test范围依赖 在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。测试范围依赖在之前的???中介绍过。
    system(系统范围) 
    system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。 如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素 。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。
    

    另外,代码有代码自己的依赖,各个maven使用的插件也可以有自己的依赖关系。依赖也可以是可选的,比如我们代码中没有任何cache依赖,但是hibernate可能要配置cache,所以该cache的依赖就是可选的。
    2.8 多项目管理

    maven的多项目管理也是非常强大的。一般来说,maven要求同一个工程的所有子项目都放置到同一个目录下,每一个子目录代表一个项目,比如

    总项目/
        pom.xml 总项目的pom配置文件
        子项目1/
            pom.xml 子项目1的pom文件
        子项目2/
            pom.xml 子项目2的pom文件
    

    按照这种格式存放,就是继承方式,所有具体子项目的pom.xml都会继承总项目pom的内容,取值为子项目pom内容优先。

    要设置继承方式,首先要在总项目的pom中加入如下配置

    simple-weather
    simple-webapp

    其次在每个子项目中加入

    org.sonatype.mavenbook.ch06
    simple-parent
    1.0

    即可。

    当然,继承不是唯一的配置文件共用方式,maven还支持引用方式。引用pom的方式更简单,在依赖中加入一个type为pom的依赖即可。

    This is a project requiring JDBC ... ... org.sonatype.mavenbook persistence-deps 1.0 pom

    2.9 属性

    用户可以在maven中定义一些属性,然后在其他地方用${xxx}进行引用。比如:

    4.0.0 ... value1 maven提供了三个隐式的变量,用来访问系统环境变量、POM信息和maven的settings:
    env 
    暴露操作系统的环境变量,比如env.PATH
    project 
    暴露POM中的内容,用点号(.)的路径来引用POM元素的值,比如${project.artifactId}。另外,java的系统属性比如user.dir等,也暴露在这里。
    settings 
    暴露maven的settings的信息,也可以用点号(.)来引用。maven把系统配置文件存放在maven的安装目录中,把用户相关的配置文件存放在~/.m2/settings.xml(unix)或者%USERPROFILE%/.m2/settings.xml(windows)中。
    

    2.10 maven的profile

    profile是maven的一个重要特性,它可以让maven能够自动适应外部的环境变化,比如同一个项目,在linux下编译linux的版本,在win下编译win的版本等。一个项目可以设置多个profile,也可以在同一时间设置多个profile被激活(active)的。自动激活的 profile的条件可以是各种各样的设定条件,组合放置在activation节点中,也可以通过命令行直接指定。profile包含的其他配置内容可以覆盖掉pom定义的相应值。如果认为profile设置比较复杂,可以将所有的profiles内容移动到专门的 profiles.xml 文件中,不过记得和pom.xml放在一起。

    activation节点中的激活条件中常见的有如下几个:

    os 
    判断操作系统相关的参数,它包含如下可以自由组合的子节点元素
        message - 规则失败之后显示的消息
        arch - 匹配cpu结构,常见为x86
        family - 匹配操作系统家族,常见的取值为:dos,mac,netware,os/2,unix,windows,win9x,os/400等
        name - 匹配操作系统的名字
        version - 匹配的操作系统版本号
        display - 检测到操作系统之后显示的信息
    jdk 
    检查jdk版本,可以用区间表示。
    property 
    检查属性值,本节点可以包含name和value两个子节点。
    file 
    检查文件相关内容,包含两个子节点:exists和missing,用于分别检查文件存在和不存在两种情况。
    
    1. maven的操作和使用

    maven的操作有两种方式,一种是通过mvn命令行命令,一种是使用maven的eclipse插件。因为使用eclipse的maven插件操作起来比较容易,这里就只介绍使用mvn命令行的操作。
    3.1 maven的配置文件

    maven的主执行程序为mvn.bat,linux下为mvn.sh,这两个程序都很简单,它们的共同用途就是收集一些参数,然后用 java.exe来运行maven的Main函数。maven同样需要有配置文件,名字叫做settings.xml,它放在两个地方,一个是maven 安装目录的conf目录下,对所有使用该maven的用户都起作用,我们称为主配置文件,另外一个放在 %USERPROFILE%/.m2/settings.xml下,我们成为用户配置文件,只对当前用户有效,且可以覆盖主配置文件的参数内容。还有就是项目级别的配置信息了,它存放在每一个maven管理的项目目录下,叫pom.xml,主要用于配置项目相关的一些内容,当然,如果有必要,用户也可以在 pom中写一些配置,覆盖住配置文件和用户配置文件的设置参数内容。

    一般来说,settings文件配置的是比如repository库路径之类的全局信息,具体可以参考官方网站的文章 。
    3.2 创建新工程

    要创建一个新的maven工程,我们需要给我们的工程指定几个必要的要素,就是maven产品坐标的几个要素:groupId, artifactId,如果愿意,你也可以指定version和package名称。我们先看一个简单的创建命令:

    d:\work\temp>mvn archetype:create -DgroupId=com.abc -DartifactId=product1 -DarchetypeArtifactId=maven-archetype-webapp

    首先看这里的命令行参数的传递结构,怪异的 -D参数=值 的方式是 java.exe 要求的方式。这个命令创建一个web工程,目录结构是一个标准的maven结构,如下:
    D:.
    └─mywebapp
    │ pom.xml

    └─src
    └─main
    ├─resources
    └─webapp
    │ index.jsp

    └─WEB-INF
    web.xml

    大家要注意,这里目录结构的布局实际上是由参数 archetypeArtifactId 来决定的,因为这里传入的是 maven-archetype-webapp 如果我们传入其他的就会创建不同的结构,默认值为 maven-archetype-quickstart ,有兴趣的读者可以参考更详细的列表 ,我把部分常用的列表在这里:
    Artifact Group Version Repository Description
    maven-archetype-j2ee-simple org.apache.maven.archetypes A simple J2EE Java application
    maven-archetype-marmalade-mojo org.apache.maven.archetypes A Maven plugin development project using marmalade
    maven-archetype-plugin org.apache.maven.archetypes A Maven Java plugin development project
    maven-archetype-portlet org.apache.maven.archetypes A simple portlet application
    maven-archetype-profiles org.apache.maven.archetypes
    maven-archetype-quickstart org.apache.maven.archetypes
    maven-archetype-simple org.apache.maven.archetypes
    maven-archetype-site-simple org.apache.maven.archetypes A simple site generation project
    maven-archetype-site org.apache.maven.archetypes A more complex site project
    maven-archetype-webapp org.apache.maven.archetypes A simple Java web application
    maven-archetype-har net.sf.maven-har 0.9 Hibernate Archive
    maven-archetype-sar net.sf.maven-sar 0.9 JBoss Service Archive

    大家可以参考更详细的 archetype:create 帮助 和 archtype参考信息 。
    3.3 maven的多项目管理

    多项目管理是maven的主要特色之一,对于一个大型工程,用maven来管理他们之间复杂的依赖关系,是再好不过了。maven的项目配置之间的关系有两种:继承关系和引用关系。
    maven默认根据目录结构来设定pom的继承关系,即下级目录的pom默认继承上级目录的pom。要设定两者之间的关系很简单,上级pom如下设置:

    ABCCommon
    ABCCore
    ABCTools

    要记住的是,这里的module是目录名,不是子工程的artifactId。子工程如下设置:

    com.abc.product1 abc-product1 1.0.0-SNAPSHOT abc-my-module2 jar

    这样两者就相互关联起来了,继承关系就设定完毕,所有父工程的配置内容都会自动在子工程中生效,除非子工程有相同的配置覆盖。如果你不喜欢层层递进的目录结构来实现继承,也可以在parent中加入…/a-parent/pom.xml 来制定parent项目的相对目录。继承关系通常用在项目共同特性的抽取上,通过抽取公共特性,可以大幅度减少子项目的配置工作量。

    引用关系是另外一种复用的方式,maven中配置引用关系也很简单,加入一个 type 为 pom 的依赖即可。

    org.sonatype.mavenbook
    persistence-deps
    1.0
    pom

    但是无论是父项目还是引用项目,这些工程都必须用 mvn install 或者 mvn deploy 安装到本地库才行,否则会报告依赖没有找到,eclipse编译时候也会出错。

    需要特别提出的是复用过程中,父项目的pom中可以定义 dependencyManagement 节点,其中存放依赖关系,但是这个依赖关系只是定义,不会真的产生效果,如果子项目想要使用这个依赖关系,可以在本身的 dependency 中添加一个简化的引用

    org.springframework
    spring

    这种方法可以避免版本号满天飞的情况。
    3.4 安装库文件到maven库中

    在maven中一般都会用到安装库文件的功能,一则是我们常用的hibernate要使用jmx库,但是因为sun的license限制,所以无法将其直接包含在repository中。所以我们使用mvn命令把jar安装到我们本地的repository中

    mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file

    如果我们想把它安装到公司的repository中,需要使用命令

    mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=http://xxx.ss.com/sss.xxx -DrepositoryId=release-repo

    对于我们的工程输出,如果需要放置到公司的repository中的话,可以通过配置pom来实现


    mycompany-repository
    MyCompany Repository
    scp://repository.mycompany.com/repository/maven2

    这里使用的scp方式提交库文件,还有其他方式可以使用,请参考faq部分。然后记得在你的settings.xml中加入这一内容





    mycompany-repository
    jvanzyl

    /path/to/identity
    my_key_passphrase



    3.5 maven的变量

    maven定义了很多变量属性,参考这里 http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide

    内置属性
        ${basedir } represents the directory containing pom.xml
        ${version } equivalent to ${project.version } or ${pom.version }
    Pom/Project properties 
    所有pom中的元素都可以用 project. 前缀进行引用,以下是部分常用的
        ${project.build.directory } results in the path to your "target" dir, this is the same as ${pom.project.build.directory }
        ${project.build. outputD irectory } results in the path to your "target/classes" dir
        ${project.name } refers to the name of the project.
        ${project.version } refers to the version of the project.
        ${project.build.finalName } refers to the final name of the file created when the built project is packaged
    本地用户设定 
    所有用的的 settings.xml 中的设定都可以通过 settings. 前缀进行引用
        ${settings.localRepository } refers to the path of the user's local repository.
        ${maven.repo.local } also works for backward compatibility with maven1 ??
    环境变量 
    系统的环境变量通过 env. 前缀引用
        ${env.M2_HOME } returns the Maven2 installation path.
        ${java.home } specifies the path to the current JRE_HOME environment use with relative paths to get for example: 
        <jvm>${java.home}../bin/java.exe</jvm>
    java系统属性 
    所有JVM中定义的java系统属性.
    用户在pom中定义的自定义属性
    <project> 
        ... 
        <properties> 
            <my.filter.value>hello</my.filter.value> 
        </properties> 
        ... 
    </project> 
    则引用 ${my.filter.value } 就会得到值 hello 
    上级工程的变量 
    上级工程的pom中的变量用前缀 ${project.parent } 引用. 上级工程的版本也可以这样引用:${parent.version }.
    

    3.6 maven的使用

    我们已经知道maven预定义了许多的阶段(phase),每个插件都依附于这些阶段,并且在进入某个阶段的时候,调用运行这些相关插件的功能。我们先来看完整的maven生命周期:
    生命周期 阶段描述
    validate 验证项目是否正确,以及所有为了完整构建必要的信息是否可用
    generate-sources 生成所有需要包含在编译过程中的源代码
    process-sources 处理源代码,比如过滤一些值
    generate-resources 生成所有需要包含在打包过程中的资源文件
    process-resources 复制并处理资源文件至目标目录,准备打包
    compile 编译项目的源代码
    process-classes 后处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)
    generate-test-sources 生成所有包含在测试编译过程中的测试源码
    process-test-sources 处理测试源码,比如过滤一些值
    generate-test-resources 生成测试需要的资源文件
    process-test-resources 复制并处理测试资源文件至测试目标目录
    test-compile 编译测试源码至测试目标目录
    test 使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布
    prepare-package 在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本(将会在Maven 2.1+中实现)
    package 将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR
    pre-integration-test 执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境
    integration-test 如果有必要的话,处理包并发布至集成测试可以运行的环境
    post-integration-test 执行一些在集成测试运行之后需要的动作。如清理集成测试环境。
    verify 执行所有检查,验证包是有效的,符合质量规范
    install 安装包至本地仓库,以备本地的其它项目作为依赖使用
    deploy 复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)

    maven核心的插件列表可以参考 http://maven.apache.org/plugins/index.html 。这里仅列举几个常用的插件及其配置参数:

    clean插件 
    只包含一个goal叫做 clean:clean ,负责清理构建时候创建的文件。 默认清理的位置是如下几个变量指定的路径 project.build.directory, project.build.outputDirectory, project.build.testOutputDirectory, and project.reporting.outputDirectory 。
    compiler插件 
    包含2个goal,分别是 compiler:compile 和 compiler:testCompile 。可以到这里查看两者的具体参数设置:compile , testCompile 。
    surefire插件 
    运行单元测试用例的插件,并且能够生成报表。包含一个goal为 surefire:test 。主要参数testSourceDirectory用来指定测试用例目录,参考完整用法帮助
    jar 
    负责将工程输出打包到jar文件中。包含两个goal,分别是 jar:jar , jar:test-jar 。两个goal负责从classesDirectory或testClassesDirectory中获取所有资源,然后输出jar文件到outputDirectory中。
    war 
    负责打包成war文件。常用goal有 war:war ,负责从warSourceDirectory(默认${basedir}/src/main/webapp)打包所有资源到outputDirectory中。
    resources 
    负责复制各种资源文件,常用goal有 resources:resources ,负责将资源文件复制到outputDirectory中,默认为${project.build.outputDirectory}。
    install 
    负责将项目输出(install:install)或者某个指定的文件(install:install-file)加入到本机库%USERPROFILE%/.m2/repository中。可以用 install:help 寻求帮助。
    deploy 
    负责将项目输出(deploy:deploy)或者某个指定的文件(deploy:deploy-file)加入到公司库中。
    site 
    将工程所有文档生成网站,生成的网站界面默认和apache的项目站点类似,但是其文档用doxia格式写的,目前不支持docbook,需要用其他插件配合才能支持。需要指出的是,在maven 2.x系列中和maven3.x的site命令处理是不同的,在旧版本中,用 mvn site 命令可以生成reporting节点中的所有报表,但是在maven3中,reporting过时了,要把这些内容作为 maven-site-plugin的configuration的内容才行。详细内容可以参考http://www.wakaleo.com/blog/292-site-generation-in-maven-3 
    
    1. maven的使用问答

    除了以下的几个faq条目之外,还有一些faq可以参考

    maven 自己的FAQ
    

    兄弟们如果有其他问题,欢迎跟帖提问!
    4.1 依赖关系

    1. 问:如何增加删除一个依赖关系?

    答:直接在pom文件中加入一个dependency节点,如果要删除依赖,把对应的dependency节点删除即可。
    2) 问:如何屏蔽一个依赖关系?比如项目中使用的libA依赖某个库的1.0版,libB以来某个库的2.0版,现在想统一使用2.0版,如何去掉1.0版的依赖?

    答:设置exclusion即可。

    org.hibernate
    hibernate
    3.2.5.ga


    javax.transaction
    jta



    3) 问:我有一些jar文件要依赖,但是我又不想把这些jar去install到mvn的repository中去,怎么做配置?

    答:加入一个特殊的依赖关系,使用system类型,如下:

    com.abc
    my-tools
    2.5.0
    jar
    system
    ${basedir}/lib/mylib1.jar

    但是要记住,发布的时候不会复制这个jar。需要手工配置,而且其他project依赖这个project的时候,会报告警告。如果没有特殊要求,建议直接注册发布到repository。

    1. 问:在eclipse环境中同时使用maven builder和eclipse builder,并且设置项目依赖关系之后,为什么编译会出现artifact找不到错误,但是直接使用命令行mvn构建则一切正常?

    答:在project属性中去掉java build path中对其他 project 的依赖关系,直接在pom中设置依赖关系即可

    com.abc.project1 abc-project1-common ${project.version} 另外,保证没有其他错误。 5) 问:我想让输出的jar包自动包含所有的依赖

    答:使用 assembly 插件即可。

    maven-assembly-plugin


    jar-with-dependencies


    1. 问:我的测试用例依赖于其他工程的测试用例,如何设置?

    答:maven本身在发布的时候,可以发布单纯的jar,也可以同时发布xxx-tests.jar和xxx-javadoc.jar(大家经常在repository中可以看到类似的东西)。我们自己的项目A要同时输出test.jar可以做如下的设置

    org.apache.maven.plugins maven-jar-plugin test-jar 然后在其他需要引用的工程B中做如下的dependency设置 com.abc.XXX 工程A ${project.version} test-jar test 7)如何让maven将工程依赖的jar复制到WEB-INF/lib目录下?

    8)我刚刚更新了一下我的nexus库,但是我无法在eclipse中用m2eclipse找到我新增的库文件

    修改pom.xml文件,将旧版jar的依赖内容中的版本直接修改为新版本即可。

    9)我要的jar最新版不在maven的中央库中,我怎么办?

    将依赖的文件安装到本地库,用如下命令可以完成:

    mvn install:install-file
    -Dfile=
    -DgroupId=
    -DartifactId=
    -Dversion=
    -Dpackaging=
    -DgeneratePom=true

    Where: the path to the file to load
    the group that the file should be registered under
    the artifact name for the file
    the version of the file
    the packaging of the file e.g. jar

    10)
    4.2 变量

    1. 问:如何使用变量替换?项目中的某个配置文件比如jdbc.properties使用了一些pom中的变量,如何在发布中使用包含真实内容的最终结果文件?

    答:使用资源过滤功能,比如:



    <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
    <jdbc.url>jdbc:mysql://localhost:3306/development_db</jdbc.url>
    <jdbc.username>dev_user</jdbc.username>
    <jdbc.password>s3cr3tw0rd</jdbc.password>





    src/main/resources
    true






    production

    <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName>
    <jdbc.url>jdbc:oracle:thin:@proddb01:1521:PROD</jdbc.url>
    <jdbc.username>prod_user</jdbc.username>
    <jdbc.password>s00p3rs3cr3t</jdbc.password>




    2) 问: maven-svn-revision-number-plugin 插件说明

    答: maven-svn-revision-number-plugin 可以从 SVN 中获取版本号,并将其变成环境变量,交由其他插件或者profile使用,详细帮助在这里 。一般和resource的filter机制同时使用


    com.google.code.maven-svn-revision-number-plugin
    maven-svn-revision-number-plugin
    1.3



    revision






    prefix




    这段代码负责把resource文件中的内容替换成适当内容
    repository = ${prefix.repository}
    path = ${prefix.path}
    revision = ${prefix.revision}
    mixedRevisions = ${prefix.mixedRevisions}
    committedRevision = ${prefix.committedRevision}
    status = ${prefix.status}
    specialStatus = ${prefix.specialStatus}
    3)我的程序有些单元测试有错误,如何忽略测试步骤?

    有好几种方法都可以实现跳过单元测试步骤,一种是给mvn增加命令行参数 -Dmaven.test.skip=true 或者 -DskipTests=true ;另外一种是给surefire插件增加参数,如下:

    [...] org.apache.maven.plugins maven-surefire-plugin 2.8 true [...]
    1. 如果只想运行单个测试用例,能否实现?

    可以,运行时候增加命令行参数 -Dtest=MyTest 即可,其中MyTest是所需要运行的单元测试用例名称,但是不需要包含package部分。
    4.3 编译

    1. 问:如何给插件指派参数?比如我要设置一些编译参数

    答:以下内容设定编译器编译java1.5的代码






    maven-compiler-plugin

    1.5
    1.5







    要设置其他插件的参数也可以,请参考对应插件的帮助信息
    2) 问:我的目录是非标准的目录结构,如何设置让maven支持?

    答:指定source目录和test-source目录即可。

    target
    src
    js/scripts
    test
    bin
    bin

    这个例子把源代码设置成了src目录,测试代码在test目录,所以输出到bin目录。这里要注意,directory如果也设置成bin目录的话,maven打包的时候会引起死循环,因为directory是所有工作存放的地方,默认包含outputDirectory定义的目录在内。
    3) 我源代码是UTF8格式的,我如何在maven中指定?

    设置一个变量即可



    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>



    {color:blue}以上是官方给出的解决方案,但是经过尝试这样只能影响到resource处理时候的编码{color},真正有用的是如下配置:

    {code:xml}



    maven-compiler-plugin

    UTF-8




    {code}

    . 问:我的项目除了main/java目录之外,还加了其他的c++目录,想要一并编译,如何做?
    答:使用native插件,具体配置方法参考[http://mojo.codehaus.org/maven-native/native-maven-plugin/]

    {code:xml}

    org.codehaus.mojo
    native-maven-plugin
    true


    {code}

    . 问:我想要把工程的所有依赖的jar都一起打包,怎么办?
    答:首先修改maven的配置文件,给maven-assembly-plugin增加一个jar-with-dependencies的描述。

    {code:xml}

    […]



    maven-assembly-plugin


    jar-with-dependencies





    […]

    {code}

    然后使用命令打包即可:

    mvn assembly:assembly

    . 问:我想把main/scripts中的内容一起打包发布,如何做?
    答:在pom中配置额外的资源目录。如果需要的话,还可以指定资源目录的输出位置

    {code:xml}




    true
    src/main/command

    run.bat
    run.sh

    /abc


    src/main/scripts




    {code}

    . 问:我有多个源代码目录,但是maven只支持一个main src和一个test src,怎么办?
    答:使用另外一个插件,并仿照如下配置pom

    {code:xml}

    org.codehaus.mojo
    build-helper-maven-plugin
    1.1


    add-source
    generate-sources

    add-source



    src/config/java
    src/main/java
    src/member/java





    {code}

    . 问:我的源代码目录中有一部分文件我不想让maven编译,怎么做?
    答:使用一个maven插件,然后使用includes和excludes。同理,也可以处理资源的过滤。

    {code:xml}

    http://www.cnblogs.com/src/java


    com.sun.enterprise
    hk2-maven-plugin


    com/sun/logging/LogDomains.
    com/sun/enterprise/util/OS.java
    com/sun/enterprise/util/io/FileUtils.java
    com/sun/enterprise/util/zip/
    com/sun/enterprise/util/i18n/
    com/sun/enterprise/deployment/backend/IASDeploymentException.java


    com/sun/enterprise/config/ConfigBeansFactory.java
    com/sun/enterprise/config/clientbeans/






    http://www.cnblogs.com/src/java

    /.properties




    {code}

    . 问:我的项目是一个纯的html组成的项目,没有任何的java代码,怎么跳过编译过程?
    答:配置如下

    {code:xml}

    src/java


    com.sun.enterprise
    hk2-maven-plugin



    {code}

    . 问:我的工程里用hibernate,想在编译时候自动生成ddl,如何做?
    答:添加插件

    hibernate3-maven-plugin

    ,按照如下配置:

    {code:xml}

    org.codehaus.mojo
    hibernate3-maven-plugin
    2.1



    hbm2ddl
    annotationconfiguration





    hsqldb
    hsqldb
    ${hsqldb.version}



    {code}

    . 问:我能用maven支持eclipse RCP项目吗?

    答:当然可以,你可以使用插件 Tycho,详细内容可以参考这里[http://mattiasholmqvist.se/2010/02/building-with-tycho-part-1-osgi-bundles/].

    org.sonatype.tycho target-platform-configuration 0.7.0 p2 另外,老牌的pde-maven-plugin就不要用了,已经好几年没见更新了。

    4.4 ant互动

    1. 如何在maven编译时候运行ant脚本?

    使用专门的antrun插件,并且在target标签内部加入ant的代码

      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.6</version>
        <executions>
          <execution>
            <phase> <!-- 生命周期阶段 --> </phase>
            <configuration>
              <target>
                <!-- 加入target内部的代码 -->
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    

    2)如何在ant脚本中引用maven的classpath?

    maven给每一个依赖都生成了一个属性,格式为"groupId:artifactId[:classifier]:type",比如,如果一下例子就显示依赖的org.apache.common-util的jar文件路径

    另外,maven还预定义了四个classpath的引用,他们是

    maven.compile.classpath
    maven.runtime.classpath
    maven.test.classpath
    maven.plugin.classpath
    

    3)如何使用antrun插件运行外部的build文件?

    很简单,直接在antrun里边使用ant指令即可,如下:

    org.apache.maven.plugins maven-antrun-plugin 1.6 compile compile
                    <ant antfile="${basedir}/build.xml">
                        <target name="test"/>
                    </ant>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
    

    . 问:如何在ant中使用maven的功能?
    答:使用ant的[maven task|http://maven.apache.org/ant-tasks/index.html],不过只有ant 1.6以上和jdk 1.5环境才支持。
    h4. 测试相关
    . 问:如何忽略某个阶段的结果?比如单元测试不一定要全正确
    答:给插件增加testFailureIgnore参数,并设置为false。如果要屏蔽该阶段,则用

    true

    {code:xml}

    […]



    org.apache.maven.plugins
    maven-surefire-plugin

    true




    […]

    {code}

    . 问:我如何在maven中加入PMD,CheckStyle,JDepend等检查功能?
    答:加入PMD检查,以下代码如果在

    reporting

    节点中加入则在

    mvn site

    中执行,如果在

    build

    节点中加入,则在build的时候自动运行检查。详细配置参考[pmd插件使用说明|http://maven.apache.org/plugins/maven-pmd-plugin/]

    {code:xml}


    org.apache.maven.plugins
    maven-pmd-plugin
    2.5


    {code}

    加入 checkstyle 检查,详细配置参考[checkstyle插件使用说明|http://maven.apache.org/plugins/maven-checkstyle-plugin/],同样注意放置在reporting和build节点中的区别(所有报表类插件都要同样注意):

    {code:xml}

    org.apache.maven.plugins
    maven-checkstyle-plugin
    2.5

    {code}

    加入 simian 的支持,simian是一个支持代码相似度检查的工具,目前有maven插件,也有checkstyle的插件。它不仅可以检查java,甚至可以支持文本文件的检查。详细帮助信息参考[这里|http://www.redhillconsulting.com.au/products/simian/]。simian 的 maven插件在[这里|http://mojo.codehaus.org/simian-report-maven-plugin/introduction.html]

    {code:xml}



    org.codehaus.mojo
    simian-maven-plugin
    1.6.1




    {code}

    加入 jdepend 检查,详细配置参考[jdepend使用说明|http://mojo.codehaus.org/jdepend-maven-plugin/],

    {code:xml}

    org.codehaus.mojo
    jdepend-maven-plugin
    2.0-beta-2

    {code}

    加入 findbugz 检查,详细配置参考[findbugz使用说明|http://mojo.codehaus.org/findbugs-maven-plugin/usage.html],

    {code:xml}

    org.codehaus.mojo
    findbugs-maven-plugin
    2.0.1

    {code}

    加入javadoc生成,详细配置参考[javadoc usage|http://maven.apache.org/plugins/maven-javadoc-plugin/usage.html]

    {code:xml}

    org.apache.maven.plugins
    maven-javadoc-plugin
    2.7




    {code}

    加入 jxr 支持,JXR是一个生成java代码交叉引用和源代码的html格式的工具,详细配置信息参考[jxr usage|http://maven.apache.org/plugins/maven-jxr-plugin/]。注意,jxr没有必要在build阶段运行。

    {code:xml}



    org.apache.maven.plugins
    maven-jxr-plugin
    2.1



    {code}

    加入 Cobertura 支持,它是一个代码覆盖率工具,可以用来评估具有相应测试的源代码的比率。详细帮助在[这里|http://mojo.codehaus.org/cobertura-maven-plugin/index.html]。另外一个功能相似的软件是[EMMA|http://emma.sourceforge.net/samples.html],详细的帮助在[这里|http://mojo.codehaus.org/emma-maven-plugin/usage.html]。两个产品的比较文章在[这里|http://www.topcoder.com/tc?module=Static&d1=features&d2=030107],个人倾向于都要用,因为给出的指标不一样,都有参考作用。

    {code:xml|title=Cobertura }

    org.codehaus.mojo
    cobertura-maven-plugin
    2.4


    85
    85
    true
    85
    85
    85
    85


    com.example.reallyimportant.
    90
    80


    com.example.boringcode.
    40
    30







    clean
    check




    {code}

    {code:xml|title=EMMA}





    org.codehaus.mojo
    emma-maven-plugin
    1.0-alpha-3-SNAPSHOT





    {code}

    添加 javaNCSS 插件,它是一个java代码的度量工具,详细参考在[这里|http://mojo.codehaus.org/javancss-maven-plugin/]。

    {code:xml}



    org.codehaus.mojo
    javancss-maven-plugin
    2.0-beta-2



    {code}

    h4. profile相关
    . 问:profile能够设置为某个变量不存在的条件下激活?
    答:使用!前缀,请看示例:

    {code:xml}


    !environment.type


    {code}

    h4. 部署相关
    . 问:其他部署到服务器的方式和配置怎么配?
    答:本文摘自 [http://blog.csdn.net/zyxnetxz/archive/2009/05/18/4199348.aspx]{panel} Distribution Management 用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置 *# 配置到文件系统

    {code:xml}


    proficio-repository
    Proficio Repository
    file://${basedir}/target/deploy


    {code}

    *# 使用ssh2配置

    {code:xml}


    proficio-repository
    Proficio Repository
    scp://sshserver.yourcompany.com/deploy


    {code}

    *# 使用sftp配置

    {code:xml}


    proficio-repositoryi
    Proficio Repository
    sftp://ftpserver.yourcompany.com/deploy


    {code}

    *# 使用外在的ssh配置编译扩展用于指定使用wagon外在ssh提供,用于提供你的文件到相应的远程服务器。

    {code:xml}


    proficio-repository
    Proficio Repository
    scpexe://sshserver.yourcompany.com/deploy





    org.apache.maven.wagon
    wagon-ssh-external
    1.0-alpha-6



    {code}

    *# 使用ftp配置

    {code:xml}


    proficio-repository
    Proficio Repository
    ftp://ftpserver.yourcompany.com/deploy





    org.apache.maven.wagongroupId>
    wagon-ftpartifactId>
    1.0-alpha-6version>



    {code}

    {panel} h4. 插件配置
    . 问:我用maven输出site,如何设置输出为utf8编码?
    答: 配置site插件的编码设置

    {code:xml}


    org.apache.maven.plugins
    maven-site-plugin
    2.0-beta-6

    UTF-8



    {code}

    展开全文
  • 有的公司基于安全考虑,要求使用通过安全认证的代理访问网络,这种情况需要为maven配置http代理,它才能正常访问...(1)设置MAVEN_OPTS环境变量,是java运行maven时参数 因为java的默认内存往往不能够满足maven运...

    1 设置 http代理:

    有的公司基于安全考虑,要求使用通过安全认证的代理访问网络,这种情况需要为maven配置http代理,它才能正常访问外部仓库。在setting.xml配置,<proxies></proxies>

    2 maven安装最佳实践

    (1)设置MAVEN_OPTS环境变量,是java运行maven时参数

    因为java的默认内存往往不能够满足maven运行的需要,比如项目较大时,使用maven生成项目站点需要占用大量内存,如果没有该配置,则很容易得到java.lang.OutOfMemeoryError

    (2)配置用户范围settings.xml

    $M2_HOME/conf/setting.xml 全局范围,整台机器所有用户都受影响

    ~/.m2/setting.xml用户范围的。

    推荐使用用户范围:避免无意识影响其他用户;便于升级,否则每次升级新版本都要复制$M2_HOME/conf/setting.xml文件,使用~/.m2/setting.xml则不需要。

    默认情况下,~/.m2/setting.xml不存在,用户需要从$M2_HOME/conf/setting.xml复制再进行编辑。

    (3)不要使用ide内嵌maven:内嵌版本新,不稳定

    3maven项目结构(约定,特殊需要可以自定义配置(不推荐))

    src/main/java 主代码

    src/test/java测试代码,主代码会被打包到最终构件中,测试代码不会

    target/classes/:编译输出目录

    target/:包输出目录

    4编写pom

    <!-- 命名空间,xsd便于xml编辑器快速编辑pom -->
    <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/maven-v4_0_0.xsd">
        
        <!-- modelVersion指定当前pom版本,maven2,3只能是4.0.0 -->
        <modelVersion>4.0.0</modelVersion>
        <!-- 组,通常是组织.项目-->
        <groupId>cn.temptation</groupId>
        <!-- 组中唯一id-->
        <artifactId>ssm</artifactId>
        <!-- 打包方式:jar(默认),war -->
        <packaging>war</packaging>
        <!-- 版本,SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本 -->
        <version>0.0.1-SNAPSHOT</version>
        <!-- 对于用户的友好项目名 -->
        <name>ssm Maven Webapp</name>
        <url>http://maven.apache.org</url>
        
        <properties>
            <!-- Spring版本号 -->
            <spring.version>4.3.8.RELEASE</spring.version>
        </properties>
        
        <dependencies>
            
            
        </dependencies>
        <build>      
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.5</source>
                        <target>1.5</target>
                    </configuration>
                </plugin>
                
                <plugin>
                	<groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>1.2.1</version>
                    <executions>
                    	<execution>
                    		<phase>package</phase>
                    		<goals>
                    			<goal>shade</goal>
                    		</goals>
                    		<configuration>
                       			<transformers>
                       				<transformer implementation="org.apache.maven.plugins.shade.resource.MnifestResouceTransformer">
                       					<mainClass>#包含main方法的全类名#</mainClass>
                       				</transformer>
                       			</transformers>
                            </configuration>
                    	</execution>
                    </executions>                
                </plugin>
            </plugins>
        </build>
    </project>

    4.1dependency依赖

    groupId,artifactId,version:基本坐标

    type:依赖的类型,对应于项目坐标定义的packaging

    scope:依赖的范围:用来控制与三种classpath(编译,测试,运行)的关系。

    (1)compile(默认):编译

    (2)test:测试

    (3)provided:已提供。编译和测试有效,但运行时无效,如:servlet-api,编译和测试项目需要该依赖,项目运行时由于容器已提供,就不需要maven重复地引入一遍。

    (4)runtime:运行时依赖范围。测试和运行有效,编译主代码时无效。如:jdbc,项目主代码编译只需要jdk提供的jdbc接口,只有在执行测试或者运行项目时才需要实现上述接口的具体jdbc驱动。

    (5)system(不建议使用):系统依赖范围,与provided相同,但必须通过systemPath元素显示地指定依赖文件的路径

    (6)import:导入依赖范围

    optional:标记依赖是否可选

    exclusions:用来排除传递性依赖

    4.2传递性依赖

    maven会解析各个直接依赖的pom,将那些必要的间接依赖以传递性依赖的形式引入到当前项目中。

    例如:a项目依赖org.springframework:spring-core:2.5.6依赖,而spring-core也有它自己的依赖,可以直接访问它在中央仓库的pom。该文件包含了一个commons-logging依赖。依赖范围都时compile。commons-logging就是account-email的传递性依赖,依赖范围也是compile。

    4.3传递性依赖的依赖范围

    4.4依赖调节

    当传递性依赖版本冲突时,依赖调节原则:

    (1)路径最近者优先

    (2)路径相同时,在pom中依赖声明順序决定。

    4.5可选依赖(不建议使用)

    (1)可选依赖依赖不会传递

    (2)可选依赖是指两个特性互斥,比如:一个持久层隔离工具包,支持多种数据库,在构件工具包时需要这两种数据库的驱动程序,但在使用这个工具包时只会依赖一种数据库。此时,将各个数据库驱动设置成可选依赖。

    4.6排除依赖

    (1)传递性依赖引入了一个SNAPSHOT不稳定版本,会影响当前项目,此时需要排除

    (2)hibernate依赖于Sun JTA API,但由于版权原因不在中央仓库,由别的替换

    (3)声明排除依赖时秩序groupId和artifactId而不需要version元素,因为只需groupId和artifactId就能定位(maven解析后的依赖中,不可能出现groupId和artifactId相同但是版本不同的两个依赖(依赖调节))。

    4.7归类依赖

    如下配置,运行时会把所有${spring.version}替换成4.3.8.RELEASE

        <properties>
            <!-- Spring版本号 -->
            <spring.version>4.3.8.RELEASE</spring.version>
        </properties>

    4.8优化依赖

    应对maven项目的依赖了然于胸,并对其优化,如去除多余的依赖,显示地声明某些必要的依赖。

    (1)查看已解析依赖:mvn dependency :list(eclipse中 dependency:list)显示所有已解析依赖的信息和依赖范围

    (2)查看依赖树:mvn dependency:tree

    (3)分析依赖树:mvn dependency:analyze

    该结果中重要的两个部分:

    Used undeclared dependencies:项目中使用到的但没有显示声明的依赖。如果有很多java import声明,这些传递性依赖版本发生变化时,有可能导致程序出错,这种错误很难查出,因此应该显示声明项目中直接用到的依赖。

    Unused declared dependencies:项目中未使用但显示声明的应用,但由于dependency:analyze只分析编译主代码和测试代码需要用到的依赖,发现不了执行测试和运行时需要的依赖,因此删除依赖声明可能把这些依赖删除,要小心测试。

     

    5maven插件和插件目标

    (mvn clean compile)

    (mvn clean test)

    clean:clean 清理

    resources:resources 主资源处理

    compiler:complile 主代码编译

    resources:testResources测试资源处理

    compiler:testCompile 测试代码编译

    surefire:test     surefire是maven中负责执行测试的插件

    (mvn clean package)

    jar:jar 将项目主代码打包成一个名为artifact-version.jar的文件,该文件位于/target输出目录中。如有需要还可以使用finalName自定义该文件名

    (mvn clean install)

    install:install 将输出的jar包安装到maven本地仓库中,其他maven项目才能使用它。

    借助maven-shade-plugin插件生成可执行jar

                <plugin>
                	<groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>1.2.1</version>
                    <executions>
                    	<execution>
                    		<phase>package</phase>
                    		<goals>
                    			<goal>shade</goal>
                    		</goals>
                    		<configuration>
                       			<transformers>
                       				<transformer implementation="org.apache.maven.plugins.shade.resource.MnifestResouceTransformer">
                       					<mainClass>#包含main方法的全类名#</mainClass>
                       				</transformer>
                       			</transformers>
                            </configuration>
                    	</execution>
                    </executions>                
                </plugin>

    6Archetype生成项目骨架(基本目录结构,pom文件内容)

     

     

     

     

    展开全文
  • 4) optional:当该项目本身作为其他项目的一个依赖标记依赖为可选项。假设现在projectA有一个依赖性projectB,我们把projectB这个依赖项设为optional,这表示projectB在projectA的运行时不一定会用到。这个时候...

    依赖Dependency

         项目之间的依赖是通过pom.xml文件里面的dependencies元素下面的dependency元素进行的。一个dependency元素定义一个依赖关系。在dependency元素中我们主要通过依赖项目的groupId、artifactId和version来定义所依赖的项目。

           先来看一个简单的项目依赖的示例吧,假设我现在有一个项目projectA,然后它里面有对junit的依赖,那么它的pom.xml就类似以下这个样子:

    <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>com.tiantian.mavenTest</groupId>  
      <artifactId>projectB</artifactId>  
      <version>1.0-SNAPSHOT</version>  
      <packaging>jar</packaging>  
       
      <dependencies>  
        <dependency>  
          <groupId>junit</groupId>  
          <artifactId>junit</artifactId>  
          <version>3.8.1</version>  
          <scope>test</scope>  
                  <optional>true</optional>  
        </dependency>  
      </dependencies>  
    </project>  

           在dependency元素中除了可以指定依赖项目的groupId、artifactId和version之外,还可以指定以下元素:

    1)  type:对应于依赖项目的packaging类型,默认是jar

    2)  scope:表示依赖项目的一个作用范围。scope的主要取值范围如下(还有一个是在Maven2.0.9以后版本才支持的import,关于import作用域将在后文《Dependency介绍》中做介绍):

           a.  compile:这是它的默认值,这种类型很容易让人产生误解,以为只有在编译的时候才是需要的,其实这种类型表示所有的情况都是有用的,包括编译和运行时。而且这种类型的依赖性是可以传递的。

           b.  provided:这个跟compile很类似,但是它表示你期望这个依赖项目在运行时由JDK或者容器来提供。这种类型表示该依赖只有在测试和编译的情况下才有效,在运行时将由JDK或者容器提供。这种类型的依赖性是不可传递的。

           c.  runtime:这种类型表示该依赖在编译的时候不是必须的,只有在运行的时候才是必须的。

           d.  test:这表示这种依赖只有测试的时候才需要,正常情况下是不需要的。

           e.  system:这种类型跟provided类似,唯一不同的就是这种类型的依赖我们要自己提供jar包,这需要与另一个元素systemPath来结合使用。systemPath将指向我们系统上的jar包的路径,而且必须是给定的绝对路径。

    3)  systemPath:上面已经说过了这个元素是在scope的值为system的时候用于指定依赖的jar包在系统上的位置的,而且是绝对路径。该元素必须在依赖的 jar包的scope为system时才能使用,否则Maven将报错。

    4)  optional:当该项目本身作为其他项目的一个依赖时标记该依赖为可选项。假设现在projectA有一个依赖性projectB,我们把projectB这个依赖项设为optional,这表示projectB在projectA的运行时不一定会用到。这个时候如果我们有另一个项目projectC,它依赖于projectA,那么这个时候因为projectB对于projectA是可选的,所以Maven在建立projectC的时候就不会安装projectB,这个时候如果projectC确实需要使用到projectB,那么它就可以定义自己对projectB的依赖。当一个依赖是可选的时候,我们把optional元素的值设为true,否则就不设置optional元素。

    5)  exclusions:考虑这样一种情况,我们的projectA依赖于projectB,然后projectB又依赖于projectC,但是在projectA里面我们不需要projectB依赖的projectC,那么这个时候我们就可以在依赖projectB的时候使用exclusions元素下面的exclusion排除projectC。这个时候我们可以这样定义projectA对projectB的依赖:

    <dependencies>  
         <dependency>  
                <groupId>com.tiantian.mavenTest</groupId>  
                <artifactId>projectB</artifactId>  
                <version>1.0-SNAPSHOT</version>  
                <exclusions>  
                       <exclusion>  
                              <groupId>com.tiantian.mavenTest</groupId>  
                              <artifactId>projectC</artifactId>  
                       </exclusion>  
                </exclusions>  
         </dependency>  
    </dependencies>  

     

    属性变量

    在pom.xml文件中我们可以使用${propertyName}的形式引用属性。这个propertyName有以下几种形式:

    1)  env.propertyName:这种形式表示引用的是环境变量,比如我们需要引用当前系统的环境变量PATH的时候,就可以使用${env.PATH}。

    2) project.propertyName:这种形式表示引用的是当前这个pom.xml中project根元素下面的子元素的值。比如我们需要引用当前project下面的version的时候,就可以使用${project.version}。

    3)  settings.propertyName:这种形式引用的是Maven本地配置文件settings.xml或本地Maven安装目录下的settings.xml文件根元素settings下的元素。比如我们需要引用settings下的本地仓库localRepository元素的值时,我们可以用${settings.localRepository}

    4)  java的系统属性,所有在java中使用java.lang.System.getProperties()能够获取到的属性都可以在pom.xml中引用,比如${java.home}。

    5) pom.xml中properties元素下面的子元素作为属性。假如在pom.xml中有如下一段代码<properties><hello.world>helloWorld</hello.world></properties>,那么我们就可以使用${hello.world}引用到对应的helloWorld。

     

    转载于:https://my.oschina.net/gaoguofan/blog/756278

    展开全文
  • maven如何去除没有使用的依赖: 项目做了比较大的改动。 以前很多的依赖都没有用了。 能否让maven或者eclipse自动检索,哪些依赖是没有被使用的。标记出来或者直接删除。 方法1: 好像没有这个功能。你可以手动...

    maven如何去除没有使用的依赖:

    项目做了比较大的改动。
    以前很多的依赖都没有用了。
    能否让maven或者eclipse自动检索,哪些依赖是没有被使用的。标记出来或者直接删除。

    方法1:

    好像没有这个功能。你可以手动筛选。把不是必须的包配置注释掉。如果报异常,就把需要的包的注释打开。

    方法2:

    >mvn dependency:analyze

    [INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ wtp-core ---
    [WARNING] Used undeclared dependencies found:
    [WARNING]    org.springframework:spring-beans:jar:3.2.3.RELEASE:compile
    [WARNING] Unused declared dependencies found:
    [WARNING]    junit:junit:jar:4.7:test
    [WARNING]    org.springframework:spring-test:jar:3.2.3.RELEASE:test
    [WARNING]    org.slf4j:jcl-over-slf4j:jar:1.6.1:runtime
    [WARNING]    org.slf4j:slf4j-log4j12:jar:1.6.1:runtime
    [WARNING]    commons-lang:commons-lang:jar:2.5:test

    方法3:

    可以用 查看项目依赖:mvn dependency:analyze; 或 mvn dependency:analyze -DignoreNonCompile

    查看项目直接和传递依赖:mvn dependency:tree ;

    查看maven构建时有效的pom:mvn help:effective-pom 来看哪些jar是不需要的,再排除就好了。

    展开全文
  • maven--pom.xml--依赖--使用/教程/实例

    多人点赞 2021-11-18 19:40:09
    本文介绍mavenpom.xml的依赖的用法,包括:依赖写法、依赖原则、依赖范围、依赖的传递性与排除、dependencyManagement、引入第三方依赖依赖写法 说明 如果Maven项目要引入某个依赖,需要三要素:groupId、...
  • Maven 依赖范围和依赖传递详解

    千次阅读 2018-11-08 18:38:36
    Maven 依赖范围和依赖传递详解 18.10.8 松江图书馆 ...Maven 依赖范围和依赖传递详解 ...maven pom中配置 exclusion标签 手动去除依赖 dependencyManagement和dependencise的区别 ...
  • -P 使用pom中指定的配置 -e 显示maven运行出错的信息 -o 离线执行命令,即不去远程仓库更新包 -X 显示maven允许的debug信息 -U 强制去远程参考更新snapshot包 例如 mvn install -Dmaven.test.skip=true -Poracle 其他...
  • Maven pom文件基本结构一

    千次阅读 2019-01-01 11:53:20
    POM文件结构 Project Object Model是Maven2项目的基础所在,简单来说它就是一个XML文件,Maven2用它来描述一个工程的整个生命周期所需要执行的一系列功能和特性。 最小配置 任何项目都最少要包含以下几个标签。 ...
  • 依赖 <groupId>,<artifactId>, <version>:描述了依赖的项目唯一标志。 <groupId> :创建项目的组织或团体的唯一 Id。 <artifactId>:项目唯一id,可视为项目名。 <version...
  • 造成版本冲突,进而程序出现问题,此时就需要确定这些以来到底是通过哪个jar被引入,而后通过配置exclude解决版本冲突问题,而定义的过程就需要依赖于查看maven依赖书,接下来我们就一起看下吧! 2:查看依赖树 ...
  • Maven pom.xml 文件详解

    2021-09-11 00:58:57
    它是 Maven 项目的 XML 表示形式,保存在名为 pom.XML 的文件中。一个项目不仅仅是包含代码的文件集合,还包含配置文件,以及所涉及的开发人员和他们扮演的角色、缺陷跟踪系统、组织和许可证、项目所在地的 URL、...
  • mavenpom详解

    2020-10-14 20:00:47
    maven将项目抽象成一个模型,pom.xml为项目模型对象的描述文件。 此文件中的一些设置项如下: 一、maven模型版本,4.0.0基本稳定 <modelVersion>4.0.0</modelVersion> 二、项目信息,也称作坐标 ...
  • 1)在 Maven 项目的 pom.xml 中配置所需要构件的坐标,也就是配置依赖。还有就是 Maven 在构建项目的时候,根据坐标从仓库中找到坐标所对应的构件文件,并且把它们引入 Maven 项目中来,也就是 Maven 引用。 2)由 ...
  • idea maven pom不自动更新

    万次阅读 热门讨论 2017-06-29 21:02:22
    今天遇到pom中添加dependency时相关的jar会自动下载,但是左边的External Libraries中一直获取不到添加的jar问题。...这里的reimport主要是针对maven没有使pom的引用自动更新而执行的手动更新功能,这点比
  • maven pom文件详解

    千次阅读 2018-06-13 17:23:43
    http://www.blogjava.net/hellxoul/archive/2013/05/16/399345.html...前言Maven,发音是[`meivin],"专家"的意思。它是一个很好的项目管理工具,很早就进入了我的必备工具行列,但是这次为了把project1项...
  • 官方关于pom文件的说明 下面是在中的可直接使用的标签表 对于各标签的解释和使用,文档下面有官方的详细说明,最后结合实际项目中的pom文件学习
  • Maven 依赖管理

    2020-12-19 07:41:44
    Maven 依赖管理Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。可...
  • Linux安装MavenPOM及配置文件详解

    千次阅读 2020-06-02 12:10:21
    下载Maven 下载地址 https://maven.apache.org/download.cgi 下载maven安装包 [root@oahzero]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz ...
  • Maven中的pom.xml文件超详细解析

    千次阅读 多人点赞 2021-12-09 09:20:42
    我们在平时的开发中都会或多或少的使用maven来管理和构建我们的项目,即使使用了各种框架jar包也是通过Maven来引入的,所以我觉得有必要了解pom.xml文件中的每一项配置,来帮助我更好的使用Maven这个自动化工具;
  • maven pom详解

    2019-01-06 10:15:44
    一、POM含义 二、POM中的元素 (1)project下的子元素 &lt;?xml version="...http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" ...
  • #idea使用Maven工具pom文件报红解决方案 很多初次使用maven的小伙伴都会碰到pom文件报红的现象,你是不是对此很苦恼,试了很多方案都无法解决,此次为大家提供一个比较完整的解决步骤,让你更快的熟悉maven的操作。 ...
  • idea maven pom不自动更新的解决方法

    千次阅读 2021-02-12 06:14:52
    今天遇到pom中添加dependency时相关的jar会自动下载,但是左边的External Libraries中一直获取不到添加的jar问题。...这里的reimport主要是针对maven没有使pom的引用自动更新而执行的手动更新功能,这点比较...
  • 摘要:本文主要讲解是Maven使用过程中一些常用的命令,并配上图片说明,最后还讲了pom.xml文件的一些构造。 一、Maven常用命令 1.1、Maven 参数 -D 传入属性参数  -P 使用pom中指定的配置  -e 显示maven...
  • Maven依赖详细理解

    千次阅读 2019-06-08 15:26:38
    Maven依赖理解1 简介2 依赖的配置3 依赖的范围4 传递性依赖4.1 传递性依赖依赖调解5 依赖调解6 可选依赖7 总结 1 简介  在Maven项目中,有一个核心文件pom.xml。POM项目对象模型定义了项目的基本信息,用于描述心...
  • Maven--Maven Pom文件模型

    2020-05-01 10:05:55
    POM 模型     1 依赖关系       Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,...
  • maven-pom.xml标签详解

    千次阅读 2018-08-21 10:03:09
    这里详细讲解一下mavenpom文件 其中modelVersion包含4.0.0。这是目前唯一支持Maven 2和3的POM版本,并且始终是必需的。 pom标签列表 &amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;project xmlns = ...
  • POM 模型1.依赖关系1.依赖的传递性2.依赖相同资源的依赖原则3.排除依赖4.依赖范围5.依赖管理2.继承关系3.Maven 中的多继承4.聚合关系1.删除聚合模块步骤 1.依赖关系 Maven 一个核心的特性就是依赖管理。当我们处理...
  • 详解:Maven项目和其pom.xml文件

    千次阅读 2019-02-16 11:25:39
    本文旨在对Maven项目及其pom.xml文件进行详解。 这段时间一直接触Maven项目,对Maven以及其中的pom.xml文件中很多概念都不太明白,故在此研究、记录如下。
  • 2.4maven对传递性依赖的处理 2.5Maven依赖jar包冲突解决 2.6Maven中jar,pom,war的区别 2.7插件和依赖的区别 1.以Spring-Boot的pom.xml为例 &amp;amp;amp;lt;?xml version=&amp;amp;quot;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,835
精华内容 5,934
关键字:

mavenpom标记依赖