扯扯maven的蛋

 

一样是放在有道云笔记里,各类散乱加发霉,抽空来整理整理,分几个部分来扯扯maven。html

1、Maven是啥求。

Maven 为Apache 组织中的开源项目,主要服务于基于Java 平台的项目构建依赖管理项目信息管理。这样说你们又要问了,啥时构建,啥是依赖管理啊。构建提及来可简单,每一个码农都在项目中接触过。何为构建呢?编译、运行单元测试、生成文档、打包和部署等烦琐且不起眼的工做上,这就是构建。在软件项目过程当中,手动的构建会占用大量的时间以及精力,因而有人用软件的方法让这一系列工做彻底自动化,使得软件的构建能够像全自动流水线同样。java

除此以外,Maven仍是一个依赖管理工具以及项目信息管理工具。它提供了中央仓库,能帮咱们自动下载构件。在这个开源的年代里,几乎任何Java应用都会借用一些第三方的开源类库,传统的方式固然就是手动下载开源的jar包,手动导入到项目中。随着依赖的增多,版本不一致、版本冲突、依赖臃肿等问题都会接踵而来。手工解决这些问题是十分枯燥的,这时候就须要maven大展宏图了。Maven经过一个坐标系统能够准确的定位到每个构建(artifact),也就是经过一组坐标Maven可以找到任何一个Java 类库(如jar文件)。apache

Maven的坐标系统服务器

如上文所述,maven经过一个坐标系统能够准确的定位到每个构建。maven定义了这样一组规则:groupId、artifactId、version、packaging、classifier五元组来表示一个惟一的构建。app

  • groupId:定义当前maven项目隶属的实际项目。
  • artifactId:定义实际项目中的一个maven项目(模块),推荐的作法是使用实际的项目名称做为artifactId的前缀。
  • version:定义maven当前所处的版本。
  • packaging:定义maven项目的打包方式,可选的(默认为jar)
  • classifier:该元素用来帮助定义构建输出的一些附属构件,该属性不能直接定义。

Maven的安装:框架

Maven 是一个基于 Java 的工具,因此要作的第一件事情就是安装 JDK。Maven不一样版本对jdk的版本有不一样的要求,Maven 3.3 要求 JDK 1.7 或以上。eclipse

从如下网址下载 Maven 3.3.9:http://maven.apache.org/download.html,解压文件到你想要的位置来安装 Maven 3.3.9。maven

解压完成以后配置对应机器的环境变量,M2_HOME、PATH。ide

环境变量配置完成以后,打开控制台,输入mvn --version来验证maven是否安装成功。svn

 

 

2、Maven仓库

在 Maven 的术语中,仓库是一个位置(place),例如目录,能够存储全部的工程 jar 文件、library jar 文件、插件或任何其余的工程指定的文件。

Maven 仓库有三种类型:

  • 本地:Maven 本地仓库是机器上的一个文件夹,它在你第一次运行任何 maven 命令的时候建立,Maven 本地仓库默认被建立在 %USER_HOME% 目录下。
  • 中央:Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量经常使用的库。
  • 远程:若是 Maven 在中央仓库中也找不到依赖的库文件,它会中止构建过程并输出错误信息到控制台。为避免这种状况,Maven 提供了远程仓库的概念,它是开发人员本身定制仓库,包含了所须要的代码库或者其余工程中用到的 jar 文件。

 

3、Maven配置

settings.xml

maven的配置文件为settings.xml,在下面路径中能够找到这个文件,分别为:

  • $M2_HOME/conf/settings.xml:全局设置,在maven的安装目录下;
  • ${user.home}/.m2/settings.xml:用户设置,须要用户手动添加,能够将安装目录下的settings.xml文件拷贝过来修改。

通常而言,该文件不须要修改,可是在国内访问maven的中央仓库太慢了,因此最好配置mirror用于拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。

修改maven根目录下的conf文件夹中的settings.xml文件,内容以下:

<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
  </mirrors>

pom.xml

