maven

Maven in 5 Minutes  Maven实战 Maven中央仓库 maven概念  pom元素描述

1.下载安装maven,解压缩后,设置环境变量M2_HOME到maven目录;在path中增加maven的bin目录。

   命令行输入mvn -version验证是否安装成功
   linux下安装时先检查以前是否有过IDE内嵌安装,whereis mvn
   若存在mvn: /usr/bin/mvn /opt/apache-maven-3.0.4/bin/mvn /usr/share/man/man1/mvn.1.gz则重新创建链接到/usr/bin下:
    ln -s /opt/apache-maven-3.0.4/bin/mvn /usr/bin/mvn
   #MAVEN
     export M2_HOME=/opt/apache-maven-3.0.4
     export M2=$M2_HOME/bin
     export MAVEN_OPTS="-Xms256m -Xmx512m"
     export PATH=$M2:$PATH
   复制 M2_HOME/conf/settings.xml 文件到~/.m2/settings.xml

2.网络设置
    maven运行时需要网络环境。如果需要网络代理,则在maven安装目录下conf/settings.xml中找到<proxies>节点进行设置

3.在命令行中输入你要创建的工程:
    mvn archetype:create -DgroupId=com.cms -DartifactId=cms
    若运行成功则生成:
    cms
     ├─pom.xml
     ├─src
     └─main
      └─java
       └─com
        └─cms
         └─App.java
     └─test
      └─java
       └─com
        └─cms
         └─AppTest.java
 mvn package默认打包生成的 jar 是不能够直接运行的,因为带有 main 方法的类信息不会添加到 manifest中,生成可执行的 jar 文件,我们需要借助 maven-shade-plugin,配置该插件如下:     

<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.cms</groupId>
  <artifactId>cms</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>cms</name>
  <url>http://maven.apache.org</url>

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

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
   <plugins>
    <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.ManifestResourceTransformer">
                    <mainClass>com.cms.App</mainClass>
                    </transformer>
                </transformers>
            </configuration>
            </execution>
        </executions>
    </plugin>
   </plugins>
  </build>
</project>

     再执行mvn package可看到cms-1.0-SNAPSHOT.jar、original-cms-1.0-SNAPSHOT.jar,前 者 是 带 有Main-Class 信息的可运行 jar,后者是原始的 jar
     执行java -jar target\cms-1.0-SNAPSHOT.jar

4.maven坐标包括groupId、artifactId、version、packaging、classifier
   maven:"groupId=org.testng;artifactId=testng;version=5.8;classifier=jdk15"
   groupId:隶属的实际项目名与包名类似
   artifactId:实际项目中的一个模块名即实际项目名
   version:项目的版本
   packaging[可选]:项目打包方式,默认jar
   classifier[可选]:帮助定义构建输出的一些附属构件,附属构件与主构件对应,不能直接定义项目的classifier因为附属构件不是项目直接默认生成的而是由附加的插件帮助生成

5.基于spring framework的account-email实例的pom :
   mvn archetype:create -DgroupId=com.cms.account -DartifactId=account-email

<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.cms.account</groupId>
  <artifactId>account-email</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>Account Email</name>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>              #以下为spring依赖注入必要库
      <artifactId>spring-core</artifactId>
      <version>2.5.6</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>2.5.6</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>2.5.6</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-support</artifactId>
      <version>2.5.6</version>
    </dependency>
    <dependency>
      <groupId>javax.mail</groupId>                        #邮件实现支持库
      <artifactId>mail</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.icegreen</groupId>                      #开源邮件服务测试套件
      <artifactId>greenmail</artifactId>
      <version>1.3.1b</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
   <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>           #开启java5支持
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>
    </plugin>
   </plugins>
  </build>
</project>

6.maven命令:
    命令行输入mvn -h ,显示mvn帮助,其中usage: mvn [options] [<goal(s)>] [<phase(s)>]表明了mvn命令的结构。options:可选的参数,goal(s): 表示maven构建的“目标”,Phase(s):阶段-表示maven构建生命周期

7.maven会执行生命周期中该阶段之前的所有命令:

  • validate: 验证项目是否正确以及相关信息是否可用
  • compile: 编译
  • test: 通过junit进行单元测试
  • package: 根据事先指定的格式(比如jar),进行打包
  • integration-test: 部署到运行环境中,准备进行集成测试
  • verify: 对包进行有效性性和质量检查
  • install: 安装到本地代码库
  • deploy: 在集成或发布环境,将包发布到远程代码库

    在“默认”的生命周期之外,还有两个“阶段”:

  • clean: 清除以前的构建物。
  • site: 生成项目文档

8.pom.xml 文件基本节点介绍

 <project > :文件的根节点
 <modelversion > : pom.xml 使用的对象模型版本
 <groupId > :创建项目的组织或团体的唯一 Id
 <artifactId > :项目的唯一 Id, 可视为项目名
 <packaging > :打包物的扩展名,一般有 JAR,WAR,EAR 等 
 <version > :产品的版本号
 <name > :项目的显示名,常用于 Maven 生成的文档
 <url > :组织的站点,常用于 Maven 生成的文档
 <de.ion > :项目的描述,常用于 Maven 生成的文档

