码迷,mamicode.com
首页 > 其他好文 > 详细

maven实战迷你版记录

时间:2016-05-30 21:39:14      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

1.  ~/.m2 文件

默认情况下,该文件夹下放置了 Maven 本地 仓库.m2/repository。所有的 Maven 构件(artifact)都被存储到该仓库中,以方便重用。 

默认情况下,~/.m2 目录下除了 repository 仓库之外就没有其他目录和文件了,不过大多 数 Maven 用户需要复制 M2_HOME/conf/settings.xml 文件到~/.m2/settings.xml。

 

2.  配置用户范围settings.xml 

Maven 用户可以选择配置$M2_HOME/conf/settings.xml 或者~/.m2/settings.xml。前者是全 局范围的,整台机器上的所有用户都会直接受到该配置的影响,而后者是用户范围的,只 有当前用户才会受到该配置的影响。

我们推荐使用用户范围的 settings.xml,主要原因是为了避免无意识地影响到系统中的其 他用户。当然,如果你有切实的需求,需要统一系统中所有用户的 settings.xml 配置,当 然应该使用全局范围的 settings.xml。 

除了影响范围这一因素,配置用户范围 settings.xml 文件还便于 Maven 升级。直接修改 conf 目录下的 settings.xml 会导致 Maven 升级不便,每次升级到新版本的 Maven,都需要 复制 settings.xml 文件,如果使用~/.m2 目录下的 settings.xml,就不会影响到 Maven 安装 文件,升级时就不需要触动 settings.xml 文件。 

 

3. pom

POM (Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构 建,声明项目依赖,等等。 

 

4. maven默认搜索代码的目录

项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中(比如 jar),而测 试代码只在运行测试时用到,不会被打包。默认情况下,Maven 假设项目主代码位于 src/main/java 目录

我们应该把项目主代码 放到 src/main/java/目录下(遵循 Maven 的约定),而无须额外的配置,Maven 会自动搜 寻该目录找到项目主代码。 

 

代码编写完毕后,我们使用 Maven 进行编译,在项目根目录下运行命令 mvn clean compile ,我们会得到如下输出:

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Hello World Project
[INFO] task-segment: [clean, compile]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting directory D:\code\hello-world\target
[INFO] [resources:resources {execution: default-resources}]
[INFO] skip non existing resourceDirectory D: \code\hello-world\src\main\resources [INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to D: \code\hello-world\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 second
[INFO] Finished at: Fri Oct 09 02:08:09 CST 2009
[INFO] Final Memory: 9M/16M
[INFO] ------------------------------------------------------------------------ 

 

clean 告诉 Maven 清理输出目录 target/,compile 告诉 Maven 编译项目主代码,从输出中 我们看到 Maven 首先执行了 clean:clean 任务,删除 target/目录,默认情况下 Maven 构建 的所有输出都在 target/目录中;接着执行 resources:resources 任务(未定义项目资源,暂 且略过);最后执行 compiler:compile 任务,将项目主代码编译至 target/classes 目录(编译 好的类为 com/juvenxu/mvnbook/helloworld/HelloWorld.Class)。

上文提到的 clean:clean、resources:resources,以及 compiler:compile 对应了一些 Maven 插 件及插件目标,比如 clean:clean 是 clean 插件的 clean 目标,compiler:compile 是 compiler 插件的 compile 目标,后文会详细讲述 Maven 插件及其编写方法。 

 

5. 

为了使项目结构保持清晰,主代码与测试代码应该分别位于独立的目录中。3.2 节讲过 Maven 项目中默认的主代码目录是 src/main/java,对应地,Maven 项目中默认的测试代码 目录是 src/test/java。 

测试用例编写完毕之后就可以调用 Maven 执行测试,运行 mvn clean test :

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Hello World Project
[INFO] task-segment: [clean, test]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting directory D:\git-juven\mvnbook\code\hello-world\target [INFO] [resources:resources {execution: default-resources}]
...
Downloading: http://repo1.maven.org/maven2/junit/junit/4.7/junit-4.7.pom 1K downloaded (junit-4.7.pom)
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to D: \code\hello-world\target\classes
[INFO] [resources:testResources {execution: default-testResources}]
...
Downloading: http://repo1.maven.org/maven2/junit/junit/4.7/junit-4.7.jar 226K downloaded (junit-4.7.jar)
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Compiling 1 source file to D:\ code\hello-world\target\test-classes [INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure
D:\code\hello-

 

world\src\test\java\com\juvenxu\mvnbook\helloworld\HelloWorldTest.java:[8,5] -source 1.3

中不支持注释
(请使用 -source 5 或更高版本以启用注释)

@Test
[INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch 

 

不幸的是构建失败了,不过我们先耐心分析一下这段输出(为了本书的简洁,一些不重要 的信息我用省略号略去了)。命令行输入的是 mvn clean test,而 Maven 实际执行的可不 止 这 两 个 任 务 , 还 有 clean:clean 、 resources:resources 、 compiler:compile 、 resources:testResources 以及 compiler:testCompile。暂时我们需要了解的是,在 Maven 执 行测试(test)之前,它会先自动执行项目主资源处理,主代码编译,测试资源处理,测 试代码编译等工作,这是 Maven 生命周期的一个特性 

构建在执行 compiler:testCompile 任务的时候失败了,Maven 输出提示我们需要使用- source 5 或更高版本以启动注释,也就是前面提到的 JUnit 4 的@Test 注解。这是 Maven 初学者常常会遇到的一个问题。由于历史原因,Maven 的核心插件之一 compiler 插件默 认只支持编译 Java 1.3,因此我们需要配置该插件使其支持 Java 5,见代码清单 2-5:

代码清单 2-5:配置 maven-compiler-plugin 支持 Java 5

<project>

 

...

<build> <plugins>

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration>

<source>1.5</source>

<target>1.5</target> </configuration>

</plugin> </plugins>

</build>

...

</project> 

该 POM 省略了除插件配置以外的其他部分,我们暂且不去关心插件配置的细节,只需要 知道 compiler 插件支持 Java 5 的编译。 

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

6.  打包和运行

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

...

 

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:

...

 

[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 项目 中执行这些命令,而且我们已经清楚它们是用来做什么的。 

 

7. 运行jar包

默认打包生成的 jar 是不能够直接运行的,因为带有 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.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.jar 和 original-hello-world-1.0-SNAPSHOT.jar , 前 者 是 带 有 Main-Class 信息的可运行 jar,后者是原始的 jar,打开 hello-world-1.0-SNAPSHOT.jar 的 META-INF/MANIFEST.MF,可以看到它包含这样一行信息:

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

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

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

 

maven实战迷你版记录

标签:

原文地址:http://www.cnblogs.com/onlychang92/p/5543921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!