第 2 章 Maven2里的Hello World

看一下如何在Maven2里写一个Helloworld。以下是咱们这章的任务。

首先建立一个Maven2项目,按照Maven2默认的方式组织起目录结构,把该放的东西放到该放的地方,然后执行mvn package执行编译和打包,最后执行得到的jar包,验证一下咱们的成果。

Ready? Let's Go.

2.1. 建立项目目录结构

+ ch02/
  + src/
    + main/
      + java/
        + com/
          + family168/
            + maven2book/
              + ch02/
                * Helloworld.java
  * pom.xml
        

如上所示,ch02目录下有一个src目录和一个pom.xml文件。src目录下放着所有源文件,因为它本身就是source的简写。pom.xml是Maven2的工程文件,里边放着与工程相关的各种配置。

默认情况下,java源代码都放在src/main/java/目录下。记得要使用完整包名,这样Maven2才能根据java文件和对应的class文件进行增量编译。 [1]

在src/main/java/目录下,我们建立了com/family168/maven2book/ch02/这样的目录结构,这个目录是和java中的报名相互对应。之后可以在Helloworld.java中见到相应的package声明。

2.2. 源代码Helloworld.java

放在src/main/java/com/family168/maven2book/ch02/目录下的Helloworld.java内容如下:

package com.family168.maven2book.ch02;

public class Helloworld {
    public static void main(String[] args) {
        System.out.println("Hello World.");
        System.out.println("Welcome to www.family168.com.");
    }
}
        

java代码没有什么多说的,main()方法中的语句都是用来向控制台中打印信息的,我们的目标是把java编译成class,把class打包成jar,然后运行jar中的Helloworld.class。

2.3. 使用Maven2编译打包

在控制台下进入lingo-sample/ch02/目录,执行mvn package。

