Maven常用知识总结

Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。

使用maven构建的javaweb项目的结构

  • src
    • main
      • java
        • package
    • test
      • java
        • package
    • resource

maven常用的一些命令

  • mvn -v : 查看mvn的版本
  • mvn compile : 编译源代码
  • mvn test : 运行项目的测试用例
  • mvn package : 打包项目
  • mvn deploy : 发布项目
  • mvn clean : 删除target
  • mvn install : 安装jar包到本地仓库中
  • mvn archetype : generate : 自动建立目录骨架

Maven常见的依赖范围

  • compile : 编译依赖,默认的依赖方式。
  • test : 测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。
  • provided : 对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,一般的web工程运行时都使用容器的servlet-api。
  • runtime : 只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。
  • system : 不从maven仓库获取该jar,而是通过systemPath指定该jar的路径。
  • import : 用于一个dependencyManagement对另一个dependencyManagement的继承。

Maven的本地资源

通常情况下,maven的资源包都在.m2这个目录下,但是有的时候我们不想放在这个默认的目录下,所以就需要去修改{M2_HOME}\conf\setting.xml里的localRepository。比如:
<localRepository>/Users/cm_wang/Documents/WorkSpace/repo</localRepository>
就证明我们的资源包都在/Users/cm_wang/Documents/WorkSpace/repo这里面存储。

Maven国内镜像仓库

修改settings.xml里的mirrors标签

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

分享一个快的飞起的maven的settings.xml文件

Maven的生命周期

  • 完整的项目构建过程:清理 -> 编译 -> 测试 -> 打包 -> 集成测试 -> 验证 -> 部署。
  • Maven有以下三种标准的生命周期:
    • clean:清理项目
      • pre-clean:执行清理前的工作
      • clean:清理上一次构建生成的所有文件
      • post-clean:执行清理后的文件
    • default:构建项目
      • 是生命周期中的最核心的,阶段比较多。比如:install,compile,test等
    • site:生成项目站点
      • pre-site:在生成项目站点前需要完成的工作
      • site:生成项目的站点文档
      • post-site:在生成项目站点后要完成的工作
      • site-deploy:发布生成的站点到服务器上

Maven中的POM

  • POM代表项目对象模型。它是Maven中工作的基本单位,这是一个XML文件。它始终保存在该项目基本目录中的pom.xml文件。POM包含的项目是使用Maven来构建的,它用来包含各种配置信息。POM也包含了目标和插件。在执行任务或目标时,Maven会使用当前目录中的POM。它读取POM得到所需要的配置信息,然后执行目标。
  • 值得注意的是,每一个项目有且唯一只有一个POM文件(pom.xml)
    • 所有的 POM 文件要项目元素必须有三个必填字段: groupIdartifactIdversion
    • 在库中的项目符号是:groupId:artifactId:version
    • pom.xml 的根元素是 project,它有三个主要的子节点。
节点 描述
groupId 这是项目组的编号,这在组织或项目中通常是独一无二的。例如:com.test.xxx
artifactId 这是项目的ID。这通常是项目的名称。
version 这是项目的版本。与groupId一起使用,artifact在存储库中用于将版本彼此分离。

<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <!-- 模型版本。maven2.0必须是这样写,现在是maven2唯一支持的版本 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.winner.trade,maven会将该项目打成的jar包放本地路径:/com/winner/trade -->
    <groupId>com.winner.trade</groupId>

    <!-- 本项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    <artifactId>trade-core</artifactId>

    <!-- 本项目目前所处的版本号 -->
    <version>1.0.0-SNAPSHOT</version>

    <!-- 打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->
    <packaging>jar</packaging>

    <!-- 定义本项目的依赖关系 -->
    <dependencies>

        <!-- 每个dependency都对应这一个jar包 -->
        <dependency>

            <!--一般情况下,maven是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件, 然后引入你的工程。如果别人想引用你现在开发的这个项目(前提是已开发完毕并发布到了远程仓库),--> 
            <!--就需要在他的pom文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, maven就会把你上传的jar包下载到他的本地 -->
            <groupId>com.winner.trade</groupId>
            <artifactId>trade-test</artifactId>
            <version>1.0.0-SNAPSHOT</version>

            <!-- maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。 -->
            <!--scope包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围) -->
            <scope>test</scope>

            <!-- 设置指依赖是否可选,默认为false,即子项目默认都继承:为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似  -->
            <optional>false</optional>

            <!-- 屏蔽依赖关系。 比如项目中使用的libA依赖某个库的1.0版,libB依赖某个库的2.0版,现在想统一使用2.0版,就应该屏蔽掉对1.0版的依赖 -->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>

        </dependency>

    </dependencies>

    <!-- 为pom定义一些常量,在pom中的其它地方可以直接引用 使用方式 如下 :${file.encoding} -->
    <properties>
        <file.encoding>UTF-8</file.encoding>
        <java.source.version>1.5</java.source.version>
        <java.target.version>1.5</java.target.version>
    </properties>

    <!--使用的插件列表 。 -->
    <plugins>
        <plugin>
            <groupId></groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.5</version>

            <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 -->
            <executions>
                <execution>

                    <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
                    <id>assembly</id>

                    <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
                    <phase>package</phase>

                    <!--配置的执行目标 -->
                    <goals>
                        <goal>single</goal>
                    </goals>

                    <!--配置是否被传播到子POM -->
                    <inherited>false</inherited>

                </execution>
            </executions>

            <!--作为DOM对象的配置,配置项因插件而异 -->
            <configuration>
                <finalName>${finalName}</finalName>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptor>assembly.xml</descriptor>
            </configuration>

            <!--是否从该插件下载Maven扩展(例如打包和类型处理器), -->
            <!--由于性能原因,只有在真需要下载时,该元素才被设置成true。 -->
            <extensions>false</extensions>

            <!--项目引入插件所需要的额外依赖 -->
            <dependencies>
                <dependency>...</dependency>
            </dependencies>

            <!--任何配置是否被传播到子项目 -->
            <inherited>true</inherited>

        </plugin>
    </plugins>

