Maven 开 发 规 范

Maven 开 发 规 范


转自:http://blog.csdn.net/gaoqiao1988/article/details/52620376

目   录

1.Maven简介... 4

1.1什么是 Maven?... 4

1.2 Maven 能够帮助我们干什么?... 4

2.Maven深入了解... 5

2.1 Maven 概念模型... 5

2.2 Pom全景图... 5

2.3 Maven中pom.xml关键词... 6

2.4 Maven 常见命令... 10

2.5 Maven的默认生命周期... 11

2.6 Maven 标准目录结构... 13

2.7 Maven依赖查询... 15

2.8 Maven中/.m2/settings.xm配置介绍... 16

3 使用Nexus搭建Maven私服... 17

3.1私服简介... 17

3.2 使用Nexus搭建私服... 18

3.3 项目私服配置... 26

 

 

 

 

 

 

 

 

 

 

 

1.Maven简介

1.1什么是 Maven?

Maven是Apache的一个顶级的项目:http://maven.apache.org/

Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最早在JakataTurbine项目中它被用来简化项目的构建过程。当时有很多项目,它们的Ant build文件仅有细微的差别,而JAR文件都由CVS来维护。于是Maven创始者开始了Maven这个项目,该项目的清晰定义包括,一种很方便的发布 项目信息的方式,以及一种在多个项目中共享JAR的方式。

Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。

Maven 包含一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。

此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。

 

1.2 Maven能够帮助我们干什么?

简言之,Maven 可以帮助我们完成以下工作:

  • 项目构建
  • 文档管理
  • 生成测试报告
  • 解决项目间依赖项
  • 源代码版本管理
  • 项目Releases
  • 项目的分发

 

 

 

2.Maven深入了解

2.1 Maven概念模型

2.2 Pom全景图

2.3 Maven中pom.xml关键词

  • Project:
    • 任何你想 build 的事物,Maven都会把它们当作是一个 Project。
    • 这些 Project 被定义为 POM(Project Object Model)。
    • 一个 Project 可以依赖其他的project,一个 project 也可以有多个子project组成。
  • POM:
    • POM(pom.xml) 是 Maven 的核心文件,它是指示 Maven 如何工作的元数据文件,类似 ant 的 build.xml 文件。
    • pom.xml 文件应该位于每个 Project 的根目录。
  • GroupId:
    • 公司名或组织名。
  • ArtifactId:
    • 构建出来的文件名,一般来说,这个也是project名。
  • Packaging:
    • 项目打包的类型,可以是将jar、war、rar、ear、pom。
  • Version:
    • 项目的版本,项目的唯一标识由 groupId+artifactId+packaging+versionz 组成。
  • Dependency:
    • 为了能够 build 或运行,一个典型的java project会依赖其他的包,在Maven中,这些被依赖的包就被称为 dependency。
  • Plugin:
    • Maven是有插件组织的,它的每一个功能都是由插件提供的,主要的插件是由 java 来写的,但是他也支持 beanshell 和 ant 脚本编写的插件。
  • Repository:
    • 仓库用来存放artifact的,可以是本地仓库,也可以是远程仓库,Maven是由一个默认的仓库.
    • 本地仓库在setting.xml中的<localRepository>中设置
  • Snapshot:
    • 工程中可以(也应该)有这样一个特殊的版本:这个版本可以告诉Maven,该工程正在处于开发阶段,会经常更新(但还为发布)。当其他工程依赖此类型的artifact时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版本。

Tips: groupId,artifactId和version这三个元素定义了一个项目的基本坐标,在Maven项目中,任何jar,pom或war都是以基于这些基本坐标进行区分的。

 

 

 

补充:1、建议在parent的pom中使用好pluginManagement和dependencyManagement,而子项目引用即可;

2、使用参数,方便管理版本和重要参数;

3、明显不用的dependency要exclude掉(使用exclusion),避免过多垃圾;

4、合理设置子项目 

pluginManagement是表示插件声明,即在项目中的pluginManagement下声明了插件,maven不会加载该插件,pluginManagement声明可以被继承。

