Maven构建

Maven 构建


maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。
maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性,利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。
 
 

0x01 maven的核心概念介绍

(1)Pom

  • pom是指project object Model。pom是一个xml,在maven里为pom.xml。是maven工作的基础,在执行task或者goal时,maven会去项目根目录下读取pom.xml获得需要的配置信息
  • pom文件中包含了项目的信息和maven build项目所需的配置信息,通常有项目信息(如版本、成员)、项目的依赖、插件和goal、build选项等等
  • pom是可以继承的,通常对于一个大型的项目或是多个module的情况,子模块的pom需要指定父模块的pom
project     pom文件的顶级元素
modelVersion    所使用的object model版本,为了确保稳定的使用,这个元素是强制性的。除非maven开发者升级模板,否则不需要修改
groupId     是项目创建团体或组织的唯一标志符,通常是域名倒写,如groupId  org.apache.maven.plugins就是为所有maven插件预留的
artifactId     是项目artifact唯一的基地址名
packaging     artifact打包的方式,如jar、war、ear等等。默认为jar。这个不仅表示项目最终产生何种后缀的文件,也表示build过程使用什么样的lifecycle。
version     artifact的版本,通常能看见为类似0.0.1-SNAPSHOT,其中SNAPSHOT表示项目开发中,为开发版本
name     表示项目的展现名,在maven生成的文档中使用
url    表示项目的地址,在maven生成的文档中使用
description     表示项目的描述,在maven生成的文档中使用
dependencies     表示依赖,在子节点dependencies中添加具体依赖的groupId artifactId和version
build     表示build配置
parent     表示父pom

(2) Artifact

    项目生成结果的唯一标志,大致说就是一个项目将要产生的文件,可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId:artifactId:version组成的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中。

(3) Repositories

Repositories是用来存储Artifact的。如果说我们的项目产生的Artifact是一个个小工具,那么Repositories就是一个仓库,里面有我们自己创建的工具,也可以储存别人造的工具,我们在项目中需要使用某种工具时,在pom中声明dependency,编译代码时就会根据dependency去下载工具(Artifact),供自己使用。
对于自己的项目完成后可以通过mvn install命令将项目放到仓库(Repositories)中
仓库分为本地仓库和远程仓库,远程仓库是指远程服务器上用于存储Artifact的仓库,本地仓库是指本机存储Artifact的仓库,对于windows机器本地仓库地址为系统用户的.m2/repository下面。
对于需要的依赖,在pom中添加dependency即可,可以在maven的仓库中搜索:http://mvnrepository.com/
 

(4) Build Lifecycle

是指一个项目build的过程。maven的Build Lifecycle分为三种,分别为default(处理项目的部署)、clean(处理项目的清理)、site(处理项目的文档生成)。他们都包含不同的lifecycle。
Build Lifecycle是由phases构成的,下面重点介绍default Build Lifecycle几个重要的phase(并没有列出所有)
validate     验证项目是否正确以及必须的信息是否可用
compile     编译源代码
test     测试编译后的代码,即执行单元测试代码
package     打包编译后的代码,在target目录下生成package文件
integration-test     处理package以便需要时可以部署到集成测试环境
verify     检验package是否有效并且达到质量标准
install     安装package到本地仓库,方便本地其它项目使用
deploy     部署,拷贝最终的package到远程仓库和替他开发这或项目共享,在集成或发布环境完成

(5)配置自定义的源库

<!-- SF nexus repository-->
<repositories>
<repository>
<id>nexusMirros</id>
<name>sf nexus mirros</name>
<url>http://nexus.sf-express.com:8080/nexus/content/groups/public/</url>
</repository>
</repositories>

 

0x02 maven 用法

Archetype

maven创建项目是根据Archetype(原型)创建的。 我们可以根据项目类型的需要使用不同的Archetype创建项目。通过Archetype我们可以快速标准的创建项目。利用Archetype创建完项目后都有标准的文件夹目录结构。
 

(1) quick start工程

