zoukankan      html  css  js  c++  java
  • Maven使用基础

    (转)https://my.oschina.net/xiaomaoandhong/blog/104045

    基于 约定优于配置(Convention Over Configuration)的原则,无特殊需求,请遵守Maven以下约定:

    Maven约定

    目录src/main/java java源码目录
    目录src/main/resources 资源文件目录
    目录src/test/java 测试java源码目录
    目录src/test/resources 测试资源文件目录
    目录target 打包输出目录
    目录target/classes 编译输出目录
    目录target/test-classes 测试编译输出目录
    目录target/site 项目site输出目录
    目录src/main/webapp web应用文件目录(当打包为war时),如WEB-INF/web.xml
    jar 默认打包格式
    *Test.java Maven只会自动运行符合该命名规则的测试类
    %user_home%/.m2 Maven默认的本地仓库目录位置
    中央仓库 Maven默认使用远程中央仓库:http://repo1.maven.org/maven2
    1.3 Maven Compiler插件默认以1.3编译,因此需要额外配置支持1.5

    其上所有的约定都可以在Maven的超级POM(super pom)中找到。由于所有的POM都继承了这个超级POM,因此它的默认配置就被继承了 。Maven3中这个超级POM位于libmaven-model-builder-3.0.4.jarorgapachemavenmodel下

    一:编写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/xsd/maven-4.0.0.xsd"> 
    
      <modelVersion>4.0.0</modelVersion> 
      <groupId>com.mycompany.app</groupId> 
      <artifactId>my-app</artifactId> 
      <version>1.0-SNAPSHOT</version> 
      <packaging>jar</packaging> 
    
      <name>my-app</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>4.7</version> 
          <scope>test</scope> 
        </dependency> 
      </dependencies> 
    </project>


    1:project是所有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"> 


    它还声明了一些POM相关的命名空间及xsd元素,虽然这些属性不是必须的,但使用这些属性能够让第三方工具(如IDE中的XML编辑器)帮助我们快速编辑POM。

    <modelVersion>4.0.0</modelVersion> 

    根元素下的第一个子元素modelVersion指定了当前POM模型的版本,对于Maven2及Maven 3来说,它只能是4.0.0。

    3:groupId,artifactId和version三行
    pom.xml中最重要的是groupId,artifactId和version三行。这三个元素定义了一个项目基本的坐标,在Maven的世界,任何的jar、pom或者war都是以基于这些基本的坐标进行区分的。

    3.1:groupId
    定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联,譬如你的公司是mycom,有一个项目为myapp,那么groupId就应该是com.mycom.myapp。

    3.2:artifactId
    定义了当前Maven项目在组中唯一的ID,在前面的groupId为com.mycompany.app的例子中,你可能会为不同的子项目(模 块)分配artifactId,如:myapp-util、myapp-domain、myapp-web等等。本例中artifactId 为 my-app

    3.3:version
    顾名思义,version指定了项目当前的版本。

    引用
    <version>1.0-SNAPSHOT</version>

    SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如升级为1.1- SNAPSHOT、1.0、1.1、2.0等等。本书的6.5小节会详细介绍SNAPSHOT,第13章介绍如何使用Maven管理项目版本的升级发布。

    4:name元素
    声明了一个对于用户更为友好的项目名称,虽然这不是必须的,但我还是推荐为每个POM声明name,以方便信息交流。 

    下面不借助于IDE环境的支持,完全以手动配置的方式来说一下Maven的一个入门的小示例

    1、创建HelloMaven项目
    首先创建一个名为HelloMaven项目的文件夹,在该项目的根目录下建立一个pom.xml文件,该文件是Maven项目的核心, 就像Make的Makefile,Ant的build.xml一样 。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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指定当前pom模型的版本,
          对于Maven2及Maven3来说,它只能是4.0.0
      -->
      <modelVersion>4.0.0</modelVersion>
      <!--
          groupId,artifactId和version这三个元素定义了一个项目基本的坐标,
          在Maven的世界,任何的jar、pom或者war都是以基于这些基本的坐标进行区分
      -->
      <!--
        groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联
      -->
      <groupId>org.apache.maven</groupId>
      <!--
        artifactId定义了当前Maven项目在组中唯一的ID
      -->
      <artifactId>hellomaven</artifactId>
      <!--
        项目当前版本,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本
      -->
      <version>1.0-SNAPSHOT</version>
    
      <name>HelloMaven Project</name>
    </project>

    2、编写项目的主代码HelloMaven.java
    基于Maven的约定,我们在HelloMaven目录下创建 srcmainjavaHelloMaven.java,Maven会自动搜索该srcmainjava目录找到HelloMaven.java

    package org.apache.maven.hellomaven;
    /**
     *一般来说,项目中Java类的包都应该基于项目的groupId和artifactId
     */
    public class HelloMaven {
        public String sayHello() {
            return "Hello Maven";
        }
    
        public static void main(String[] args) {
            System.out.println(new HelloMaven().sayHello());
        }
    }

    3、编译
    新开一个cmd窗口,在项目根目录下使用Maven命令 mvn clean compile编译该源文件HelloMaven.java,clean告诉Maven清理输出目录target/,compile告诉Maven编译项目主代码


    编译成功之后这时我们发现根目录下除了src和pom.xml,还多了个target目录, 默认情况下Maven构建的所有输出都在target目录中 ,项目的主代码位于target/classes。


    查看target目录


    4、测试
    遵照上面Maven的约定,测试代码目录是src/test/java。因此,在编写测试用例之前,我们先创建该目录。

    在HelloMavensrc estjava下编写测试类HelloMavenTest.java

    package org.apache.maven.hellomaven;
    import static org.junit.Assert.assertEquals;
    import org.junit.Test;
    
    public class HelloMavenTest    
    {    
        @Test
        public void testSayHello()     
        {    
            HelloMaven hellomaven = new HelloMaven();    
            String result = hellomaven.sayHello();    
            assertEquals("Hello Maven", result );     
        }    
    }

    JUnit是事实上的单元测试标准。要使用JUnit,我们首先需要为HelloMaven项目添加一个JUnit依赖,修改项目的POM文件,添加junit依赖

    <dependencies>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.7</version>
              <!--
                依赖范围为test 则表示该依赖只对测试有效
              -->
              <scope>test</scope>
          </dependency>
      </dependencies>

    前面说到groupId、artifactId和version是任何一个Maven项目最基本的坐标,JUnit也不例外,有了这段声明,Maven就能够自动从其中央仓库下载junit-4.7.jar到本地仓库。

    调用Maven执行测试,运行 mvn clean test  


    测试代码通过编译之后在target/test-classes下生成了二进制文件,紧接着surefire:test 任务运行测试,surefire 是Maven世界中负责执行测试的插件,这里它运行测试用例HelloMavenTest,并且输出测试报告,显示一共运行了多少测试,失败了多少,出错 了多少,跳过了多少。

    5、打包
    HelloMaven的POM中没有指定打包类型,使用 默认打包类型jar,简单地执行命令 mvn clean package进行打包


    类似地,Maven会在打包之前执行编译、测试等操作。该jar文件hellomaven-1.0-SNAPSHOT.jar同样位于target输出目录中

    我们可以复制这个jar到其它项目的classpath路径下从而使用HelloMaven类,但是要 让其他的Maven项目直接引用这个jar,还需要一个安装的步骤:mvn clean install,将这个jar文件安装到本地仓库中,就如前面的junit一样,只有被下载到本地仓库之后才能被其它Maven项目所引用。



    已经接触了如下的Maven命令:
    mvn clean compile、mvn clean test、mvn clean package、mvn clean install
    执行test 之前是会先执行compile的,执行package之前是会先执行test 的,而类似地,install 之前会执
    行package。

    6、运行
    默认打包生成的jar是不能够直接运行的,如:

    因为带有main方法的类信息不会添加到manifest中
    (
    我们可以打开jar文件中的 META-INF/MANIFEST.MF 文件,将无法看到Main-Class一行

    如:

    Manifest-Version: 1.0
    Archiver-Version: Plexus Archiver
    Created-By: Apache Maven
    Built-By: yanghong.zhou
    Build-Jdk: 1.6.0_10-rc2

    为了生成可执行的jar 文件,我们需要借助maven-shade-plugin,配置该插件如下:

    <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>
                          org.apache.maven.hellomaven.HelloMaven
                        </mainClass>    
                      </transformer>    
                    </transformers>    
                  </configuration>    
                </execution>    
            </executions>    
          </plugin> 
        </plugins>
      </build>

    现在执行 mvn clean package:
    待构建完成之后打 开target/目录 ,我们可以看到
    hellomaven-1.0-SNAPSHOT.jar 和original-hellomaven-1.0-SNAPSHOT.jar,前者是带有Main-Class信息的可运行jar,后者是原始的jar,打开 hellomaven-1.0-SNAPSHOT.jar 的META-INF/MANIFEST.MF,可以看到它包含这样一行信息: Main-Class: org.apache.maven.hellomaven.HelloMaven


    run:

    附录:

    Dependency Scope

    在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:

    • compile,缺省值,适用于所有阶段,会随着项目一起发布。
    • provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
    • runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
    • test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
    • system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。 

    如下代码:

    <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>4.0.0</modelVersion>
      <groupId>com.sitinspring</groupId>
      <artifactId>Maevn3ndPart</artifactId>
      <packaging>jar</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>Maevn3ndPart</name>
      <url>http://maven.apache.org</url>
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>jdom</groupId>
          <artifactId>jdom</artifactId>
          <version>1.0</version>
          <scope>compile</scope>
        </dependency>
      </dependencies>
    </project>
  • 相关阅读:
    【树】树的前序遍历(非递归)
    表单提交中的input、button、submit的区别
    利用setTimeout来实现setInterval
    Jquery动画操作的stop()函数
    Javascript实现简单的双向绑定
    Javascript观察者模式
    CSS reset
    【CSS3】background-origin和background-clip的区别
    :before和::before的区别
    JS实现瀑布流
  • 原文地址:https://www.cnblogs.com/dayiran1222/p/5902705.html
Copyright © 2011-2022 走看看