maven基础

来源:互联网 发布:js实现99乘法表 编辑:程序博客网 时间:2024/05/19 10:35

第0章:关于maven

1.Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

2.官网:http://maven.apache.org/

3.maven中央仓库:http://search.maven.org/

第1章:安装maven

1.安装jdk。验证java安装,执行命令“java -version”,或执行“java”和“javac”。

2.下载maven。地址:http://maven.apache.org/download.html 。建议下载3.0以上版本,如apache-maven-3.0.4.zip。

3.解压下载包,配置系统环境变量,如下:

变量名:M2_HOME

变量值:D:\software\maven\apache-maven-3.0.4   (maven根目录)

变量名:Path

变量值:%M2_HOME%\bin;

4.安装完成。验证方法执行“mvn -v” 。

5.修改本地仓库路径。修改maven根目录中conf文件夹中的setting.xml文件。修改<localRepository>标签中的路径,该路径指向为maven本地仓库。格式如下:

<localRepository>D:/software/repository</localRepository>

6.IDE相关插件安装和简单项目搭建参考如下博客:

http://blog.csdn.net/oyzl68/article/details/8119086

http://www.cnblogs.com/timeng/archive/2013/05/07/maven_install.html

第2章:项目对象模型(POM)

1.项目坐标

POM定义了groupId,artifactId和version:这三项是所有项目都需要的坐标。格式如下:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sonatype.mavenbook.ch08</groupId>
  <artifactId>simplest-project</artifactId>
  <version>1</version>
</project>

2.项目版本

Maven中的版本包含了以下部分:主版本,次版本,增量版本,和限定版本号。一个版本中,这些部分对应如下的格式:

<major version>.<minor version>.<incremental version>-<qualifier>

1.如果一个项目依赖于SNAPSHOT,那么这个依赖很不稳定,它随时可能变化。

2.LATEST是指某个特定构件最新的发布版或者快照版(snapshot),最近被部署到某个特定仓库的构件。

3.RELEASE是指仓库中最后的一个非快照版本。

3.项目依赖

(1)项目依赖格式

    <dependencies>
       <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>3.8.1</version>
         <scope>test</scope>
       </dependency>
    </dependencies>

(2)项目依赖范围

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仓库中引用依赖)。

(3)依赖版本界限

可以使用如下的字符来围绕一个或多个版本号,来实现版本界限。

(,)不包含量词

[,]包含量词

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>[3.8,4.0)</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>[,3.8.1]</version>ex-de
  <scope>test</scope>
</dependency>

(4)传递性依赖

一个传递性依赖就是对于一个依赖的依赖。如果project-a依赖于project-b,而后者接着依赖于project-c,那么project-c就被认为是project-a的传递性依赖。

表 :范围如何影响传递性依赖

直接范围传递性范围    compileprovidedruntimetestcompilecompile-runtime-providedprovidedprovidedprovided-runtimeruntime-runtime-testtest-test-

(5)依赖冲突解决

有很多时候你需要排除一个传递性依赖,比如当你依赖于一个项目,后者又继而依赖于另外一个项目,但你的希望是,要么整个的排除这个传递性依赖,要么用另外一个提供同样功能的依赖来替代这个传递性依赖。

<dependencies>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate</artifactId>
    <version>3.2.5.ga</version>
    <exclusions>
      <exclusion>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-jta_1.1_spec</artifactId>
    <version>1.1</version>
  </dependency>
</dependencies>

4.项目关系

(1)多模块项目

多模块项目是那些包含一系列待构建模块的项目。一个多模块项目的打包类型总是pom,很少生成一个构件。一个模块项目的存在只是为了将很多项目归类在一起,成为一个构建。

<project>
  <groupId>org.sonatype.mavenbook</groupId>
  <artifactId>top-group</artifactId>
  ...
  <modules>
    <module>sub-group</module>
    <module>project-c</module>
  </modules>
  ...
</project>

(2)项目继承

有些情况你会想要一个项目从父POM中继承一些值。你可能正构建一个大型的系统,你不想一遍又一遍的重复同样的依赖元素。

<project>
  <parent>
    <groupId>com.training.killerapp</groupId>
    <artifactId>a-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>project-a</artifactId>
  ...
</project>

第3章:maven生命周期 

  Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。
每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。
以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post clean。当用户调用pre-clean的时候,只有pre-clean得以执行,当用户调用clean的时候,pre-clean和clean阶段会得以顺序执行;当用户调用post-clean的时候,pre-clean,clean,post-clean会得以顺序执行。