</project>

Maven中的setting.xml

首先要明确的是setting.xml所在的目录一般有两种:

  • 安装的地方:${M2_HOME}/conf/settings.xml(全局配置)
  • 用户的目录:${user.home}/.m2/settings.xml(用户配置)
  • 如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml会覆盖全局的settings.xml。

实际应用中,经常使用的是<localRepository><proxies><servers><mirrors>这几个节点。

<?xml version="1.0" encoding="UTF-8"?>

<settings   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/settings-1.0.0.xsd">

    <!--本地仓库。该值表示构建系统本地仓库的路径。其默认值为${user.home}/.m2/repository。  -->
    <localRepository>usr/local/maven</localRepository>

    <!--用来配置不同的代理,多代理profiles可以应对笔记本或移动设备的工作环境:通过简单的设置profile id就可以很容易的更换整个代理配置。  -->
    <proxies>

        <!--代理元素包含配置代理时需要的信息 -->
        <proxy>

            <!--代理的唯一定义符,用来区分不同的代理元素。 -->
            <id>myproxy</id>

            <!--该代理是否是激活的那个。true则激活代理。当我们声明了一组代理,而某个时候只需要激活一个代理的时候,该元素就可以派上用处。  -->
            <active>true</active>

            <!--代理的协议。 协议://主机名:端口,分隔成离散的元素以方便配置。 -->
            <protocol>http://…</protocol>

            <!--代理的主机名。协议://主机名:端口,分隔成离散的元素以方便配置。   -->
            <host>proxy.somewhere.com</host>

            <!--代理的端口。协议://主机名:端口,分隔成离散的元素以方便配置。  -->
            <port>8080</port>

             <!--代理的用户名,用户名和密码表示代理服务器认证的登录名和密码。  -->
            <username>proxyuser</username>

            <!--代理的密码,用户名和密码表示代理服务器认证的登录名和密码。  -->
            <password>somepassword</password>

            <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。 -->
            <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>

        </proxy>

    </proxies>

    <!--配置服务端的一些设置。一些设置如安全证书不应该和pom.xml一起分发。这种类型的信息应该存在于构建服务器上的settings.xml文件中。 -->
    <servers>

        <!--服务器元素包含配置服务器时需要的信息  -->
        <server>

            <!--这是server的id(注意不是用户登陆的id),该id与distributionManagement中repository元素的id相匹配。 -->
            <id>server001</id>

            <!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。  -->
            <username>my_login</username>

            <!--鉴权密码 。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。  -->
            <password>my_password</password>

            <!--鉴权时使用的私钥位置。和前两个元素类似,私钥位置和私钥密码指定了一个私钥的路径(默认是/home/hudson/.ssh/id_dsa)以及如果需要的话,一个密钥 -->
            <!--将来passphrase和password元素可能会被提取到外部,但目前它们必须在settings.xml文件以纯文本的形式声明。  -->
            <privateKey>${usr.home}/.ssh/id_dsa</privateKey>

            <!--鉴权时使用的私钥密码。 -->
            <passphrase>some_passphrase</passphrase>

            <!--文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。-->
            <!--这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。  -->
            <filePermissions>664</filePermissions>

            <!--目录被创建时的权限。  -->
            <directoryPermissions>775</directoryPermissions>

            <!--传输层额外的配置项  -->
            <configuration></configuration>

        </server>

    </servers>

    <!--为仓库列表配置的下载镜像列表。  -->
    <mirrors>

        <!--给定仓库的下载镜像。  -->
        <mirror>

            <!--该镜像的唯一标识符。id用来区分不同的mirror元素。  -->
            <id>planetmirror.com</id>

            <!--镜像名称  -->
            <name>PlanetMirror Australia</name>

            <!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。  -->
            <url>http://downloads.planetmirror.com/pub/maven2</url>

            <!--被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo1.maven.org/maven2)的镜像,-->
            <!--就需要将该元素设置成central。这必须和中央仓库的id central完全一致。 -->
            <mirrorOf>central</mirrorOf>

        </mirror>

    </mirrors>

</settings>

猜你喜欢

转载自blog.csdn.net/wangchengming1/article/details/80919411
今日推荐