pluginManagement的一个使用案例是当有父子项目的时候,父项目中可以利用pluginManagement声明子项目中需要用到的插件, 之后,当某个或者某几个子项目需要加载该插件的时候,就可以在子项目中plugins节点只配置 groupId 和 artifactId就可以完成插 件的引用。

pluginManagement主要是为了统一管理插件,确保所有子项目使用的插件版本保持一致,类似的还有dependencies和dependencyManagement。

2.3.1 pom中依赖配置

       <dependency>

                <groupId></groupId>

                <artifactId></artifactId>

                <version></version>

                <classifier></classifier>

                <systemPath></systemPath>

                <scope></scope>---------------依赖范围

                <type></type>-----------------依赖的类型

                <optional></optional>---------标记依赖是否可选

                <exclusions></exclusions>-----排除传递依赖
        </dependency>

 

pom.xml中简写:

        <dependency>

                <groupId>org.springframework</groupId>

                <artifactId>spring-context-support</artifactId>

                <version>3.2.10.RELEASE</version>

        </dependency>

 

pom 依赖调解原则:①第一原则,路径近者优先原则

                ②第二原则,第一声明者优先原则

2.3.2 pom中使用第三方仓库

<distributionManagement>

    <repository>

        <id>releases</id>

        <url>http://182.92.3.15:8081/nexus/content/repositories/releases</url>

    </repository>

    <snapshotRepository>

        <id>snapshots</id>

        <url>http://182.92.3.15:8081/nexus/content/repositories/snapshots</url>

    </snapshotRepository>

</distributionManagement>

 

 

 

 

2.3.3 编译Java代码插件

        <plugin>

            <artifactId>maven-compiler-plugin</artifactId>

            <version>3.1</version>

            <configuration>

                <source>1.6</source>

                <target>1.6</target>

                <encoding>UTF-8</encoding>

            </configuration>

        </plugin>

 

 

 

 

2.3.4处理资源文件插件

        <plugin>

            <artifactId>maven-resources-plugin</artifactId>

            <version>2.6</version>

            <configuration>

                <encoding>UTF-8</encoding>

            </configuration>

        </plugin>

 

 

2.3.5 源码打包插件

        <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-source-plugin</artifactId>

            <version>2.2.1</version>

            <executions>

                <execution>

                    <id>attach-sources</id>

                    <phase>verify</phase>

                    <goals>

                        <goal>jar-no-fork</goal>

                    </goals>

                </execution>

            </executions>

        </plugin>

 

 

2.3.6 生成javadoc文档包的插件

        <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-javadoc-plugin</artifactId>

            <version>2.8</version>

            <configuration>

                <outputDirectory>target\javadoc</outputDirectory>

                <reportOutputDirectory>target\javadoc</reportOutputDirectory>

                <encoding>UTF-8</encoding>

            </configuration>

        </plugin>

 

 

 

2.3.7 测试插件

    <plugin>

        <groupId>org.apache.maven.plugins</groupId>

        <artifactId>maven-surefire-plugin</artifactId>

        <version>2.7.2</version>

        <configuration>

            <skip>true</skip>

        </configuration>

    </plugin>

2.3.8 Tomcat插件

    <plugin>

        <groupId>org.apache.tomcat.maven</groupId>

            <artifactId>tomcat7-maven-plugin</artifactId>

            <version>2.1</version>

    </plugin>

 

