[maven] 实战笔记

① 手工构建自己的maven项目

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

你需要提前知道一些Maven 的约定:

1、在项目的根目录中放置 pom.xml
2、在 src/main/java 目录中放置项目的主代码
3、在 src/test/java 中放置项目的测试代码


假设我们有个项目叫helloworld,我们需要把他构建成为一个maven工程

步骤一:在任意目录新建文件夹ch

步骤二:在ch下新建文件 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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Maven Hello World Project</name>

</project>

文件详解:

代码的第一行是 XML 头,指定了该 xml 文档的版本和编码方式。

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

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

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

A、groupId 定义了项目属于哪个组。命名规范:com.公司名称.项目名称
B、artifactId 定义了当前 Maven 项目在组中唯一的 ID。如项目分层为mvc时

groupId为com.juvenxu.mvnbook
artifactId 可以为action/service/web-app
这样就将mvc的三个层次分成了三个maven项目,三个坐标。当为其他系统提供本系统的服务时,可以直接把service的坐标告诉其他系统,TA就能调用我们的系统服务了。

C、version 指定了 Maven 项目当前的版本
D、元素声明了一个对于用户更为友好的项目名称

步骤三:编写主代码

项目的主代码会被打包到最终的构件中(比如 jar),默认情况下,Maven 假设项目主代码位于 src/main/java 目录,我们遵循 Maven 的约定,创建该目录,然后在该目录下创建文件 com/juvenxu/mvnbook/helloworld/HelloWorld.java

Hello World 的主代码:

package com.juvenxu.mvnbook.helloworld;

public class HelloWorld {
public String sayHello() {
return "Hello Maven";
}

public static void main(String[] args) {
System.out.print( new HelloWorld().sayHello() ); }
}

注意两点:
1、默认遵循Maven约定把项目主代码放到src/main/java/目录下而无须额外的配置。
Maven 会自动搜寻该目录找到项目主代码。

2、一般来说,项目中 Java 类的包都应该基于项目的 groupId 和 artifactId,这样更加清晰,更加符合逻辑,也方便搜索构件或者 Java 类。

步骤四:使用maven进行编译

mvn clean
mvn compile

clean 告诉 Maven 清理输出目录 target/
compile 告诉 Maven 编译项目主代码


步骤五:为maven项目添加jar/pom等依赖

项目和项目间并不是独立的,有时候我们的项目需要依赖于第三方的一些组件进行开发。比如我们现在要测试项目,以前的做法是下载junit.jar文件放在项目的WEB_INF的lib目录下,然后添加到build-path。
有了maven之后,通过在pom文件中配置项目依赖来引入和使用junit.jar


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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Maven Hello World Project</name>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>


代码中添加了dependencies元素,该元素下可以包含多个dependency元素以声明项目的依赖,这里我们添加了一个依赖:
groupId是junit,artifactId是junit,version是 4.7,scope 为依赖范围,默认值为compile,表示该依赖对主代码和测试代码都有效,若声明为test,则表示只对测试代码有效。


有了这段声明,Maven就能够自动下载junit-4.7.jar。
下载方式:自动访问中央仓库
(http://repo1.maven.org/maven2/),下载junit-4.7.jar。
下载完毕之后,以后凡是需要使用junit的maven项目就公用这个jar,而不会再去中央仓库重复下载。

下载的jar包的存放位置:
~/.m2/repository/groupId/artifactId/version
~/.m2/repository/junit/junit/4.7

这个路径下有如下的文件

junit-4.7-sources.jar(以及sources-jar的md5和sha1文件)
junit-4.7.jar(以及jar的md5和sha1文件)
junit-4.7.pom(以及pom的md5和sha1文件)


步骤六:编写测试类并执行mvn的测试命令
在src/test/java路径下编写测试类TestHelloWorld.java
编写好了之后执行mvn clean test 命令

注意:在Maven执行测试(test)之前,它会先自动执行项目主资源处理,主代码编译,测试资源处理,测试代码编译等工作,这是 Maven 生命周期的一个特性。

在执行完毕命令之后,必然出错。因为:由于历史原因,Maven 的核心插件之一 compiler 插件默认只支持编译Java 1.3,因此我们需要配置该插件使其支持 Java5

代码:配置 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>

步骤七:项目打包和运行

默认打包类型为jar,且Maven 会在打包之前执行编译、测试等操作。

简单地执行命令 mvn clean package 进行打包,成功则提示信息:

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] [jar:jar {execution: default-jar}]
[INFO] Building jar: D:codehello-world argethello-world-1.0-SNAPSHOT.jar
[INFO] BUILD SUCCESSFUL


步骤八,在其他项目中使用构建的jar

至此,我们得到了项目的输出,复制这个 jar 文件到其他项目的 classpath 中从而使用 HelloWorld 类。

但是,如何才能让其他的Maven项目直接引用这个jar?也就是如何将其放入中央仓库呢?
我们还需要一个安装的步骤。执行 mvn clean install:

[INFO] [jar:jar {execution: default-jar}]
[INFO] Building jar: D: codehello-world argethello-world-1.0-SNAPSHOT.jar
[INFO] [install:install {execution: default-install}]
[INFO]
Installing
D:codehello-world argethello-world-1.0-SNAPSHOT.jar
to
C:Usersjuven.m2 epositorycomjuvenxumvnbookhello-world1.0-SNAPSHOThello- world-1.0-SNAPSHOT.jar
[INFO] BUILD SUCCESSFUL

从输出我们看到该任务将项目输出的 jar 安装到了 Maven 本地仓库中,我们可以打开相应的文件夹看到 Hello World 项目的 pom 和 jar。

只有构件被下载到本地仓库 后,才能由所有 Maven 项目使用,这里是同样的道理,只有将 Hello World 的构件安装到 本地仓库之后,其他 Maven 项目才能使用它。


拓展:上面我们采用了手工的方式来创建pom以及项目层次结构目录。这样在项目的实际开发中是很复杂的。
所幸 maven提供了 maven archetype 来创建该项目的骨架

1、离开当前maven项目目录
2、运行命令:(实际上是在运行插件 maven-archetype-plugin)
Maven3运行:mvn archetype:generate
Maven2运行:mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate
3、选择一个archetype版本(这里直接回车)
4、输入要创建项目 的 groupId、artifactId、version、以及包名 package

原文地址:https://www.cnblogs.com/avivaye/p/4740349.html