9.常用命令

    mvn archetype:create :创建 Maven 项目 
    mvn compile :编译源代码
    mvn test-compile :编译测试代码
    mvn test : 运行应用程序中的单元测试
    mvn site : 生成项目相关信息的网站
    mvn clean :清除目标目录中的生成结果
    mvn package : 依据项目生成 jar 文件
    mvn install :在本地 Repository 中安装 jar
    mvn eclipse:eclipse :生成 Eclipse 项目文件
    mvn -Dwtpversion=1.0 eclipse:eclipse : 生成Wtp插件的Web项目
    mvn -Dwtpversion=1.0 eclipse:clean : 清除Eclipse项目的配置信息(Web项目)
    mvn eclipse:clean : 清除eclipse的一些系统设置
    mvn idea:idea : 生成Intellij idea项目文件
    mvn jar:jar : 只打包jar
    mvn test -skipping compile -skipping test-compile : 只测试而不编译,也不测试编译
    mvn jetty:run : 运行项目于jetty上
    mvn -e : 显示详细错误信息
    建一个 JAVA 项目 : mvn archetype:create -DgroupId=com.demo -DartifactId=demo
    建一个 web 项目 : mvn archetype:create -DgroupId=com.demo -DartifactId=web-demo  -DarchetypeArtifactId=maven-archetype-webapp
    Eclipse WTP 项目执行 : mvn eclipse:eclipse –Dwtpversion=1.0 ( wtp1.0 以上版本均可用)

    一般使用情况是这样,首先通过cvs或svn下载代码到本机,然后执行mvn eclipse:eclipse生成ecllipse项目文件,然后导入到eclipse就行了;修改代码后执行mvn compile或mvn test检验,也可以下载eclipse的maven插件。更改Maven缺省的本地仓库地址:修改${user.home}/.m2/settings.xml

    <settings>  
      ...   
      <localRepository>/opt/maven/repository</localRepository>  
      ...   
    </settings>  

10.依赖范围

compile默认范围-编译、测试、运行三种classpath都有效,如spring-core
test只对测试classpath有效,如Junit
provided对编译、测试classpath有效,如servlet-api
runtime对测试、运行classpath有效,如JDBC驱动
system对编译、测试classpath有效,使用本地库(maven仓库之外的类库文件)与本机系统绑定,可能造成不可移植,可引用环境变量
import不会对编译、测试、运行三种classpath产生影响

11.依赖传递性

  compile test provided runtime
compile √  - -
test
provided - - -
runtime - -

路径最近者优先

A->B->C->X(1.0) A->D->X(2.0) 使用X2.0
第一声名者优先
A->B->Y(1.0) A->C->Y(2.0) 使用Y1.0

12.可选依赖
A->B、B->X(可选)、B->Y(可选) X、Y不会对A有任何影响
例如B是一个持久层隔离工具包,支持MongoDB、postgresql,在构建这个工具包时,需要这两种数据库驱动,但在使用这个工具包时只会依赖其中一种
<project...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cms.b</groupId>
<artifactId>project-b</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>casbah_2.9.2</artifactId>
<version>2.4.1</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>

<project...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cms.account</groupId>
<artifactId>project-a</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.cms.b</groupId>
<artifactId>project-b</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
</dependencies>
</project>

13.最佳实践
传递依赖会给项目隐式的引入很多依赖,这简化了项目依赖的管理,但有时会带来问题,如项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,而SNAPSHOT的不稳定性会直接影响当前的项目,这时就需要排除该SNAPSHOT
排除传递性依赖:
A->B,由于一些原因B不想引入传递性依赖C而是自身显式地声名对项目C1.1.0的依赖
<project...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cms.account</groupId>
<artifactId>project-a</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.cms.b</groupId>
<artifactId>project-b</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions> #排除依赖
<exclusion>#不需要version元素
<groupId>com.cms.c</groupId>
<artifactId>project-c</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.cms.c</groupId>
<artifactId>project-c</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</project>

14.归类依赖

    #env.X:引用环境变量${env.PATH}
    #project.x:.表示路径将包含相应的元素的值。例如:<project><version>1.0</version></project>可以通过${project.version}访问
    #settings.x:.表示路径将包含相应的元素的值。例如:<settings><offline>false</offline></settings>可以通过${settings.offline}访问
    #Java System Properties:可通过java.lang.System.getProperties()访问的所有属性都都可用作POM属性,如${java.home}
#pom中<properties/>下的<someVar>元素可直接${someVar}引用

<project...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cms.account</groupId>
<artifactId>account-email</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-support</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
</project>

15.优化依赖
已解析依赖列表mvn dependency:list
已解析依赖树mvn dependency:tree
已解析依赖分析(只会分析编译和测试需要的依赖)mvn dependency:analyze

posted @ 2012-11-27 17:03  WenEric  阅读(496)  评论(0编辑  收藏  举报