D:\svn\docbooks\projects\maven2\maven2\lingo-sample\ch02>mvn package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building chapter 02
[INFO]    task-segment: [package]
[INFO] ------------------------------------------------------------------------
Downloading: file://D:\.m2\repository2\/org/apache/maven/plugins/maven-jar-plugin/2.2/maven-jar-plugin-2.2.pom
8K downloaded  (maven-jar-plugin-2.2.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/plugins/maven-plugins/10/maven-plugins-10.pom
7K downloaded  (maven-plugins-10.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/plugins/maven-jar-plugin/2.2/maven-jar-plugin-2.2.jar
26K downloaded  (maven-jar-plugin-2.2.jar)
[INFO] [resources:resources]
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\svn\docbooks\projects\maven2\maven2\lingo-sample\ch02\src\main\resources
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\svn\docbooks\projects\maven2\maven2\lingo-sample\ch02\target\classes
[INFO] [resources:testResources]
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\svn\docbooks\projects\maven2\maven2\lingo-sample\ch02\src\test\resources
[INFO] [compiler:testCompile]
[INFO] No sources to compile
[INFO] [surefire:test]
[INFO] No tests to run.
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-project/2.0.7/maven-project-2.0.7.pom
2K downloaded  (maven-project-2.0.7.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven/2.0.7/maven-2.0.7.pom
10K downloaded  (maven-2.0.7.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-settings/2.0.7/maven-settings-2.0.7.pom
1K downloaded  (maven-settings-2.0.7.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-model/2.0.7/maven-model-2.0.7.pom
2K downloaded  (maven-model-2.0.7.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-profile/2.0.7/maven-profile-2.0.7.pom
1K downloaded  (maven-profile-2.0.7.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-artifact-manager/2.0.7/maven-artifact-manager-2.0.7.pom
2K downloaded  (maven-artifact-manager-2.0.7.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-repository-metadata/2.0.7/maven-repository-metadata-2.0.7.pom
1K downloaded  (maven-repository-metadata-2.0.7.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-artifact/2.0.7/maven-artifact-2.0.7.pom
1K downloaded  (maven-artifact-2.0.7.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-plugin-registry/2.0.7/maven-plugin-registry-2.0.7.pom
1K downloaded  (maven-plugin-registry-2.0.7.pom)
Downloading: file://D:\.m2\repository2\/commons-lang/commons-lang/2.1/commons-lang-2.1.pom
9K downloaded  (commons-lang-2.1.pom)
Downloading: file://D:\.m2\repository2\/commons-lang/commons-lang/2.1/commons-lang-2.1.jar
Downloading: file://D:\.m2\repository2\/org/codehaus/plexus/plexus-utils/1.4.9/plexus-utils-1.4.9.jar
202K downloaded  (commons-lang-2.1.jar)
199K downloaded  (plexus-utils-1.4.9.jar)
[INFO] [jar:jar]
[INFO] Building jar: D:\svn\docbooks\projects\maven2\maven2\lingo-sample\ch02\target\ch02-1.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Mon May 25 13:15:34 CST 2009
[INFO] Final Memory: 10M/254M
[INFO] ------------------------------------------------------------------------
        

和以前一样,Maven2又从repo中下载了一大堆用于编译打包的依赖包,这些依赖包只会下载一次,以后为项目进行编译打包时就不用再下载了。

操作完成之后项目的目录结构变成了这样。

+ ch02/
  + src/
    + main/
      + java/
        + com/
          + family168/
            + maven2book/
              + ch02/
                * Helloworld.java
  + target/
    + classes/
      + com/
        + family168/
          + maven2book/
            + ch02/
              * Helloworld.class
    + maven-archiver/
      * pom.properties
    * ch02-1.0.jar
  * pom.xml
        

多出来的target/目录下包含了刚才的操作所生成的临时文件,编译生成的class文件放在target/classes/目录下。maven-archiver/目录下是打包所需的配置文件,最终打包生成的结果是target/目录下的ch02-1.0.jar。

Maven2对于源文件和临时文件有很清晰地划分,src/目录下放的是工程所需的所有源文件,target/目录下则是在项目构建过程中生成的各种临时文件,在我们打算清理项目时只需删除target目录就可以了,简单易行。

实际上我们稍后马上会介绍如何使用Maven2提供的命令清除工程中的临时文件。第 2.5 节 “清除临时文件”

2.4. 执行jar验证结果

使用java命令执行生成的ch02-1.0.jar,命令如下:

call java -cp target/ch02-1.0.jar com.family168.maven2book.ch02.Helloworld
        

显示结果如下:

D:\svn\docbooks\projects\maven2\maven2\lingo-sample\ch02>call java -cp target/ch02-1.0.jar com.family168.maven2book.ch02.Helloworld
Hello World.
Welcome to www.family168.com.
        

现在我们的本地repo大小为:3.37M。

2.5. 清除临时文件

现在我们知道如何使用Maven2对项目中的java文件进行编译和打包操作了,这些操作都会生成各自所需的临时文件,我们常常需要把这些临时文件删除,以此来对源代码部分进行备份,或解决一些临时文件带来的问题。

虽然我们可以简单的通过手工删除target/目录来实现清除项目临时文件的目录,不过我们还是推荐使用Maven2提供的clean命令来进行这项工作。

执行mvn clean进行清理工作。


D:\svn\docbooks\projects\maven2\maven2\lingo-sample\ch02>mvn clean
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building chapter 02
[INFO]    task-segment: [clean]
[INFO] ------------------------------------------------------------------------
Downloading: file://D:\.m2\repository2\/org/apache/maven/plugins/maven-clean-plugin/2.2/maven-clean-plugin-2.2.pom
3K downloaded  (maven-clean-plugin-2.2.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/plugins/maven-clean-plugin/2.2/maven-clean-plugin-2.2.jar
11K downloaded  (maven-clean-plugin-2.2.jar)
Downloading: file://D:\.m2\repository2\/org/apache/maven/shared/file-management/1.2/file-management-1.2.pom
3K downloaded  (file-management-1.2.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/shared/maven-shared-io/1.1/maven-shared-io-1.1.pom
3K downloaded  (maven-shared-io-1.1.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-artifact/2.0.2/maven-artifact-2.0.2.pom
765b downloaded  (maven-artifact-2.0.2.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven/2.0.2/maven-2.0.2.pom
12K downloaded  (maven-2.0.2.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/maven-artifact-manager/2.0.2/maven-artifact-manager-2.0.2.pom
1K downloaded  (maven-artifact-manager-2.0.2.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-6/wagon-provider-api-1.0-alpha-6.pom
588b downloaded  (wagon-provider-api-1.0-alpha-6.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/wagon/wagon/1.0-alpha-6/wagon-1.0-alpha-6.pom
6K downloaded  (wagon-1.0-alpha-6.pom)
Downloading: file://D:\.m2\repository2\/org/codehaus/plexus/plexus-utils/1.4.6/plexus-utils-1.4.6.pom
2K downloaded  (plexus-utils-1.4.6.pom)
Downloading: file://D:\.m2\repository2\/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.pom
767b downloaded  (plexus-utils-1.1.pom)
Downloading: file://D:\.m2\repository2\/org/apache/maven/shared/file-management/1.2/file-management-1.2.jar
Downloading: file://D:\.m2\repository2\/org/codehaus/plexus/plexus-utils/1.1/plexus-utils-1.1.jar
36K downloaded  (file-management-1.2.jar)
Downloading: file://D:\.m2\repository2\/org/apache/maven/shared/maven-shared-io/1.1/maven-shared-io-1.1.jar
38K downloaded  (maven-shared-io-1.1.jar)
164K downloaded  (plexus-utils-1.1.jar)
[INFO] [clean:clean]
[INFO] Deleting directory D:\svn\docbooks\projects\maven2\maven2\lingo-sample\ch02\target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Mon May 25 12:04:05 CST 2009
[INFO] Final Memory: 3M/254M
[INFO] ------------------------------------------------------------------------
        

操作执行结束后,我们可以看到target/目录被删除了。

和之前一样,我们又看到Maven2下载了大量依赖包,可能有人对此有所疑问,仅仅是删除一个目录,至于这样大费周章么?实际上mvn clean的工作不仅仅是删除一个目录这么简单,通过相应的配置我们可以实现各种清理功能,大家现在可以参考官方文档对maven-clean-plugin的配置说明,来了解更多它的信息。

现在我们的本地repo大小为:3.65M。



[1] 增量编译从make时代开始就出来了,ant也是主要用来解决这个问题的,实际上所有的构建工具都支持这个功能,因为我们总不能在一个拥有几千个java的项目里,因为只修改了一个文件,就把全部几千个文件都编译一遍,这样太费时费力了,Maven2可以使用判断java在最后一次编译之后是否修改过,这样我们就可以只编译做过修改的源代码了,多贴心的功能哦!