POM 表明工程对象模型。它是使用 Maven 工做时的基本组建,是一个 xml 文件。它被放在工程根目录下,文件命名为 pom.xml。

POM 包含了关于工程和各类配置细节的信息,Maven 使用这些信息构建工程。POM 也包含了目标和插件。当执行一个任务或者目标时,Maven 会查找当前目录下的 POM,从其中读取所须要的配置信息,而后执行目标。

POM举例:

<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><!--maven2.0必须是这样写,如今是maven2惟一支持的版本-->
<!-- The Basics -->
<groupId>...</groupId> <!--建立项目的组织或团体的惟一 Id,例如:org.apache.maven-->
<artifactId>...</artifactId> <!--指定工程名例如:appfuse-->
<version>...</version> <!--指定版本号-->
<packaging>...</packaging> <!--打包物的扩展名,通常有 JAR,WAR,EAR 等-->
<classifier>...</classifier> <!--projects are displayed as groupId:artifactId:packaging:classifier:version-->
<name>...</name> <!--一项目的显示名,经常使用于 Maven 生成的文档-->
<url>...</url> <!--组织的站点,经常使用于 Maven 生成的文档-->
<dependencies>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.0</version>
    <type>jar</type> <!--相应的依赖产品包形式,如jar,war-->
    <scope>test</scope>
<!--用于限制相应的依赖范围,包括如下的几种变量 
compile :默认范围,使用该依赖范围,对于编译,测试,运行三种classpath都有效。
provided:对于编译和测试classpath有效,但运行时无效。
test:测试依赖范围。
system:须要外在提供相应得元素。经过systemPath来取得.
runtime:运行时依赖范围。使用该依赖范围,对于测试和运行classpath有效,可是编译时无效。
-->
    <optional>true</optional>
    <!--dependency里面的exclusions:若是X须要A,A包含B依赖,那么X能够声明不要B依赖,只要在exclusions中声明exclusion。optional是不会install或者使用B,而exclusion是将B从依赖树中是删除。例如appfuse不想使用hibernate,可是appfuse是集成hibernate的,因此就排除掉:-->
    <exclusions>
        <exclusion>
            <groupId>org.appfuse</groupId>
            <artifactId>appfuse-hibernate</artifactId>
        </exclusion>
    </exclusions>
    </dependency>