创建一个简单的quick start项目,指定 -DarchetypeArtifactId为maven-archetype-quickstart,如下命令
mvn archetype:generate -DgroupId=com.okayjam.maven.test -DartifactId=maven-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
其中DgroupId指定groupId,DartifactId指定artifactId,DarchetypeArtifactId指定ArchetypeId,DinteractiveMode表示是否使用交互模式,交互模式会让用户填写版本信息之类的,非交互模式采用默认值。
编译 mvn compile,打包 mvn package,此时target目录下会出现maven-quickstart-1.0-SNAPSHOT.jar文件,即为打包后文件。
打包并安装到本地仓库 mvn install,此时本机仓库会新增maven-quickstart-1.0-SNAPSHOT.jar文件。
一个简单的maven项目,目录结构如下:
 
 
 

(2 ) web工程

创建一个简单的web项目,只需要修 -DarchetypeArtifactId为maven-archetype-webapp即可,如下命令
mvn archetype:generate -DgroupId=com.okayjam.maven.web.test -DartifactId=maven-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

其他:

src\main\resources文件夹是用来存放资源文件的,maven工程默认没有resources文件夹,如果我们需要用到类似log4j.properties这样的配置文件,就需要在src\main文件夹下新建resources文件夹,并将log4j.properties放入其中。test需要用到资源文件,类似放到src\test下
 

0x03 插件

 
配置在pom.xml的位置
<build>
<plugins>
<plugin>too1 </plugin>
<plugin>too2 </plugin>
</plugins>
</build>

1.maven-compiler-plugin

主要指定变异插件的版本,编译的目标版本和编码,还可以指定编译的参数,可以看官方文档代码
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>

2.maven-resources-plugin

作用:用于将项目的资源拷贝到输出目录中。有两种资源:main resources 和 test resources,区别在于main资源是和程序主代码相关的,而test资源是与测试代码相关的。
典型配置,指定版本和编码
<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

默认情况下,Maven会从项目的src/main/resources目录下查找资源。如果你的资源不在此目录下,可以用<resources>标签指定,同时也支持多个目录。

<resources>
        <resource>
                <directory>src/main/resources</directory>
        </resource>
        <resource>
        <directory>src/main/resources2</directory>
    </resource>
</resources>

 

3.maven-assembly-plugin

作用:主要用来将项目的输出文件与项目依赖的jar包,模块,网站文档以及其他文件集中到一个单独的压缩文件中,比如tar.gz,zip等。
常用配置方式
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.sf.Main</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- 指定在打包节点执行jar包合并操作 -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
其中mainClass指定了主类main入口,可以直接使用java -jar xxx 命令直接运行。
不过,如果项目中用到Spring Framework,用这种方式打出来的包运行时会出错。
可以使用maven-jar-plugin和maven-dependency-plugin插件打包
<build>
    <plugins>
        <!-- for car: mvn package -DskipTests -->

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.sf.sky.core.mqtt.mqtt_send.real_client</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 

4.jetty-maven-plugin

对于web项目,我们需要容器运行项目,例如Tomcat和jetty,jetty比较简单,灵活,适合长连接场景,tomcat适合多连接并且短的场景。
jetty9插件配置
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.11.v20180605</version>
<configuration>
<httpConnector>
<port>8081</port><!--端口配置,默认8080-->
</httpConnector>
<!--自动热部署,默认automatic,手动manual-->
<reload>automatic</reload>
<!--与reload相关,默认值是 0。单位为秒。表示文件更改检查时间-->
<scanIntervalSeconds>2</scanIntervalSeconds>
</configuration>
</plugin>
reload 的可选值 :[automatic|manual]
启动方式(也可以在idea里点击运行),运行成功浏览器访问 localhost:8081 即可访问
mvn jetty:run
跳过test 打包
mvn package -DskipTests

 

 
 
 
 
 
欢迎关注我的公众号:只说一点点点点
 
 
 
 

发表回复

您的电子邮箱地址不会被公开。

粤ICP备17041560号-2