较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的,用户可以仅仅调用clean生命周期的某个阶段,或者仅仅调用default生命周期的某个阶段,而不会对其他生命周期产生任何影响。

1. clean 生命周期

      clean生命周期的目的是清理项目,它包含三个阶段:

     1)pre-clean 执行一些清理前需要完成的工作。

     2)clean 清理上一次构建生成的文件。

     3)post-clean 执行一些清理后需要完成的工作。

 

2. default 生命周期

       default生命周期定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分,它包含的阶段如下:

       1) validate 验证项目是否正确和所有需要的相关资源是否可用

       2) initialize 初始化构建

       3) generate-sources

       4)   process-sources 处理源代码

       5) generate-resources 

       6)   process-resources 处理项目主资源文件。对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。

       7) compile 编译项目的主源代码

       8) process-classes

       9)   generate-test-sources

       10) process-test-sources 处理项目测试资源文件

       11)generate-test-resources

       12)  process-test-resources 处理测试的资源文件

       13)test-compile 编译项目的测试代码

       14)process-test-classes

       15)  test 使用单元测试框架运行测试,测试代码不会被打包或部署

       16)prepare-package 做好打包的准备

       17)package 接受编译好的代码,打包成可发布的格式

       18)  pre-integration-test

       19)  integration-test

       20)  post integration-test

       21)  verify

       22)  install 将包安装到Maven本地仓库,供本地其他Maven项目使用

       23)deploy 将最终的包复制到远程仓库,供其他开发人员和Maven项目使用

       

3. site 生命周期

      site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。该生命周期包含如下阶段:

      1)pre-site 执行一些在生成项目站点之前需要完成的工作

      2)site 生成项目站点文档

      3)post-site 执行一些在生成项目站点之后需要完成的工作

      4)site-deploy 将生成的项目站点发布到服务器上

第4章:maven属性

你可以在pom.xml文件或者资源文件中使用属性,资源文件被会Maven Resource插件的过滤特性处理。一个属性永远包含在${和}中。在任何Maven项目中都有一些隐式的属性,这些隐式的属性是:

1.project.*
Maven的项目对象模型(POM)。你可以使用该project.*前缀来引用任何在Maven的POM中的值。如:${project.artifactId}

2.settings.*
Maven Settings。你使用该settings.*前缀来引用~/.m2/settings.xml文件中Maven的 Settings的值。

3.env.*
环境变量如PATH和M2_HOME可以使用env.*前缀来引用。如:${env.M2_HOME}

4.系统属性
任何可以通过System.getProperty()方法获取的属性都可以作为Maven属性被引用。如:${java.version}

5.自定义属性

<project>
  ...
  <properties>
    <arbitrary.property.a>This is some text</arbitrary.property.a>
    <hibernate.version>3.3.0.ga</hibernate.version>
  </properties>
  ...
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate</artifactId>
      <version>${hibernate.version}</version>
    </dependency>  
  </dependencies>
  ...
</project>

第5章:常用插件

maven官网插件:http://maven.apache.org/plugins/

1.JDK編译插件

            <!-- JDK編译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>

2.源码打包插件

            <!-- 源码打包插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.1.2</version>
                <configuration>
                    <attach>true</attach>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

3.jar包拷贝插件

            <!-- 把依赖的jar包拷到lib目录下 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependency</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.basedir}/lib</outputDirectory>
                            <overWriteReleases>true</overWriteReleases>
                            <overWriteSnapshots>true</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

4. 版本打包插件

1.使用该插件必须先手动配置src/main/assembly/package.xml文件,配置例子如下:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>release</id>
  <formats>
    <format>tar.gz</format>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
        <directory>bin</directory>
        <outputDirectory>/bin</outputDirectory>
    </fileSet>
    <fileSet>
      <directory>cfg</directory>
      <outputDirectory>/cfg</outputDirectory>
    </fileSet>
  </fileSets>
  <dependencySets>
    <dependencySet>
      <outputDirectory>lib</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
    </dependencySet>
  </dependencySets>
</assembly>

2.插件如下:

           
         <!-- 版本打包 , 手动配置src/main/assembly/package.xml文件-->
         <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/package.xml</descriptor>
                    </descriptors>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

3.该插件生成如下压缩包:


原创粉丝点击