</dependencies>
<build>
    <resource>
        <directory>src/main/plexus</directory>
        <includes>
          <include>configuration.xml</include>
        </includes>
        <excludes>
          <exclude>**/*.java</exclude>
          <exclude>**/.svn/*</exclude>
        </excludes>
    </resource>
    <!--
    includes:指定包含文件的patterns,符合样式而且在directory目录下的文件将会是包含进project的资源文件
    excludes:指定不包含在内的patterns,若是includes与excludes有冲突,那么excludes胜利,那些符合冲突样式的文件仍是不会包含进来的  
    -->    
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.0</version>
        <extensions>false</extensions>
        <inherited>true</inherited>
        <configuration>
          <classifier>test</classifier>
        </configuration>
        <dependencies>...</dependencies>
        <executions>...</executions>
        </plugin>
    </plugins> 
</build>
</project>

 

3、Maven生命周期

Maven强大的一个重要的缘由是它有一个十分完善的生命周期模型(lifecycle),这个生命周期能够从两方面来理解,第一,顾名思义,运行Maven的每一个步骤都由它来定义的,这种预约义的默认行为使得咱们使用Maven变得简单,相比而言,Ant的每一个步骤都要你手工去定义。第二,这个模型是一种标准,在不一样的项目中,使用Maven的接口是同样的,这样就不用去仔细理解每一个项目的构建了,通常状况下,mvn clean install 这样的命令是通用的。我想,必定是吸取了许多项目的经验,Maven才能定义出如此完善的模型。

Maven有三套相互独立的生命周期,请注意这里说的是“三套”,并且“相互独立”,初学者容易将Maven的生命周期当作一个总体,其实否则。这三套生命周期分别是:

  • Clean Lifecycle 在进行真正的构建以前进行一些清理工做。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

我再次强调一下它们是相互独立的,你能够仅仅调用clean来清理工做目录,仅仅调用site来生成站点。固然你也能够直接运行 mvn clean install site运行全部这三套生命周期。

知道了每套生命周期的大概用途和相互关系之后,来逐个详细看一下每套生命周期,Clean和Site相对比较简单,先解释一下。

每套生命周期都由一组阶段(Phase)组成,咱们平时在命令行输入的命令总会对应于一个特定的阶段。好比,运行mvn clean,这个的clean是Clean生命周期的一个阶段。有点绕?要知道有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

  • pre-clean  执行一些须要在clean以前完成的工做
  • clean  移除全部上一次构建生成的文件
  • post-clean  执行一些须要在clean以后马上完成的工做

mvn clean中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它以前的全部阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean,若是咱们运行 mvn post-clean,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,能够大大简化命令行的输入。

下面看一下Site生命周期的各个阶段:

  • pre-site     执行一些须要在生成站点文档以前完成的工做
  • site    生成项目的站点文档
  • post-site     执行一些须要在生成站点文档以后完成的工做,而且为部署作准备
  • site-deploy     将生成的站点文档部署到特定的服务器上

这里常常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这但是Maven至关强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。

最后,来看一下Maven的最重要的Default生命周期,绝大部分工做都发生在这个生命周期中,这里,我只解释一些比较重要和经常使用的阶段:

  • validate
  • 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
  • test     使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
  • prepare-package
  • package     接受编译好的代码,打包成可发布的格式,如 JAR
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install     将包安装至本地仓库,以让其它项目依赖。
  • deploy     将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

基本上,根据名称咱们就能猜出每一个阶段的用途,关于其它阶段的解释,请参考 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

记住,运行任何一个阶段的时候,它前面的全部阶段都会被运行,这也就是为何咱们运行mvn install的时候,代码会被编译,测试,打包。

此外,Maven的插件机制是彻底依赖Maven的生命周期的,所以理解生命周期相当重要。

4、Maven常见命令

maven常见命令以下:

mvn archetype:create :建立 Maven 项目
mvn compile :编译源代码
mvn test-compile :编译测试代码
mvn test : 运行应用程序中的单元测试
mvn site : 生成项目相关信息的网站
mvn clean :清除目标目录中的生成结果
mvn package : 依据项目生成 jar 文件
mvn install :在本地 Repository 中安装 jar
mvn eclipse:eclipse :生成 Eclipse 项目文件

5、Maven && Eclipse

 

6、Maven之乱七八糟

实验室有时候须要把某一个包安装到artifactory的内部仓库里,便于开发与部署。

当用“mvn install”命令的时候,Maven仅仅打包和安装构件到本地仓库,要把它安装到Artifactory内部仓库中,咱们须要使用deploy命令。若是直接使用deploy,可能会遇到 Error code 401, User anonymous is not permitted to deploy 的问题,缘由是你没有权限访问本地的maven库。

这时候就须要在settings.xml中添加一条额外的配置

<servers>
<server>  
<id>free4lab</id>  
<username>admin</username>
<password>password</password>  
</server>
</servers>

配置完settings.xml以后,若是直接执行deploy命令可能还会报错:Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter -> [Help 1]

这时候还须要配置对应maven工程的pom.xml文件,增长以下配置:

<!--用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置 -->
<
distributionManagement> <repository> <id>free4lab</id> <name>Free4lab Repository</name> <url>http://maven.free4lab.com/artifactory/libs-snapshot-local</url> </repository> </distributionManagement>

 

Maven项目获取classpath和资源文件路径:

在maven项目中,配置文件放在maven工程的src/main/resources资源文件夹下,java文件在src/main/java下,如何在java文件中加载配置文件。使用以下代码:

MyClass.class.getClassLoder().getResource(FILE_NAME).getPath();
相关文章
相关标签/搜索