Maven基础教程之使用入门

这又是一个系列,一个要把Maven讲透的系列,但愿可以对你们有帮助!

前言

说到Maven的入门使用,实际上是特别简单的,若是只是说就是能使用,会使用Maven,也许只要短短的一两个小时就OK了,不须要去理解Maven的那些概念,而这篇文章就是要教会你会使用Maven,而整个系列则是要让你明白整个Maven。这篇文章就是如此,仅仅就是告诉你怎么用Maven,仅此而已,会用是学习整个系列的前提。html

编写POM

就像composer的composer.json、Make的makefile文件同样,Maven项目的核心是pom.xml文件。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。java

如今咱们不借助任何其它命令和IDE,来建立一个Maven项目。apache

首先,编写pom.xml文件。仍是按照老规矩,从一个Hello World项目进行演示。如下就是建立项目的POM文件。json

<?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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.jellythink.HelloWorld</groupId>
  <artifactId>hello-world</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>hello-world</name>
  
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project>

对于POM文件,如今细说一下。微信

  • 代码的第一行是XML头,指定了该xml文档的版本和编码方式。紧接着是project元素,project是全部pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素;
  • 根元素下的第一个子元素modelVersion指定了当前POM模型的版本,对于Maven 2和Maven 3来讲,它只能是4.0.0;
  • 接下来就是groupIdartifactIdversion了,这三个是上述代码三个元素。这三个元素定义了一个项目的基本坐标,在Maven的世界里,全部的jar和war都是基于坐标进行区分的,会面的文章还会细说坐标;
  • groupId定义了项目属于哪一个组,这个组每每和项目所在的组织或公司存在关联,通常是使用组织或公司的域名;好比上面的groupIdcom.jellythink.HelloWorld,其中com.jellythink就是个人网站域名倒过来写的,而HelloWorld则是整个项目的名称;
  • artifactId定义了当前Maven项目在组中惟一的ID,通常一个大项目组下面可能会包含多个子项目或子模块,而这个artifactId就是子项目或者子模块的名称;
  • version指定了这个项目当前的版本,后面的文章还会细说Maven中版本的含义;
  • name元素声明了一个对于用户更为友好的项目名称,方便后期的管理;
  • properties指定了Maven的一些重要属性,后续还会重点说这个属性的一些配置。

建立完pom.xml文件后,接下来就是建立代码文件了。在Maven中,有这样的一个约定,项目主代码都位于src/main/java目录,项目测试代码都位于src/test/java目录;接下来咱们先按照这个约定分别建立目录,而后在代码目录建立com/jellythink/HelloWorld/App.java文件;在测试目录建立com/jellythink/HelloWorld/AppTest.java文件。app

仍是老规矩,咱们在App.java中打印Hello World!,代码以下:composer

