zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    118/119. Pascal's Triangle/II
    160. Intersection of Two Linked Lists
    168. Excel Sheet Column Title
    167. Two Sum II
    172. Factorial Trailing Zeroes
    169. Majority Element
    189. Rotate Array
    202. Happy Number
    204. Count Primes
    MVC之Model元数据
  • 原文地址:https://www.cnblogs.com/avivaye/p/4740349.html
Copyright © 2011-2022 走看看