MAVEN 学习笔记

1、MAVEN是什么?

maven将本身定位为一个项目管理工具。它负责管理项目开发过程当中的几乎全部的东西:java

  •     版本——maven有本身的版本定义和规则
  •     构建——maven支持许多种的应用程序类型,对于每一种支持的应用程序类型都定义好了一组构建规则和工具集。
  •     输出物管理——maven能够管理项目构建的产物,并将其加入到用户库中。这个功能能够用于项目组和其余部门之间的交付行为。
  •     依赖关系——maven对依赖关系的特性进行细致的分析和划分,避免开发过程当中的依赖混乱和相互污染行为
  •     文档和构建结果——maven的site命令支持各类文档信息的发布,包括构建过程的各类输出,javadoc,产品文档等。
  •     项目关系——一个大型的项目一般有几个小项目或者模块组成,用maven能够很方便地管理
  •     移植性管理——maven能够针对不一样的开发场景,输出不一样种类的输出结果。

2、maven目录结构

所谓的"约定优于配置",在maven中并非彻底不能够修改的,他们只是一些配置的默认值而已。可是使用者除非必要,并不须要去修改那些约定内容。maven默认的文件存放结构以下:web

|/项目目录
|----pom.xml           				//用于maven的配置文件
     |----/src                                  	//源代码目录
           |---- /main 				//工程源代码目录
               	 |----/java 				//工程java源代码目录
                 |----/resource 			//工程的资源目录
           |----/test 				//单元测试目录
                 |----/java
     |----/target 					//输出目录,全部的输出物都存放在这个目录下
           |----/classes 				//编译以后的class文件

3、多项目管理

|---总项目/
     |---pom.xml 总项目的pom配置文件
     |---子项目1/
          |---pom.xml 子项目1的pom文件
     |---子项目2/
          |---pom.xml 子项目2的pom文件

注:在总项目中的<packaging>为pom,而且须要设置使用<modules>来设置他的子项目spring

在总项目中加入apache

<modules> 
    <module>sub-module1</module> 
    <module>sub-module2</module> 
</modules>

其次在每一个子项目中加入windows

<parent> 
    <groupId>parent.groupId</groupId> 
    <artifactId>sub-module1</artifactId> 
    <version>1.0</version> 
</parent>   

4、maven的版本规范

maven使用以下几个要素来惟必定位某一个输出物: groupId:artifactId:packaging:version tomcat

  • groupId     团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以建立这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype的项目有一个以com.sonatype开头的groupId,而Apache Software的项目有以org.apache开头的groupId。
  • artifactId    在groupId下的表示一个单独项目的惟一标识符。好比咱们的tomcat, commons等。不要在artifactId中包含点号(.)。
  • version     一个项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。而正在开发中的项目能够用一个特殊的标识,这种标识给版本加上一个"SNAPSHOT"的标记。   虽然项目的打包格式也是Maven坐标的重要组成部分,可是它不是项目惟一标识符的一个部分。一个项目的 groupId:artifactId:version使之成为一个独一无二的项目;你不能同时有一个拥有一样的groupId, artifactId和version标识的项目。
  •     packaging    项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个JAR文件,类型为war的项目产生一个web应用。

5、依赖管理

任意一个外部依赖说明包含以下几个要素:groupId, artifactId, version, scope, type, optional。其中前3个是必须的,各自含义以下:服务器

  •     groupId 必须
  •     artifactId 必须
  •     version 必须。 
  •     这里的version能够用区间表达式来表示,好比(2.0,)表示>2.0,[2.0,3.0)表示2.0<=ver<3.0;多个条件之间用逗号分隔,好比[1,3),[5,7]。
  •     scope 做用域限制
  •     type 通常在pom引用依赖时候出现,其余时候不用
  •     optional 是否可选依赖

