zoukankan      html  css  js  c++  java
  • maven学习手记

    学习目标


    1. windows下安装maven环境;
    2. 使用命令创建maven项目结构;
    3. maven项目编译测试打包安装运行;
    4. 在maven项目中使用插件。

    在windows下安装maven环境


    在windows下安装maven环境的步骤如下:

    1. 下载maven,

    下载地址:http://maven.apache.org/download.cgi

    下载“apache-maven-3.2.1-bin.zip

    2. 配置环境变量JAVA_HOME,指向JDK安装路径;

    3. 将maven的bin包路径添加到环境变量PATH中;

    4. 在命令行窗口输入mvn -v查看maven版本号,完成安装测试;

    5. maven运行环境设置完成。

    此外还有必要调整默认依赖库位置,添加下载代理和新增依赖库下载镜像地址。这些需要调整setting.xml文件,可以参考这篇文章:《调整maven配置文件》。

    使用命令创建maven项目


    打开命令行窗口, 进入项目创建位置。

    在命令行窗口输入mvn archetype:generate第一次运行要下载比较多的依赖包(maven指令的运行需要使用大量的依赖包。maven需要依赖包时会首先在本地依赖库中查找,如果在本地找不到,就会在远程依赖库中查找并下载需要的依赖包到本地库中),所以执行的时间会长一点。一段时间后,命令行窗口出现如下提示:

    image

    这里提示设置archetype,即给所要创建的java项目选择一个通用的原型。maven提供了1039个项目原型。这里选择默认的398。

    输入398,点回车键(有默认值可以直接点回车键,视为选择默认值),会有如下提示:

    image

    这里提示选择项目原型版本。1~4为测试版本,默认选择6。按回车键,选择默认版本号1.1。之后提示输入groupId

    image

    groupId是项目组织的标识符,一般默认为项目的java包名称(仅是一般的做法,并没有严格限制)。这里输入“net.ibuluo.mvntest”,而后提示输入artifactId,

    image

    artifactId是项目的标识符,一般使用项目的名称。输入“mvntest”,会提示要求设置版本号:

    image

    默认版本号为“1.0-SNAPSHOT”,按回车键直接使用默认版本号即可。之后有要求设置包名称:

    包名称一般可以使用和groupId相同的包名称。这里maven提供的包名称的默认值即是之前设置的groupId。按回车键选择默认的包名称。

    接下来会要求确认项目信息,确认无误输Y,按回车键;需要重新设置输N,重新从groupId开始设置项目信息。

    确认后输入Y后,maven开始创建项目结构,并在命令行窗口输入以下信息:

    image

    至此,项目结构已创建完成。

    看一下完成后的项目结构:

    image

    在项目的根目录下,maven创建了pom.xml文件。此外,在src包下还创建了两个目录main和test,分别对应项目目录和测试目录。在main和test下还有两个类App和AppTest。

    先看一下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>net.ibuluo.mvntest</groupId>
      <artifactId>mvntest</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>mvntest</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>
    </project>

    pom.xml是maven项目的核心文件。POM定义了项目的基本信息,用以描述项目如何构建,声明项目依赖等。说明下pom中的元素。

    - project:pom文件中的顶层元素;

    - modelVersion:指明POM使用的对象模型的版本;

    groupId、artifactId和version之前已经说过了。这三个也是pom文件中最重要的部分。这三项属性是一个maven项目的唯一性标识(或者说是坐标)。

    - packaging: 指定项目打包类型

    - name:项目的名称,不是很重要,只是给项目一个比较友好的名称,通常用于maven产生的文档中。

    - url:指定项目站点,通常用于maven产生的文档中。

    - properties:属性标签,通过properties标签可以在pom.xml文件中定义一系列的变量,如上,就是定义了一个值为“UTF-8”的变量${project.build.sourceEncoding},在pom.xml中可以直接使用这个变量。这里目前没有用到,不过在需要多次引用同一个值的时候,properties标签的作用就凸显出来了。

    - dependencies:在这个标签下可以设置多个dependency来声明一系列的依赖。

    - dependency:项目的依赖。之前已经说过,groupId,artifactId和verison是一个项目的唯一标识,在这里就确定了版本为3.8.1的JUnit。通过这段设置,告诉了maven去获取相应的junit-3.8.1.jar文件。

    - scope:依赖范围,即依赖库的作用域。在这里指定为test,即只在测试包下生效。在项目目录下引用就会报错。如不声明依赖范围,那么scope默认compile,即对项目主代码和测试代码都有效。

    再看一下main目录下给出的项目文件实例App.java:

    package net.ibuluo.mvntest;
    
    /**
     * Hello world!
     *
     */
    public class App 
    {
        public static void main( String[] args )
        {
            System.out.println( "Hello World!" );
        }
    }

    很简单的一段hello world程序。

    再看下test目录下给出的测试文件实例AppTest.java:

    package net.ibuluo.mvntest;
    
    import junit.framework.Test;
    import junit.framework.TestCase;
    import junit.framework.TestSuite;
    
    /**
     * Unit test for simple App.
     */
    public class AppTest 
        extends TestCase
    {
        /**
         * Create the test case
         *
         * @param testName name of the test case
         */
        public AppTest( String testName )
        {
            super( testName );
        }
    
        /**
         * @return the suite of tests being tested
         */
        public static Test suite()
        {
            return new TestSuite( AppTest.class );
        }
    
        /**
         * Rigourous Test :-)
         */
        public void testApp()
        {
            assertTrue( true );
        }
    }

    maven项目的编译测试打包安装和运行


    试运行下这个项目。分如下四个步骤:编译->测试->打包->安装->运行

    编译:打开命令行窗口,进入项目目录,输入mvn clean compile 执行编译;

    image

    完成编译后,在项目目录下生成了target目录,编译完成的文件就储存在这个目录下:

    image

    在刚才输入的命令中clean告诉maven清理target目录,compile告诉maven编译项目代码。

    测试:在命令行窗口中输入 mvn clean test 调用maven执行测试,maven执行了一段功能并下载了一串依赖包后输出如下信息:

    image

    可以看到测试成功了。

    再看看项目目录,在target包下又多了两个目录,surefire-reports和test-classes 。

    image

    surefire-reports存放的是测试报告,test-classes下存放的是编译后的测试文件。

    打包:在命令行窗口输入 mvn clean package,执行项目打包:

    image

    可以看到,在打包之前,maven再次执行了编译和测试操作。

    因为在pom文件中,我们设置打包类型为jar,所以这里生成了一个名为mvntest-1.0-SNAPSHOT.jar的文件。

    安装:在命令行窗口输入 mvn clean install ,执行安装任务:

    image

    从运行结果可以看出,执行安装命令的目的是将生成的jar 包安装到本地的依赖库中。这样其他的项目也可以使用这个项目中生成的类了。

    最后,执行以下这个项目。在命令行窗口输入java –jar target/mvntest-1.0-SNAPSHOT.JAR,回车键:

    image

    额,执行结果和我想的不一样。用压缩工具打开mvntest-1.0-SNAPSHOT.jar,查看下包中的META-INF/MANIFEST.MF文件:

    Manifest-Version: 1.0
    Built-By: robin
    Build-Jdk: 1.7.0_45
    Created-By: Apache Maven 3.2.1
    Archiver-Version: Plexus Archiver

    没有设置Main-Class属性,这样jar文件在运行时就无法找到带main方法的类。直接动手填上也是一个办法,而且在这个小的示例中很简单。

    不过这样不是治本的方法。我们需要maven生成一个可以直接执行的jar包。这时,我们需要使用插件。

    在maven项目中使用插件


    需要使用的插件为:maven-shade-plugin。

    maven-shade-plugin是一个打包插件。通过这个插件我们可以配置Main-Class的值,并在打包的时候将Main-Class的值写入META-INF/MANIFEST.MF中。  关于这个插件的更多信息请参考这里:http://maven.apache.org/plugins/maven-shade-plugin/usage.html

    调整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>net.ibuluo.mvntest</groupId>
      <artifactId>mvntest</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>mvntest</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>net.ibuluo.mvntest.App</mainClass>  
                     </transformer>  
                   </transformers>  
                 </configuration>  
                 </execution>  
            </executions>  
          </plugin>  
          </plugins>
      </build>
    </project>

    而后执行命令 mvn clean install ,在target目录下生成了两个jar包:mvntest-1.0-SNAPSHOT.jar 和 original-mvntest-1.0-SNAPSHOT.jar。

    image

    mvntest-1.0-SNAPSHOT.jar是带有Main-Class的可执行的jar文件,后者是原始的jar包。

    再次执行下:

    image

    执行成功,输出了”Hello World!“这个经典的招呼。

    关于这个插件的更多用法可以参考下这篇文章:http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package

    参考的文章:

    http://www.cnblogs.com/fnng/archive/2011/12/02/2272610.html

    http://xiejianglei163.blog.163.com/blog/static/1247276201362204515400/

    http://blog.csdn.net/mapdigit/article/details/7980645

  • 相关阅读:
    龙井和碧螺春的功效与作用
    064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法
    063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法
    062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用
    061 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 08 一维数组总结
    060 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 07 冒泡排序
    059 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 06 增强型for循环
    058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值
    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和
    056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用
  • 原文地址:https://www.cnblogs.com/amunote/p/3765093.html
Copyright © 2011-2022 走看看