maven根本命令

maven基本命令
均在含pom.xml文件的路径下运行

maven命令运行是按阶段运行的,如运行mvn package,则实际上已经运行了如下命令:
maven根本命令
如果想运行到test停止,运行mvn test

maven项目类型:
jar:java项目
war:web项目

maven依赖
Maven 下载依赖不只是下载 JAR 文件,它同时为这个依赖下载一个 POM 文件
在 Maven 中一个依赖不仅仅是一个 JAR。它是一个 POM 文件,这个 POM 可能也声明了对其它构件的依赖。这些依赖的依赖叫做传递性依赖。 

1. 创建Maven的普通java项目

  • mvn archetype:generate -DgroupId=packageName  -DartifactId=projectName   -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

2. 创建Maven的Web项目 
  • mvn archetype:generate -DgroupId=packageName  -DartifactId=webappName -DarchetypeArtifactId=maven-archetype-webapp 

    -DinteractiveMode=false

3. 打jar包在本地Repository中安装jar
  • mvn install 
4. 只打jar包
  • mvn jar:jar  
5. 测试程序
  • java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
6. 查看有效的POM它暴露了 Maven的默认设置
  • mvn help:effective-pom 
7. 生成项目相关信息的报告(target/site目录下)
  • mvn site                   
8. 忽略测试失败
        maven根本命令
9. 打包时跳过测试
  • mvn install -Dmaven.test.skip=true
        maven根本命令
  maven根本命令
        
10. 安装指定文件到本地仓库
  • mvn install:install-file -DgroupId=<groupId> -DartifactId=<artifactId> -Dversion=1.0.0 -Dpackaging=jar -Dfile=<myfile.jar>
11. 将项目转化为Eclipse项目
  • mvn eclipse:eclipse                
12. 分析项目的依赖信息
  • mvn dependency:analyze 
  • mvn dependency:tree 打印整个依赖树
  • mvn dependency:resolve 打印出已解决依赖的列表
13. 查看帮助信息
  • mvn help:help 
  • mvn help:help -Ddetail=true
14. 调试
  • mvn -e            显示详细错误 信息  
  • mvn generate-sources    产生应用需要的任何额外的源代码,如xdoclet。
  • mvn install -X 想要查看完整的依赖踪迹,包含那些因为冲突或者其它原因而被拒绝引入的构件,打开 Maven 的调试标记运行

15. 清除产生的项目
  • mvn clean 

    (删除target目录下编译内容)


16. 在应用程序用使用多个存储库
<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>

17. Maven项目编译步骤
  1. 第一、main目录下的主代码编写完毕后,使用Maven进行编译,在项目根目录下运行命令mvn clean compile进行项目编译。
  2. 第二、test目录下的测试用例编写完毕之后就可以调用Maven执行测试,运行mvn clean test进行测试。
  3. 第三、将项目进行编译、测试之后,下一个重要步骤就是打包(package)。在pom.xml中定义<packaging>war</packaging>标签表示将要把工程打成什么类型的包(默认是jar类型),我们可以简单地执行命令mvn clean package进行打包。
  4. 第四、至此,我们得到了项目的输出,如果我们把项目打成了jar文件并且需要在其他项目中使用的话,就可以复制这个jar文件到其他项目的Classpath中从而使用这个项目中的类。但是,如何才能让其他的Maven项目直接引用这个jar呢?我们还需要一个安装的步骤,执行mvn clean install命令。
  5. 第五、如果项目中有一个拥有main方法的类需要被调用执行。默认打包生成的jar是不能够直接运行的main方法的,因为带有main方法的类信息不会添加到manifest中(我们可以打开jar文件中的META-INF/MANIFEST.MF 文件,将无法看到Main-Class一行)。为了生成可执行的jar文件,我们需要借助maven-shade-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.ManifestResourceTransformer">
              <mainClass>com.todaytech.framework.utils.VoConvertXmlUtils</mainClass>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
   </plugin>
  
   plugin元素在POM中的相对位置应该在<project><build><plugins>下面。我们配置了mainClass com.todaytech.framework.utils.VoConvertXmlUtils ,项目在打包时会将该信息放到MANIFEST中。现在执行 mvn clean install,待构建完成之后打开target/目录,我们可以看到S3h3WebWs-0.0.1-SNAPSHOT.jar和original-S3h3WebWs-0.0.1-SNAPSHOT.jar,前者是带有Main-Class信息的可运行jar,后者是原始的jar,打开hello-world-1.0-SNAPSHOT.jar的META-INF/MANIFEST.MF,可以看到它包含这样一行信息:Main-Class: com.todaytech.framework.utils.VoConvertXmlUtils。现在,我们在项目根目录中执行该jar文件:
   D: \code\S3h3WebWs>java -jar target\S3h3WebWs-0.0.1-SNAPSHOT.jar
   Hello Maven
   控制台输出为Hello Maven,这正是我们所期望的。

在pom.xml文件中增加servlet容器的插件:

<build>
 <plugins>
  <plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>tomcat-maven-plugin</artifactId>
  </plugin>
  <plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <version>6.1.6</version>
  </plugin>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
   <configuration>
   <source>1.6</source>
   <target>1.6</target>
   <encoding>UTF-8</encoding>
   </configuration>
  </plugin>
 </plugins>
</build>

 
启动tomcat:
mvn tomcat:run
 
启动jetty:
mvn jetty:run

POM间关系
  • 依赖关系(dependencies)

依赖关系举例: 

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate</artifactId>
   <version>3.2.6.ga</version>
 </dependency>

  • 继承关系(parent)