2.3.9 一些比较常用的插件(Maven仓库搜索引擎:http://search.maven.org/ )

①maven-archetype-plugin

使用交互式的方式提示用户输入必要的信息以创建项目, 如由一个产品需要交付给很多客户进行二次开发,你就可以为他们提供一个Archtype,帮助他们快速上手。

http://maven.apache.org/archetype/maven-archetype-plugin/

 

②maven-assembly-plugin

制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。

http://maven.apache.org/plugins/maven-assembly-plugin/

 

③maven-dependency-plugin

帮助分析项目依赖

http://maven.apache.org/plugins/maven-dependency-plugin/

 

④maven-enforcer-plugin

创建一系列规则强制遵守,设定Java版本、设定Maven版本、禁止某些依赖、禁止SNAPSHOT依赖。只要在一个父POM配置规则,然后让大家继承,当规则遭到破坏的时候,Maven就会报。除了标准的规则之外,还可以扩展该插件,编写自己的规则。有助于保持项目构建稳定

http://maven.apache.org/plugins/maven-enforcer-plugin/

 

⑤maven-help-plugin

一个小巧的辅助工具, help:system可以打印所有可用的环境变量和Java系统属性。help:effective-pomhelp:effective-settings,它们分别打印项目的有效POM和有效settings, maven-help-plugin的describe目标可以帮助你描述任何一个Maven插件的信息.

http://maven.apache.org/plugins/maven-help-plugin/

 

⑥versions-maven-plugin

命令 mvn versions:set -DnewVersion=1.1-SNAPSHOT 就能把所有模块的版本更新到1.1-SNAPSHOT。display-dependency-updates能知道项目依赖有哪些可用的更新;类似的display-plugin-updates能知道可用的插件更新;然后use- latest-versions能自动将所有依赖升级到最新版本。最后,可以使用 mvn versions:commit 提交,满意的话也可以使用 mvn versions:revert 进行撤销。

http://mojo.codehaus.org/versions-maven-plugin/

2.4 Maven常见命令

 

mvn archetype:create

创建Maven项目

mvn compile

编译源代码

mvn test-compile

编译测试源代码

mvn test

运行应用程序中的单元测试

mvn install

在本地Respository中安装jar

mvn eclipse:eclipse

生成eclipse项目文件

mvn idea:idea

生成idea项目

mvn jetty:run

启动jetty服务

mvn tomcat:run

启动tomcat服务

mvn clean

清除项目目录中的生成结果

mvn site

生成项目相关信息的网站

mvn package

根据项目生成的jar

mvn deploy

根据项目发布到私服

mvn clean package -Dmaven.test.skip=true

清除以前的包后重新打包,跳过测试类

mvn -X compile dependency:

    tree -Dverbose >a.log

检查Jar包版本冲突, a.log文件里查找 是否有"omitted for conflict with",如果有,则表示jar包有版本冲突

 

 

 

 

 

2.5 Maven的默认生命周期

  

Default Lifecycle

生命周期阶段

描述

第一套生命周期: Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

pre-clean

执行项目清理前所需要的工作。

clean

清理上一次build项目生成的文件。

post-clean

执行完成项目清理所需的工作。

第二套生命周期: Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

validate

验证

确保当前配置和 POM 的内容是有效的。这包含对 pom.xml 文件树的验证。

initialize

初始化

在执行构建生命周期的主任务之前可以进行初始化。

generate-sources

生成源码

代码生成器可以开始生成在以后阶段中处理或编译的源代码。

process-sources

处理源码

提供解析、修改和转换源码。常规源码和生成的源码都可以在这里处理。

generate-resources

生成资源

生成非源码资源。通常包括元数据文件和配置文件。

process-resources

处理资源

处理非源码资源。修改、转换和重定位资源都能在这阶段发生。

compile

编译

编译源码。编译过的类被放到目标目录树中。

process-classes

处理类

处理类文件转换和增强步骤。字节码交织器和常用工具常在这一阶段操作。

generate-test-sources

生成测试源码

为编译内容生成测试源代码。

process-test-sources

处理测试源码

在编译前对测试源码执行任何必要的处理。在这一阶段,可以修改、转换或复制源代码。

generate-test-resources

生成测试资源

允许生成与测试相关的(非源码)资源。

process-test-resources

处理测试资源

可以处理、转换和重新定位与测试相关的资源。

test-compile

测试编译

编译单元测试的源码。

process-test-classes

对测试编译生成的文件做后期处理(需Maven2.0.5及以上)

test

测试

运行编译过的单元测试并累计结果。

prepare-package

执行打包前的所有操作(需Maven2.1及以上)

package

打包

将可执行的二进制文件打包到一个分布式归档文件中,如 JAR 或 WAR。

pre-integration-test

前集成测试

准备集成测试。这种情况下的集成测试是指在一个受到一定控制的模拟的真
实部署环境中测试代码。这一步能将归档文件部署到一个服务器上执行。

integration-test

集成测试

执行真正的集成测试。

post-integration-test

后集成测试

解除集成测试准备。这一步涉及测试环境重置或重新初始化。

verify

检验

检验可部署归档的有效性和完整性。过了这个阶段,将安装该归档。

install

安装

将该归档添加到本地 Maven 目录。这一步让其他可能依赖该归档的模块可以使用它。

deploy

部署

将该归档添加到远程 Maven 目录。这一步让这个工件能为更多的人所用。

第三套生命周期: Site Lifecycle 生成项目报告,站点,发布站点。

pre-site

执行一些生成项目站点文档前的准备工作。

site

生成项目站点的文档。

post-site

执行需完成站点生成的工作,如站点部署的准备工作。

site-deploy

向制定的web服务器部署站点生成文件。

 

Tips: ①Maven有三套相互独立的生命周期

         ②运行任何一个阶段的时候,它前面的所有阶段都会被运行

 

 

2.6 Maven标准目录结构

好的目录结构可以 使开发人员更容易理解项目,为以后的维护工作也打下良好的基础。Maven2根据业界公认的最佳目录结构,为开发者提供了缺省的标准目录模板。Maven2的标准目录结构如下:

 

src/main/java

源码目录

src/main/resources

主资源目录

src/main/filters

资源过滤文件目录

src/main/assembly

Assembly descriptors

src/main/config

配置文件目录根

src/main/scripts

Application/Library scripts

src/main/webapp

Web资源目录(jsp,js,css)

src/test/java

测试代码目录

src/test/resources

测试所需资源目录

src/test/filters

测试资源过滤文件目录

src/site

与site相关的资源目录

LICENSE.txt

Project's license

NOTICE.txt

Notices and attributions required by libraries that the project depends on

README.txt

Project's readme

使用目录模板,可以使 pom.xml 更简洁。因为 Maven2 已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以 resources 目录为例:

  • src/main/resources,负责管理项目主体的资源。在使用Maven2执行compile之后,这个目录中的所有文件及子目录,会复制到target/classes目录中,为以后的打包提供了方便。
  • src/test/resources,负责管理项目测试的资源。在使用Maven2执行test-compile之后,这个目录中的所有文件及子目录,会复制到target/test-classes目录中,为后续的测试做好了准备。

这些动作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>来完成的。如今,完全不需要在pom.xml中指定就能够自动完成。在src和 test都使用resources,方便构建和测试,这种方式本就已是前人的经验。通过使用Maven2,使这个经验在开发团队中得到普及。

创建标准目录模板,可以通过如下命令:

mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons

groupId和artifactId的含义与Maven1中的含义一样,参数artifactId的值会作为项目根目录的名字。除了建立相应的目录之外,Maven2还会创建缺省的pom.xml。

Maven2也考虑到:不同类型的项目需要拥有不同的目录结构。如创建web项目,可以使用命令:

mvn archetype:create -DgroupId=com.mycompany.app

-DartifactId=my-webapp

-DarchetypeArtifactId=maven-archetype-webapp

 

Tips:新版本中archetype:create命令已经过期,需要使用archetype:generate来进行替换

2.7 Maven依赖查询

查询地址:http://mvnrepository.com

可以通过该网站查询所需要的依赖包格式

 

 

2.8 Maven中/.m2/settings.xm配置介绍

  • localRepository:自定义本地库路径,默认在/.m2中
  • interactiveMode:
  • offline:是否每次编译都去查找远程中心库
  • pluginGroups:插件组,例如:org.mortbay.jetty
  • proxies:通过代理访问外部库
  • servers:集成认证服务
  • mirrors:镜像库,可以指定内部中心库
  • profiles:个性配置,需要在Activation标签中激活
  • activeProfiles:表示激活的profile

 

 

 

 

 

 

 

 

 

 

 

 

3 使用Nexus搭建Maven私服

3.1私服简介

私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。

我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache Archiva,Artifactory,Sonatype Nexus。这里我们使用 Sonatype Nexus。

 

 

 

 

 

 

 

3.2 使用Nexus搭建私服

3.2.1下载Nexus

Nexus 专业版是需要付费的,这里我们下载开源版 Nexus OSS。Nexus 提供两种安装包,一种是包含 Jetty 容器的 bundle 包,另一种是不包含容器的 war 包。下载地址:http://www.sonatype.org/nexus/go

 

3.2.2 安装Nexus

解压安装包nexus-3.0.1-01-win64.zip

修改数据存储路径,文件目录:bin/nexus.vmoptions

 

进入etc/org.sonatype.nexus.cfg进行修改IP、端口, 访问根目录

修改完相关配置文件后,打开命令提示符:cmd,进入/nexus-3.0.1-01/bin目录,命令:

执行 nexus.exe /run

 

打开浏览器,访问:http://localhost:8081/nexuz-zip/

点击右上角 Sign in,使用默认用户名:admin ,密码:admin123 登录,

创建用户

3.2.3 Nexus预置的仓库

创建maven仓库

pepositories说明

maven-central:maven中央库,默认从https://repo1.maven.org/maven2/拉取jar

maven-releases:私库发行版jar

maven-snapshots:私库快照(调试版本)jar

maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。

点击左侧 Repositories 链接,查看 Nexus 内置的仓库:

Nexus 的仓库分类:

· hosted 宿主仓库:主要用于部署无法从公共仓库获取的构件(如 Oracle 的 JDBC 驱动)以及自己或第三方的项目构件;

· proxy 代理仓库:代理公共的远程仓库;

· virtual 虚拟仓库:用于适配 Maven 1;

·group 仓库组:Nexus 通过仓库组的概念统一管理多个仓库,这样我们在项目中直接请求仓库组即可请求到仓库组管理的多个仓库。

 

3.2.4 添加宿主仓库- hosted repository

仓库创建完毕

Tips: 配置hosted repository时,一般会配置3个hosted repository,分别是3rd party、Snapshots、Releases,分别用来保存第三方jar,项目组内部的快照、项目组内部的发布版

只是Deployment Policy这个选项,一般Snapshots会配置成允许,而Releases和3rd party会设置为禁止

 

配置proxy repository 

代理中央Maven仓库,当PC访问中央库的时候,先通过Proxy下载到Nexus仓库,然后再从Nexus仓库下载到PC本地。这样的优势只要其中一个人从中央库下来了,以后大家都是从Nexus私服上进行下来,私服一般部署在内网,这样大大节约的宽带。

Remote Storage: 代理的地址,Maven地址为:https://repo1.maven.org/maven2/

开源中国仓库地址:http://maven.oschina.net/content/groups/public/

Tips: 如果出现某些Maven插件找不到依赖的库的问题,请修改代理地址,Maven3启动了新的中央仓库: http://repo.maven.apache.org/maven2/

 

原先Nexus安装好时已经自动创建了一个代理仓库,可以直接通过搜索栏搜索到自己想找的项目

配置group repository 

group其实是一个虚拟的仓库,通过对实体仓库(proxyhosted)进行聚合,对外暴露一个统一的地址 ,需要将选中的仓库纳入组内才可进行管理

此时已经可以看到纳入的仓库中的内容

需要在maven文件夹下.m2/settings.xml中新增配置,可以将内部仓库设置成镜像仓库

 

3.2.5 配置Maven使用私服

私服搭建成功,我们就可以配置 Maven 使用私服,以后下载构件、部署构件,都通过私服来管理。

在 settings.xml 文件中,为所有仓库配置一个镜像仓库,镜像仓库的地址即私服的地址:

项目中需要配备地址:

maven的setting文件中需要配备授权仓库的帐户与访问地址:

Tips:id需要配置相同

Tips:如果为Snapshots 时,需要在发布的项目版本后追加,如果为Release,则不需要追加,即可发布项目-命令:deploy -e

项目发布完成后可以在私服管理页面查看


你可能感兴趣的:(Maven 开 发 规 范)