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

  • 相关阅读:
    Jedis常用方法 java
    Redis的set、map、list、value、实体类java
    Spring RedisTemplate关闭坏连接
    linux启动vue
    Mybatis实现批量更新sql语句(SSM实现批量更新sql语句)
    mybatis执行批量更新batch update 的方法(oracle,mysql)
    【VM+win7】VM虚拟机安装win7系统教程https://blog.csdn.net/hyhui13/article/details/82682181
    【beyond compare 4】秘钥过期解决办法
    【laravel5】Carbon类
    【Redis+PHP】利用redis的zset实现游戏排行榜功能
  • 原文地址:https://www.cnblogs.com/avivaye/p/4740349.html
Copyright © 2011-2022 走看看