在maven中,scope包含以下的取值:dom

  1. compile(编译范围)  compile是默认的范围;若是没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在全部的classpath中可用,同时它们也会被打包。
  2. provided(已提供范围)   provided依赖只有在当JDK或者一个容器已提供该依赖以后才使用。例如,若是你开发了一个web应用,你可能在编译classpath中须要可用的Servlet API来编译一个servlet,可是你不会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。
  3. runtime(运行时范围)    runtime依赖在运行和测试系统的时候须要,但在编译的时候不须要。好比,你可能在编译的时候只须要JDBC API JAR,而只有在运行的时候才须要JDBC驱动实现。
  4.  test(测试范围)   test范围依赖 在通常的 编译和运行时都不须要,它们只有在测试编译和测试运行阶段可用。测试范围依赖在以前的???中介绍过。
  5.  system(系统范围) system范围依赖与provided相似,可是你必须显式的提供一个对于本地系统中JAR文件的路径。这么作是为了容许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。 若是你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素 。注意该范围是不推荐使用的(你应该一直尽可能去从公共或定制的Maven仓库中引用依赖)。

6、属性

经过在<properties>设置属性,在后面能够经过${}来直接使用,以下面例子中的配置,就能够方便管理spring的统一版本号maven

<properties>

<spring.version>4.3.1.RELEASE</spring.version>

</properties>




<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

    <version>${spring.version}</version>

</dependency>

maven提供了三个隐式的变量,用来访问系统环境变量、POM信息和maven的settings:ide

  •     env     暴露操做系统的环境变量,好比env.PATH
  •     project     暴露POM中的内容,用点号(.)的路径来引用POM元素的值,好比${project.artifactId}。另外,java的系统属性好比user.dir等,也暴露在这里。
  •     settings     暴露maven的settings的信息,也能够用点号(.)来引用。maven把系统配置文件存放在maven的安装目录中,把用户相关的配置文件存放在~/.m2/settings.xml(unix)或者%USERPROFILE%/.m2/settings.xml(windows)中。

7、PROFILE

profile是maven的一个重要特性,它可让maven可以自动适应外部的环境变化,好比同一个项目,在开发环境和线上环境使用不一样的配置文件,则能够

<profiles>

<profiles>
        <profile>
            <id>local</id>
            <properties>
                <package.environment>local</package.environment>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>online</id>
            <properties>
                <package.environment>online</package.environment>
            </properties>
        </profile>
    </profiles>

这样在打包配置文件的时候使用

<build>
    <resources>
        <resource>
            <directory>${package.environment}</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
     </resources>
<build>

就能够针对不一样的profile打包不一样的配置文件

8、其余配置

1.exclusion

若是咱们引入一个依赖A,但不想依赖A所依赖B,则可使用<exclusion> 

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>

2.使用指定jdk版本编译,经过使用插件

<project> 
    ... 
    <build> 
        ... 
        <plugins> 
            <plugin> 
                <artifactId>maven-compiler-plugin</artifactId> 
                <configuration> 
                    <source>1.5</source> 
                    <target>1.5</target> 
                </configuration> 
            </plugin> 
        </plugins> 
        ... 
    </build> 
    ... 
</project>

3.目录是非标准的目录结构,如何设置让maven支持

<build> 
    <directory>target</directory> 
    <sourceDirectory>src</sourceDirectory> 
    <scriptSourceDirectory>js/scripts</scriptSourceDirectory> 
    <testSourceDirectory>test</testSourceDirectory> 
    <outputDirectory>bin</outputDirectory> 
    <testOutputDirectory>bin</testOutputDirectory> 
</build>

4.源代码是UTF8格式

<project> 
    ... 
    <properties> 
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    ... 
</project>

5.工程的全部依赖的jar都一块儿打包

<build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>

而后使用命令打包便可:mvn assembly:assembly

6.多个源代码目录

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.1</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/config/java</source>
                <source>src/main/java</source>
                <source>src/member/java</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
相关文章
相关标签/搜索