public class App {
    public String sayHello() {
        return "Hello World";
    }

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

同理,对于AppTest.java中编写如下单元测试代码:maven

public class AppTest {
    @Test
    public void testSayHello() {
        App app = new App();
        String result = app.sayHello();
        assertEquals("Hello World", result);
    }
}

在Java中,咱们进行单元测试时,基本上都是使用的JUnit,要使用JUnit这个包,咱们就须要引入这个依赖包,此时,咱们就须要在pom.xml中添加如下依赖内容:单元测试

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

代码中添加了dependencies元素,该元素下能够包含多个dependency元素以声明项目的依赖。前面也说过,groupIdartifactIdversion是任何一个Maven项目最基本的坐标,JUnit也不例外;scope表示依赖范围,后续的文章还会细说这个依赖和测试相关的内容。学习

编译和测试

万事俱备,只欠东风。接下来咱们编译和测试。

搞定代码后,使用Maven进行编译,在项目根目录下运行mvn clean compile命令。执行输出以下图所示:

mvn clean compile

clean告诉Maven清理输出目录target,compile告诉Maven编译项目主代码。从输出中看到Maven首先执行了clean:clean任务,删除target目录。默认状况下,Maven构建的全部输出都在target目录中;接着执行resources:resources任务;最后执行compiler:compile任务,将项目主代码编译至target/classes目录。

上面说到的clean:cleanresources:resourcescompiler:compile都对应了Maven的生命周期及插件,这个在后面还会有专题文章细说。

编译完成后,咱们通常都会运行测试代码进行单元测试,虽然不少状况下,咱们并无这么作,可是我仍是建议你们经过Maven作一些自动化的单元测试。

测试用例编写完毕以后就能够调用Maven执行测试,运行mvn clean test命令,输出以下:

mvn clean test

从输出能够看到,Maven依次执行了clean:cleanresources:resourcescompiler:compileresources:testResourcescompiler:testCompilesurefire:test。现阶段,咱们须要明白这是Maven的生命周期的一个特性,这个生命周期后续还会细说。

到此,编译和测试均经过了,接着咱们进行应用打包和运行。

打包和运行

打包就是将咱们编写的应用打成JAR包或者WAR包。在咱们的HelloWorld示例程序POM中,并无指定打包类型,Maven则默认打包成JAR包。咱们执行mvn clean package命令就能够完成打包。mvn clean package命令的输出以下:

mvnCleanPackage.png

能够看到,Maven在打包以前会执行编译、测试等操做,最后经过jar:jar任务负责打包。实际上就是jar插件的jar目标将项目主代码打包成一个名为hello-world-1.0-SNAPSHOT.jar的文件,这个最终生成的包会保存在target目录下,它是根据artifact-version.jar规则进行命名的;固然了,咱们可使用finalName属性来自定义该文件的名称。

到如今,咱们获得了这个JAR包,若是别的项目要引用这个JAR包时,咱们将这个JAR包复制到其它项目的classpath中就OK了。可是这样拷贝就违背了咱们当初想要自动解决依赖的问题,因此如何才能让其它的Maven项目直接引用这个JAR包呢?咱们须要执行mvn clean install命令。

mvnCleanInstall.png

从输出能够看到,在打包以后,又执行了安装任务install:install,最后将项目输出的JAR包安装到了Maven本地仓库中,咱们能够在本地的仓库文件夹中能看到这个示例项目的pom和jar包。

到目前为止,经过这个示例项目体验了mvn clean compilemvn clean testmvn clean packagemvn clean install。执行test以前会先执行compile的,执行package以前会先执行test的,而相似地,install以前会执行package。咱们能够在任何一个Maven项目中执行这些命令。

最后,不要忘了,咱们生成的JAR包是有main方法的,也就是说这个JAR包是能够单独运行的;可是,因为带有main方法的类信息没有添加到manifest中,因此默认打包生成的jar是不可以直接运行的(使用jd-gui打开jar文件中的META-INF/MANIFEST.MF文件,将没法看到Main-Class一行)。为了生成可执行jar文件,须要借助Apache Maven Shade Plugin来完成,咱们须要在pom.xml文件中如下插件配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>com.jellythink.HelloWorld.App</mainClass>
                        </transformer>
                    </transformers>
                </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

接下来,咱们再执行mvn clean install命令,待构建完成以后在target目录下能够看到hello-world-1.0-SNAPSHOT.jar和original-hello-world-1.0-SNAPSHOT.jar,前面的是带有Main-Class信息的可运行jar,后者是原始的jar。咱们执行如下命令:

java -jar hello-world-1.0-SNAPSHOT.jar

就能够正常执行。

使用Archetype生成项目骨架

上面很是详细的总结了如何全手动的建立一个Maven工程。经过上面的总结,咱们大致能够总结如下几步:

  • 在项目根目录建立pom.xml文件;
  • 建立src/main/java目录,并在该目录开发项目主代码;
  • 建立src/test/java目录,并在该目录开发项目测试代码;

上面的三步咱们成为Maven项目的骨架,也就是如今常说的“脚手架”。若是咱们每建立一个Maven项目都须要把上面的步骤执行一次,确实很麻烦,那怎么办?程序就是解放人工的,让人来偷懒的。因此,在Maven中,咱们能够经过Archetype生成项目骨架,将上面的步骤流程化。好比,如今咱们要建立一个Maven项目,咱们只须要输入如下命令就OK了。

mvn archetype:generate

执行这个命令后,后看到不少输出,有不少可用的Archetype供咱们选择,每个Archetype前面都会对应有一个编号,咱们根据咱们的须要,选择咱们对应的骨架来建立项目就行了。而后再按照提示,输出新项目的groupId、artifactId、version和包名package,一个Maven项目就建立成功了。

咱们在运行mvn archetype:generate时,其实是在运行maven-archetype-plugin插件。

总结

到此,这篇关于Maven的初级入门文章就到此总结完毕,这篇文章的知识点比较多,并且还很杂,若是看的有点不是很懂,也没有关系,后续的文章都会对这些你不懂的地方,你不熟悉的地方在进行深刻的剖析和总结。固然了,也但愿你们能经过这篇文章对Maven的使用有一个总体的认识,至少没有后续的文章,经过这篇文章,你也应该知道怎么使用Maven了,不是吗?

这一晚上,深深的自责中......

果冻想,认真玩技术的地方。

2019年4月1日,于内蒙古呼和浩特。


微信扫码关注公众号

相关文章
相关标签/搜索