• maven使用入门


    http://hzbook.group.iteye.com/group/wiki/2872-Maven-in-action#3334

    3.4 打包和运行 Top

    将项目进行编译、测试之后,下一个重要步骤就是打包(package)。Hello World的POM中没有指定打包类型,使用默认打包类型jar,我们可以简单地执行命令 mvn clean package 进行打包,可以看到如下输出:

    Java代码 复制代码 收藏代码
    1. …   
    2. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0  
    3.   
    4. [INFO] [jar:jar {execution: default-jar}]   
    5. [INFO] Building jar: D:\code\hello-world\target\hello-world-1.0-SNAPSHOT.jar   
    6. [INFO]    
    7. --------------------------------------------------------------------   
    8. [INFO] BUILD SUCCESSFUL   
    9. …  
        …
        Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    
        [INFO] [jar:jar {execution: default-jar}]
        [INFO] Building jar: D:\code\hello-world\target\hello-world-1.0-SNAPSHOT.jar
        [INFO] 
    ------------------------------------------------------------------------
        [INFO] BUILD SUCCESSFUL
        …
    
     

    类似地,Maven会在打包之前执行编译、测试等操作。这里我们看到jar:jar任务负责打包,实际上就是jar插件的jar目标将项目主代码打包成一个名为hello-world-1.0-SNAPSHOT.jar的文件,该文件也位于target/输出目录中,它是根据artifact-version.jar规则进行命名的,如有需要,我们还可以使用finalName来自定义该文件的名称,这里暂且不展开,本书后面会详细解释。

    至此,我们得到了项目的输出,如果有需要的话,就可以复制这个jar文件到其他项目的Classpath中从而使用HelloWorld类。但是,如何才能让其他的Maven项目直接引用这个jar呢?我们还需要一个安装的步骤,执行 mvn clean install

    Java代码 复制代码 收藏代码
    1.    …   
    2.    [INFO] [jar:jar {execution: default-jar}]   
    3.    [INFO] Building jar: D: \code\hello-world\target\hello-world-1.0-SNAPSHOT.jar   
    4.    [INFO] [install:install {execution: default-install}]   
    5.    [INFO] Installing D:\code\hello-world\target\hello-world-1.0-SNAPSHOT.jar to C:\Users\juven\.m2\repository\com\juvenxu\mvnbook\hello-world\1.0-SNAPSHOT\hello-world-1.0-SNAPSHOT.jar   
    6.    [INFO]   
    7. ------------------------------------------------------------------------   
    8.    [INFO] BUILD SUCCESSFUL   
    9.    …  
        …
        [INFO] [jar:jar {execution: default-jar}]
        [INFO] Building jar: D: \code\hello-world\target\hello-world-1.0-SNAPSHOT.jar
        [INFO] [install:install {execution: default-install}]
        [INFO] Installing D:\code\hello-world\target\hello-world-1.0-SNAPSHOT.jar to C:\Users\juven\.m2\repository\com\juvenxu\mvnbook\hello-world\1.0-SNAPSHOT\hello-world-1.0-SNAPSHOT.jar
        [INFO]
     ------------------------------------------------------------------------
        [INFO] BUILD SUCCESSFUL
        …

    在打包之后,我们又执行了安装任务install:install,从输出我们看到该任务将项目输出的jar安装到了Maven本地仓库中,我们可以打开相应的文件夹看到Hello World项目的pom和jar。之前讲述JUnit的POM及jar的下载的时候,我们说只有构件被下载到本地仓库后,才能由所有Maven项目使用,这里是同样的道理,只有将Hello World的构件安装到本地仓库之后,其他Maven项目才能使用它。

    我们已经将体验了Maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。执行test之前是会先执行compile的,执行package之前是会先执行test的,而类似地,install之前会执行package。我们可以在任何一个Maven项目中执行这些命令,而且我们已经清楚它们是用来做什么的。

    到目前为止,我们还没有运行Hello World项目,不要忘了HelloWorld类可是有一个main方法的。默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中(我们可以打开jar文件中的META-INF/MANIFEST.MF文件,将无法看到Main-Class一行)。为了生成可执行的jar文件,我们需要借助maven-shade-plugin,配置该插件如下:

    Java代码 复制代码 收藏代码
    1. <plugin>   
    2. <groupId>org.apache.maven.plugins</groupId>   
    3.   <artifactId>maven-shade-plugin</artifactId>   
    4.   <version>1.2.1</version>   
    5.   <executions>   
    6.     <execution>   
    7.       <phase>package</phase>   
    8.       <goals>   
    9.         <goal>shade</goal>   
    10.       </goals>   
    11.       <configuration>   
    12.         <transformers>   
    13.           <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">            <mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>   
    14.          </transformer>   
    15.        </transformers>   
    16.      </configuration>   
    17.      </execution>   
    18.   </executions>   
    19. </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.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>
             </transformer>
           </transformers>
         </configuration>
         </execution>
      </executions>
    </plugin>
    
     

    plugin元素在POM中的相对位置应该在<project><build><plugins>下面。我们配置了mainClass为com.juvenxu.mvnbook.helloworld.HelloWorld,项目在打包时会将该信息放到MANIFEST中。现在执行 mvn clean install ,待构建完成之后打开target/目录,我们可以看到hello-world-1.0-SNAPSHOT.jaroriginal-hello-world-1.0-SNAPSHOT.jar,前者是带有Main-Class信息的可运行jar,后者是原始的jar,打开hello-world-1.0-SNAPSHOT.jarMETA-INF/MANIFEST.MF,可以看到它包含这样一行信息:

    Main-Class: com.juvenxu.mvnbook.helloworld.HelloWorld

    现在,我们在项目根目录中执行该jar文件:

    D: \code\hello-world>java -jar target\hello-world-1.0-SNAPSHOT.jar

    Hello Maven

    控制台输出为Hello Maven,这正是我们所期望的。

    本小节介绍了Hello World项目,侧重点是Maven而非Java代码本身,介绍了POM、Maven项目结构、以及如何编译、测试、打包,等等。

    3.5 使用Archetype生成项目骨架 Top

    Hello World项目中有一些Maven的约定:在项目的根目录中放置pom.xml,在src/main/java目录中放置项目的主代码,在src/test/java中放置项目的测试代码。我之所以一步一步地展示这些步骤,是为了能让可能是Maven初学者的你得到最实际的感受。我们称这些基本的目录结构和pom.xml文件内容称为项目的骨架,当你第一次创建项目骨架的时候,你还会饶有兴趣地去体会这些默认约定背后的思想,第二次,第三次,你也许还会满意自己的熟练程度,但第四、第五次做同样的事情,就会让程序员恼火了,为此Maven提供了Archetype以帮助我们快速勾勒出项目骨架。

    还是以Hello World为例,我们使用maven archetype来创建该项目的骨架,离开当前的Maven项目目录。

    如果是Maven 3,简单的运行:

    mvn archetype:generate

    如果是Maven 2,最好运行如下命令:

    mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate

    很多资料会让你直接使用更为简单的 mvn archetype:generate 命令,但在Maven2中这是不安全的,因为该命令没有指定archetype插件的版本,于是Maven会自动去下载最新的版本,进而可能得到不稳定的SNAPSHOT版本,导致运行失败。然而在Maven 3中,即使用户没有指定版本,Maven也只会解析最新的稳定版本,因此这是安全的,具体内容见7.7小节。

    我们实际上是在运行插件maven-archetype-plugin,注意冒号的分隔,其格式为 groupId:artifactId:version:goal ,org.apache.maven.plugins 是maven官方插件的groupId,maven-archetype-plugin 是archetype插件的artifactId,2.0-alpha-5 是目前该插件最新的稳定版,generate是我们要使用的插件目标。

    紧接着我们会看到一段长长的输出,有很多可用的archetype供我们选择,包括著名的Appfuse项目的archetype,JPA项目的archetype等等。每一个archetype前面都会对应有一个编号,同时命令行会提示一个默认的编号,其对应的archetype为maven-archetype-quickstart,我们直接回车以选择该archetype,紧接着Maven会提示我们输入要创建项目的groupId、artifactId、 version、以及包名package,如下输入并确认:

    Java代码 复制代码 收藏代码
    1. Define value for groupId: : com.juvenxu.mvnbook   
    2. Define value for artifactId: : hello-world   
    3. Define value for version:  1.0-SNAPSHOT: :   
    4. Define value for package:  com.juvenxu.mvnbook: : com.juvenxu.mvnbook.helloworld   
    5. Confirm properties configuration:   
    6. groupId: com.juvenxu.mvnbook   
    7. artifactId: hello-world   
    8. version: 1.0-SNAPSHOT   
    9. package: com.juvenxu.mvnbook.helloworld   
    10.  Y: : Y  
    Define value for groupId: : com.juvenxu.mvnbook
    Define value for artifactId: : hello-world
    Define value for version:  1.0-SNAPSHOT: :
    Define value for package:  com.juvenxu.mvnbook: : com.juvenxu.mvnbook.helloworld
    Confirm properties configuration:
    groupId: com.juvenxu.mvnbook
    artifactId: hello-world
    version: 1.0-SNAPSHOT
    package: com.juvenxu.mvnbook.helloworld
     Y: : Y

    Archetype插件将根据我们提供的信息创建项目骨架。在当前目录下,Archetype插件会创建一个名为hello-world(我们定义的artifactId)的子目录,从中可以看到项目的基本结构:基本的pom.xml已经被创建,里面包含了必要的信息以及一个junit依赖;主代码目录src/main/java已经被创建,在该目录下还有一个Java类com.juvenxu.mvnbook.helloworld.App,注意这里使用到了我们刚才定义的包名,而这个类也仅仅只有一个简单的输出Hello World!的main方法;测试代码目录src/test/java也被创建好了,并且包含了一个测试用例com.juvenxu.mvnbook.helloworld.AppTest

    Archetype可以帮助我们迅速地构建起项目的骨架,在前面的例子中,我们完全可以在Archetype生成的骨架的基础上开发Hello World项目以节省我们大量时间。

    此外,我们这里仅仅是看到了一个最简单的archetype,如果你有很多项目拥有类似的自定义项目结构以及配置文件,你完全可以一劳永逸地开发自己的archetype,然后在这些项目中使用自定义的archetype来快速生成项目骨架,本书后面的章节会详细阐述如何开发Maven Archetype。

    3.6 m2eclipse简单使用 Top

    介绍前面Hello World项目的时候,我们并没有涉及IDE,如此简单的一个项目,使用最简单的编辑器也能很快完成,但对于稍微大一些的项目来说,没有IDE就是不可想象的,本节我们先介绍m2eclipse的基本使用。

    3.6.1 导入Maven项目

    第2章介绍了如何安装m2eclipse,现在,我们使用m2ecilpse导入Hello World项目。选择菜单项File,然后选择Import,我们会看到一个Import对话框,在该对话框中选择General目录下的Maven Projects,然后点击Next,就会出现Import Projects对话框,在该对话框中点击Browse…选择Hello World的根目录(即包含pom.xml文件的那个目录),这时对话框中的Projects:部分就会显示该目录包含的Maven项目,如图3-1所示:


     图3-1 在Eclipse中导入Maven项目

    点击Finish之后,m2ecilpse就会将该项目导入到当前的workspace中,导入完成之后,我们就可以在Package Explorer视图中看到如图3-2所示的项目结构:

     图3-2 Eclipse中导入的Maven项目结构

    我们看到主代码目录src/main/java和测试代码目录src/test/java成了Eclipse中的资源目录,包和类的结构也十分清晰,当然pom.xml永远在项目的根目录下,而从这个视图中我们甚至还能看到项目的依赖junit-4.7.jar,其实际的位置指向了Maven本地仓库(这里我自定义了Maven本地仓库地址为D:\java\repository,后续章节会介绍如何自定义本地仓库位置)。

    3.6.2 创建Maven项目

    创建一个Maven项目也十分简单,选择菜单项File -> New -> Other,在弹出的对话框中选择Maven下的Maven Project,然后点击Next >,在弹出的New Maven Project对话框中,我们使用默认的选项(不要选择Create a simple project选项,那样我们就能使用Maven Archetype),点击Next >,此时m2eclipse会提示我们选择一个Archetype,我们选择maven-archetype-quickstart,再点击Next >。由于m2eclipse实际上是在使用maven-archetype-plugin插件创建项目,因此这个步骤与上一节我们使用archetype创建项目骨架类似,输入groupId,、artifactId、version、package(暂时我们不考虑Properties),如图3-3所示:


     图3-3 在Eclipse中使用Archetype创建项目

    注意,为了不和前面已导入的Hello World项目产生冲突和混淆,我们使用不同的artifactId和package。OK,点击Finish,Maven项目就创建完成了,其结构与前一个已导入的Hello World项目基本一致。

    3.6.3 运行mvn命令

    我们需要在命令行输入如mvn clean install之类的命令来执行maven构建,m2eclipse中也有对应的功能,在Maven项目或者pom.xml上右击,再选择Run As,就能看到如下的常见Maven命令,如图3-4所示:


     图3-4 在Eclipse中运行默认mvn命令

    选择想要执行的Maven命令就能执行相应的构建,同时我们也能在Eclipse的console中看到构建输出。这里常见的一个问题是,默认选项中没有我们想要执行的Maven命令怎么办?比如,默认带有mvn test,但我们想执行mvn clean test,很简单,选择Maven buid… 以自定义Maven运行命令,在弹出对话框中的Goals一项中输入我们想要执行的命令,如clean test,设置一下Name,点击Run即可。并且,下一次我们选择Maven build,或者使用快捷键Alt + Shift + X, M快速执行Maven构建的时候,上次的配置直接就能在历史记录中找到。图3-5就是自定义Maven运行命令的界面:


     图3-5 在Eclipse中自定义mvn命令

    3.7 NetBeans Maven插件简单使用 Top

    NetBeans的Maven插件也十分简单易用,我们可以轻松地在NetBeans中导入现有的Maven项目,或者使用Archetype创建Maven项目,我们也能够在NetBeans中直接运行mvn命令。

    3.7.1 打开Maven项目

    与其说打开Maven项目,不如称之为导入更为合适,因为这个项目不需要是NetBeans创建的Maven项目,不过这里我们还是遵照NetBeans菜单中使用的名称。

    选择菜单栏中的文件,然后选择打开项目,直接定位到Hello World项目的根目录,NetBeans会十分智能地识别出Maven项目,如图3-6所示:


    图3-6 在NetBeans中导入Maven项目

    Maven项目的图标有别于一般的文件夹,点击打开项目后,Hello World项目就会被导入到NetBeans中,在项目视图中可以看到如图3-7所示的项目结构:


     图3-7 NetBeans中导入的Maven项目结构

    NetBeans中项目主代码目录的名称为源包,测试代码目录成了测试包,编译范围依赖为,测试范围依赖为测试库,这里我们也能看到pom.xml,NetBeans甚至还帮我们引用了settings.xml。

    3.7.2 创建Maven项目

    在NetBeans中创建Maven项目同样十分轻松,在菜单栏中选择文件,然后新建项目,在弹出的对话框中,选择项目类别为Maven,项目为Maven项目,点击“下一步”之后,对话框会提示我们选择Maven原型(即Maven Archtype),我们选择Maven快速启动原型(1.0,(即前文提到的maven-archetype-quickstart),点击“下一步”之后,输入项目的基本信息,这些信息在之前讨论archetype及在m2eclipse中创建Maven项目的时候都仔细解释过,不再详述,如图3-8所示:


     图3-8 在NetBeans中使用Archetype创建Maven项目

    点击完成之后,一个新的Maven项目就创建好了。

    3.7.3 运行mvn命令

    NetBeans在默认情况下提供两种Maven运行方式,点击菜单栏中的运行,我们可以看到生成项目清理并生成项目两个选项,我们可以尝试“点击运行Maven构建”,根据NetBeans控制台的输出,我们就能发现它们实际上对应了mvn installmvn clean install两个命令。

    在实际开发过程中,我们往往不会满足于这两种简单的方式,比如,有时候我们只想执行项目的测试,而不需要打包,这时我们就希望能够执行mvn clean test命令,所幸的是NetBeans Maven插件完全支持自定义的mvn命令配置。

    在菜单栏中选择工具,接着选择选项,在对话框中,最上面一栏选择其他,下面选择Maven标签栏,在这里我们可以对NetBeans Maven插件进行全局的配置(还记得第2章中我们如何配置NetBeans使用外部Maven么?)。现在,选择倒数第三行的编辑全局定制目标定义,我们添加一个名为Maven Test的操作,执行目标为clean test,暂时不考虑其他配置选项,如图3-9所示:

     

    图3-9 在NetBeans中自定义mvn命令

    点击“缺省保存该配置”,在Maven项目上右击,选择定制,就能看到刚才配置好的Maven运行操作,选择Maven Test之后,终端将执行mvn clean test。值得一提的是,我们也可以在项目上右击,选择定制,再选择目标再输入想要执行的Maven目标(如clean package),点击确定之后NetBeans就会执行相应的Maven命令。这种方式十分便捷,但这是临时的,该配置不会被保存,也不会有历史记录。

    3.8 小结 Top

    本章以尽可能简单且详细的方式叙述了一个Hello World项目,重点解释了POM的基本内容、Maven项目的基本结构、以及构建项目基本的Maven命令。在此基础上,还介绍了如何使用Archetype快速创建项目骨架。最后讲述的是如何在Eclipse和NetBeans中导入、创建及构建Maven项目。
  • 相关阅读:
    Advanced Office Password Recovery 3.04 Professional Edition
    免费的ISO文件创建工具!
    opera for windows 上的阿里旺旺调用
    还不错,字母成熟了些!
    360的报应:超级巡警发布通用软件卸载工具 暂时只支持360
    未名晓店
    aMSN/QQ for Ubuntu 10.04
    IDENTITY
    最简单的bug管理系统
    代理网站
  • 原文地址:https://www.cnblogs.com/bnuvincent/p/2078902.html
Copyright © 2020-2023  润新知