Maven入门

原文1

原文2

你要做的东西

通过Maven来构建一个显示当天时间的应用。

你需要的东西

  • 15分钟
  • 你喜欢的文本编辑器或者IDE
  • JDK 8 或者更新

如何完成这个指南

我是新手,走最基础的方式


创建项目

首先,你需要创建一个项目用来给Maven构建。把注意力集中到Maven上,项目做得尽可能简单。项目结构如下。

src
    main
        java
            hello

找个文件夹先创建一下目录 mkdir -p src/main/java/hello,然后创建2个类。HelloWorld.javaGreeter.java

代码如下:

package hello;

public class HelloWorld {
    public static void main(String[] args) {
        Greeter greeter = new Greeter();
        System.out.println(greeter.sayHello());
    }
}
package hello;

public class Greeter {
    public String sayHello() {
        return "Hello world!";
    }
}

这样就有了一个可以用Maven构建的项目,下一步就是要安装Maven。

安装Maven

Maven可以在链接下载。只需要二进制文件就好,像apache-maven-*{version}*-bin.zipapache-maven-*{version}*-bin.tar.gz这样的链接。

下载完成之后解压,然后把解压出来的bin目录添加到PATH环境变量中。

先检查一下JAVA_HOME环境变量的值。

echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home

然后修改PATH的值

export PATH=/opt/apache-maven-3.6.0/bin:$PATH

然后用mvn -v测试一下

Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)

成功安装。

跳过Maven Wrapper相关的介绍

定义一个简单的Maven构建

按照上面步骤装好Maven,现在需要创建一个Maven项目的定义文件。通过pom.xml来实现。这里可以指定项目的名称,版本,外部依赖项。

在项目的根目录创建一个_pom.xml_文件,和src文件夹同级,内容如下。

<?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>org.springframework</groupId>
    <artifactId>gs-maven</artifactId>
    <packaging>jar</packaging>
    <version>0.1.0</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>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>hello.HelloWorld</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

除了可选的<packaging>元素,这是一个最简单的用来构建项目的pom 配置文件。他包括以下几点:

  • <modelVersion> pom文件模型的版本。一直是4.0。
  • <groupId> 表示项目所属的组或组织,通常是反过来写的域名。
  • <artifactId> 项目最后生成的文件的名字,比如jar 或者 war文件的名字。
  • <version> 项目的版本。
  • <packaging> 打包的方式,默认是jar,也可以指定war。

当选择版本的时候,建议使用 链接方式。

编译java代码

现在可以用Maven来编译你的项目了。可以用Maven做到以下几点:

  • 编译你的项目代码
mvn compile

完成之后在 target/classes 目录下会生成编译好的.class 文件。

  • 创建jar包
mvn package

package命令会编译代码+运行测试+生成jar文件。jar文件名是依据pom里面设置的artifactId和version来的。

  • 在本地Maven仓库安装依赖

Maven也会在本机上维护依赖项。通常是在.m2/repository目录以便下次用到的时候尽快访问到。如果你想把你项目的jar文件安装到本地仓库,你需要使用install命令。

mvn install

这个命令会编译,测试,打包你的代码,然后安装到本地仓库,用于其他项目的依赖引用。

声明依赖项

上面的项目很简单,没有依赖其他任何库。但通常来说,大部分项目都是需要依赖外部库来处理一系列问题。

举个例子说,我们需要使用Joda这个库来打印当前时间。

首先改一下HelloWorld.java的代码。

package hello;

import org.joda.time.LocalTime;

public class HelloWorld {
    public static void main(String[] args) {
        LocalTime currentTime = new LocalTime();
        System.out.println("The current local time is: " + currentTime);
        Greeter greeter = new Greeter();
        System.out.println(greeter.sayHello());
    }
}

如果直接运行mvn compile,编译会报错。我们需要在<project>节点中增加下面内容。

<dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.2</version>
        </dependency>
</dependencies>

上面的xml定义了项目需要用到的依赖项。group,artifactId,version和上面的意思一样。dependency默认的作用域是compile,这意味着他们的在编译期间是可用的。可以通过<scope>来指定他们的作用域。还有两种:

  1. provided 编译+运行时可用。
  2. test编译+测试时可用,运行时不可用。

再次运行compile,mvn就会去下载对应的dependency。

编写测试

第一步,添加一下JUnit依赖到pom.xml文件中,作用域是test。

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
</dependency>

创建一个src/test/java/hello/GreeterTest测试用例

package hello;

import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;

import org.junit.Test;

public class GreeterTest {

    private Greeter greeter = new Greeter();

    @Test
    public void greeterSaysHello() {
        assertThat(greeter.sayHello(), containsString("Hello"));
    }

}

Maven使用surefire插件来运行单元测试。默认的配置是运行所有src/test/javaTest结尾的类。下面来运行。

小结

恭喜,你完成了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [SpingBoot guides系列翻译]通过JDBC和Spring访问关系数据库

    build的时候用到了spring-boot-maven-plugin插件。他提供了很多便捷的特性。

    _淡定_
  • 【SpingBoot guides系列翻译】调用RESTfulWebService

    这节将演示如何在SpringBoot里面调用RESTful的WebService。

    _淡定_
  • Maven安装+配置

    Maven依赖一定是引用本地仓库的,所以会先从中央仓库把依赖下载下来存到本地。和NuGet是一样的。

    _淡定_
  • Maven with Multi-module

    For example, the hongten-security project, the structure of the hongten-security...

    Hongten
  • Spring Security框架入门

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配...

    一点博客
  • 补习系列(20)-大话WebSocket与"尬聊"的实现

    这些场景,都需要 服务器能主动实时的给浏览器或客户端推送消息,注意关键词是主动,还有实时!而在HTML5一统江湖之前,由于HTTP在推送场景下的"薄弱",我们需...

    美码师
  • Command mvn jetty:run

       You should generate a web project with maven first. 

    Hongten
  • 学习WebSocket

    这些场景,都需要 服务器能主动实时的给浏览器或客户端推送消息,注意关键词是主动,还有实时!而在HTML5一统江湖之前,由于HTTP在推送场景下的"薄弱",我们需...

    Java3y
  • maven项目配置框架

    任何一个maven项目都会继承一个默认的父pom配置:Super POM,详见:https://maven.apache.org/guides/introduc...

    2Simple
  • 自定义maven项目结构-maven archtype

    背景 经常使用同一套类似的工程结构,就想着能不能自动构建,不用每次都进行工程结构的拷贝,另外呢也是想建立一套项目工程结构的规范,运用技术代替人工

    shengjk1

扫码关注云+社区

领取腾讯云代金券