继承关系举例:

继承其他pom.xml配置的内容。

maven提供了一个类似java.lang.Object的顶级父pom.xml文件。

可以通过下面命令查看当前pom.xml受到超pom.xml文件的影响:mvn help:effective-pom。

创建一个各种项目可复用的pom.xml文件。

部署要复用的pom.xml文件:mvn install。

在自己的pom文件中继承上述pom

 <parent>
   <groupId>com.easymorse</groupId>
   <artifactId>pom</artifactId>
   <version>0.1</version>
</parent>

  • 聚合关系(modules)

聚合关系举例:

用于将多个maven项目聚合为一个大的项目。 比如目录结构如下:

 . |-- pom.xml |-- module-a `-- pom.xml |-- module-b `-- pom.xml |-- module-c `-- pom.xml |-- foo-all `-- pom.xml

那么总的pom.xml文件类似:
 ... <modules>
      <module>module-a</module>
      <module>module-b</module>
      <module>module-c</module>
      <module>foo-all</module>
    </modules>

把项目部署到tomcat下的做法:

tomcat配置有管理权限的用户:conf\tomcat-users.xml。  
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="manager"/>
  <user username="marshal" password="password" roles="manager"/>
</tomcat-users>
在pom文件的tomcat插件中添加:
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>tomcat-maven-plugin</artifactId>
    <configuration>
        <url>http://localhost:8080/manager</url>
        <server>myserver</server>
        <path>/mycontext</path>
    </configuration>
</plugin>
在.m2/settings.xml文件中增加:
<settings 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/settings-1.0.0.xsd">
        <servers>
            <server>
                <id>myserver</id>
                <username>marshal</username>
                <password>password</password>
            </server>
        </servers>
</settings>

  • 运行打包部署,在maven项目目录下:  mvn tomcat:deploy
  • 撤销部署:  mvn tomcat:undeploy
  • 启动web应用:mvn tomcat:start
  • 停止web应用:mvn tomcat:stop
  • 重新部署:mvn tomcat:redeploy
  • 部署展开的war文件:  mvn war:exploded tomcat:exploded

Pom文件解释

pom是指project object Model。

pom是一个xml,在maven2里为pom.xml。是maven工作的基础,在执行task或者goal时,maven会去项目根目录下读取pom.xml获得需要的配置信息。pom文件中包含了项目的信息和maven build项目所需的配置信息,通常有项目信息(如版本、成员)、项目的依赖、插件和goal、build选项等等。pom是可以继承的,通常对于一个大型的项目或是多个module的情况,子模块的pom需要指定父模块的pom。

Project pom文件的顶级元素
modelVersion 所使用的object model版本,为了确保稳定的使用,这个元素是强制性的。除非maven开发者升级模板,否则不需要修改。 
groupId 是项目创建团体或组织的唯一标志符,通常是域名倒写,如groupId  org.apache.maven.plugins就是为所有maven插件预留的。 
artifactId 是项目artifact唯一的基地址名。
packaging artifact打包的方式,如jar、war、ear等等。默认为jar。这个不仅表示项目最终产生何种后缀的文件,也表示build过程使用什么样的lifecycle。
version artifact的版本,通常能看见为类似0.0.1-SNAPSHOT,其中SNAPSHOT表示项目开发中,为开发版本。
name 表示项目的展现名,在maven生成的文档中使用。
url表示项目的地址,在maven生成的文档中使用。
description 表示项目的描述,在maven生成的文档中使用。
dependencies 表示依赖,在子节点dependencies中添加具体依赖的groupId artifactId和version。
build 表示build配置。
parent 表示父pom。
其中groupId:artifactId:version唯一确定了一个artifact。

Artifact构件(jar、war、pom)

这个有点不好解释,大致说就是一个项目将要产生的文件,可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId:artifactId:version组成的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中。

Repositories(仓库)

Repositories是用来存储Artifact的。如果说我们的项目产生的Artifact是一个个小工具,那么Repositories就是一个仓库,里面有我们自己创建的工具,也可以储存别人造的工具,我们在项目中需要使用某种工具时,在pom中声明dependency,编译代码时就会根据dependency去下载工具(Artifact),供自己使用。
对于自己的项目完成后可以通过mvn install命令将项目放到仓库(Repositories)中
仓库分为本地仓库和远程仓库,远程仓库是指远程服务器上用于存储Artifact的仓库,本地仓库是指本机存储Artifact的仓库,对于windows机器本地仓库地址为系统用户的.m2/repository下面。

Build Lifecycle(编译过程、生命周期)

是指一个项目build的过程。maven的Build Lifecycle分为三种,分别为default(处理项目的部署)、clean(处理项目的清理)、site(处理项目的文档生成)。他们都包含不同的lifecycle。
Build Lifecycle是由phases构成的,下面重点介绍default Build Lifecycle几个重要的phase:

  • validate 验证项目是否正确以及必须的信息是否可用;

  • compile 编译源代码;

  • test 测试编译后的代码,即执行单元测试代码;

  • package 打包编译后的代码,在target目录下生成package文件;

  • integration-test 处理package以便需要时可以部署到集成测试环境;

  • verify 检验package是否有效并且达到质量标准;

  • install 安装package到本地仓库,方便本地其它项目使用;

  • deploy 部署,拷贝最终的package到远程仓库和替他开发这或项目共享,在集成或发布环境完成。

以上的phase是有序的(注意实际两个相邻phase之间还有其他phase被省略,完整phase见lifecycle),下面一个phase的执行必须在上一个phase完成后