zoukankan      html  css  js  c++  java
  • Maven

    Maven

      Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。Project Object Model:项目对象模型。将Java工程的相关信息封装为对象形式作为便于操作和管理的模型。

     Maven作用

       1 添加第三方jar包:使用 Maven 后每个 jar 包只需在本地仓库中保存一份

       2 jar包之间的依赖关系:Maven 可自动的将当前 jar 包所依赖的其他所有jar包全部导入

       3 处理jar包之间的冲突:Maven中内置了两条依赖原则:最短路径者优先和先声明者优先。可以自动的处理jar包之间的冲突问题

       4 获取第三方jar包:Maven 会自动从中央仓库下载,并同时下载这个 jar 包所依赖的其他 jar 包——规范、完整、准确!一次性解决所有问题

       5 将项目拆分成多个工程模块:Maven 的依赖管理机制,可将项目拆分成多个工程协同开发

       6 实现项目的分布式部署:将项目拆分成多个模块后,每个模块可运行在独立的服务器。我们称之为分布式部署

      核心概念

        ①POM  ②约定的目录结构  ③坐标  ④依赖管理  ⑤仓库管理  ⑥生命周期  ⑦插件和目标  ⑧继承  ⑨聚合

      配置本地仓库

        在 Maven 的核心配置文件:D:apache-maven-3.5.0confsettings.xml 中的标签

    <localRepository>D:/RepMaven</localRepository>(指定本地仓库文件路径)

         在settings.xml文件 mirrors 标签中配置阿里镜像服务器

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

    自动化构建

      JavaEE 开发普遍认同的观点:约定>配置>编码。意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。maven默认从<项目根目录>/src/main/java这个目录去查找Java源文件,编译后的class文件会保存在<项目根目录>/target/classes目录。在maven中,所有的PO都有一个根对象,就是Super POM。Super POM中定义了所有的默认的配置项

      构建:编写的 Java 代码经过编译得到对应的 .class 文件,将 Web 工程编译的结果“拿”到服务器上的指定目录结构,我们叫部署,在实际项目中除此之外,还包括第三方框架的 jar 包以及各种配置文件。都必须按照正确的目录结构部署到服务器上才可以运行。而这些 Maven 通过一些命令都可以帮我自动构建完成。对应 pom.xml 中也就是<build>元素中的内容。也就是 Lifecycle 生命周期

      构建环节

        ①清理:删除以前的编译结果,为重新编译做好准备

        ②编译:将Java源程序编译为字节码文件

        ③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性

        ④报告:在每一次测试后以标准的格式记录和展示测试结果

        ⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包

        ⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中

        ⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行

    生命周期

      ●Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了。

      ●Maven有三套相互独立的生命周期,分别是:

        ①Clean Lifecycle在进行真正的构建之前进行一些清理工作。

        ②Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等。

        ③Site Lifecycle生成项目报告,站点,发布站点。

      它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。

      运行任何一个阶段的时候,它前面的所有阶段都会被运行。 但生命周期是抽象的(Maven的生命周期本身是不做任何实际工作), 任务执行(如编译源代码)均交由插件完成。Maven 的插件机制是完全依赖Maven的生命周期的,所谓的插件 plugin 其实也就是一个maven项目,只不过这个项目会引用maven的一些API,plugin项目也具备maven坐标。

     插件和目标

      ●生命周期的阶段 phase 与插件的目标 goal 相互绑定, 用以完成实际的构建任务.

      ●每个插件都能实现多个功能,每个功能就是一个插件目标。

      ●Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。

      maven命令的语法为  mvn [options] [goal(s)] [phase(s)]

        如: mvn compiler:compile 冒号前是插件前缀, 后面是该插件目标或功能

      clean 移除所有上一次构建生成的文件

    site 生成项目的站点文档

    deploy 将生成的站点文档部署到特定的服务器上

    继承、依赖、聚合

      Maven的聚合特性(aggregation)能够使项目的多个模块聚合在一起构建, 而继承特性(inheritance)能够帮助抽取各模块相同的依赖、插件等配置,在简化模块配置的同时, 保持各模块一致.

      任何一个Maven项目都隐式地继承自超级POM, 因此超级POM的大量配置都会被所有的Maven项目继承, 这些配置也成为了Maven所提倡的约定.
     
      当一个模块项目引入另一个模块或第三方 jar 包时,我们就称他们之间有依赖关系。依赖有直接依赖和间接依赖,并且规定了之间依赖范围和原则等

    父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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.gc.atcrowdfunding</groupId> <artifactId>atcrowdfunding-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <description>父工程,聚合其他工程</description> <!-- 版本管理--> <properties> <junit.version>4.12</junit.version> </properties> <> <dependencies> <!-- 公共依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> <!-- 聚合管理 --> <modules> <module>../atcrowdfunding-common</module> <module>../atcrowdfunding-manager</module> </modules> </project>

       坐标:使用三个向量在 Maven 的仓库中确定一个Maven工程,由此可用于其他项目模块的依赖或继承

        [1] groupId:公司或组织的域名倒序+当前项目名称

        [2] artifactId:当前项目的模块名称

        [3] version:当前模块的版本

      我们自己的 Maven 工程必须执行安装(install)操作才会进入仓库,我们通过坐标可以到仓库中找到对应 jar 包。将gav三个向量连起来再加上 a-v

    cngcmavenmaven1.0.1-SNAPSHOTmaven1-0.0.1-SNAPSHOT.jar

      [4] packaging打包的机制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默认为jar -->  

         pom 打包父工程,war 打包 Web 工程,jar 打包普通工程

      [5] properties : 为pom定义一些常量,在pom中的其它地方可以直接引用,用来控制版本号

         使用方式 如 ${junit.version}

      [6] dependencyManagement :在父工程中管理依赖

        在父工程中引入的 jar 包全部都会被子工程继承,但有时某些子工程我们不需要父工程中的 jar 包。我们可将父工程中的 dependencies 标签,用 dependencyManagement 标签括起来,这样子工程需要什么 jar 包只需引入对应 groupId 和 artifactId 即可版本直接由父工程管理

      [7] dependencies 定义本项目的依赖关系

        在此标签内如此模块需要引入那个 jar 包只需在此子标签 dependency 中定义即可。依赖管理规定了几个原则

        依赖的范围 scope 包含如下的取值:compile(编译范围)、provided(已提供范围)、runtime(运行时范围)、test(测试范围)、system(系统范围)

        默认为 compile 如果A依赖B,B依赖C,那么A→B和B→C都是直接依赖,而A→C是间接依赖,通过依赖范围就可控制其直接是否有依赖关系

        ① compile (默认)

          [1]main目录下的Java代码可以访问这个范围的依赖

          [2]test目录下的Java代码可以访问这个范围的依赖

          [3]部署到Tomcat服务器上运行时放在WEB-INF的lib目录下

        ② test

          [1]main目录下的Java代码不能访问这个范围的依赖

          [2]test目录下的Java代码可以访问这个范围的依赖

          [3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下

        ③ provided

          [1]main目录下的Java代码可以访问这个范围的依赖

          [2]test目录下的Java代码可以访问这个范围的依赖

          [3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下

        ④ runtime[了解]

          [1]main目录下的Java代码不能访问这个范围的依赖

          [2]test目录下的Java代码可以访问这个范围的依赖

          [3]部署到Tomcat服务器上运行时放在WEB-INF的lib目录下

        依赖的原则:解决jar包冲突

          ①路径最短者优先

          ②路径相同时先声明者优先。先后顺序指的是 dependency 标签配置的先后顺序

        依赖的排除:为了确保程序正确可以将有可能重复的间接依赖排除。排除掉后也可以自行依赖其他版本

        <!-- 依赖排除 -->
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
     
      当依赖、插件的版本、配置等信息在父POM中声明之后, 子模块在使用时就无须声明这些信息, 也就不会出现多个子模块使用的依赖版本不一致的情况, 也就降低了依赖冲突的几率. 另外如果子模块不显式声明依赖与插件的使用, 即使已经在父POM的dependencyManagement、pluginManagement中配置了, 也不会产生实际的效果.
      [8] modules : 实现聚合的核心,module 值为被聚合模块相对于聚合POM的相对路径, 每个被聚合模块下还各自包含有pom.xml、src/main/java、src/test/java等内容

    子工程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/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <artifactId>atcrowdfunding-manager</artifactId>
      <description>控制器类,业务层接口及实现类,Dao接口及映射文件</description>
      <!--在子工程中引用父工程-->
      <parent>
          <groupId>cn.gc.atcrowdfunding</groupId>
          <artifactId>atcrowdfunding-parent</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <relativePath>../atcrowdfunding-parent/pom.xml</relativePath>
      </parent>
      <dependencies>
       <!--引入父工程模块-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
      </dependencies>
       <!--构建管理-->
      <build>
            <plugins>
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.7</version>
                    <dependencies>
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <version>5.1.42</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
      </build>
    </project>

      

      [9] parent:用于确定父项目的坐标位置

        relativePath:指定从当前子工程的pom.xml文件出发,查找父工程的pom.xml的路径

      如果子工程的 groupId 和 version 如果和父工程重复则可以删除

      在子项目中重新指定需要的依赖,可以不需要改模块的范围和版本号,因为父工程已经帮助管理了

    Maven配置详解转载

    SuperPom
    <!-- START SNIPPET: superpom -->
    <project>
      <modelVersion>4.0.0</modelVersion>
    
      <!-- 定义了中央仓库以及插件仓库, 均为:https://repo.maven.apache.org/maven2 -->
      <repositories>
        <repository>
          <id>central</id>
          <name>Central Repository</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
    
      <pluginRepositories>
        <pluginRepository>
          <id>central</id>
          <name>Central Repository</name>
          <url>https://repo.maven.apache.org/maven2</url>
          <layout>default</layout>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <releases>
            <updatePolicy>never</updatePolicy>
          </releases>
        </pluginRepository>
      </pluginRepositories>
    
      <!-- 依次定义了各类代码、资源、输出目录及最终构件名称格式, 这就是Maven项目结构的约定 -->
      <build>
        <directory>${project.basedir}/target</directory>
        <outputDirectory>${project.build.directory}/classes</outputDirectory>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
        <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
        <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
        <resources>
          <resource>
            <directory>${project.basedir}/src/main/resources</directory>
          </resource>
        </resources>
        <testResources>
          <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
          </testResource>
        </testResources>
    
        <!-- 为核心插件设定版本 -->
        <pluginManagement>
          <!-- NOTE: These plugins will be removed from future versions of the super POM -->
          <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
          <plugins>
            <plugin>
              <artifactId>maven-antrun-plugin</artifactId>
              <version>1.3</version>
            </plugin>
            <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <version>2.2-beta-5</version>
            </plugin>
            <plugin>
              <artifactId>maven-dependency-plugin</artifactId>
              <version>2.8</version>
            </plugin>
            <plugin>
              <artifactId>maven-release-plugin</artifactId>
              <version>2.3.2</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    
      <!-- 定义项目报告输出路径 -->
      <reporting>
        <outputDirectory>${project.build.directory}/site</outputDirectory>
      </reporting>
    
      <!-- 定义release-profile, 为构件附上源码与文档 -->
      <profiles>
        <!-- NOTE: The release profile will be removed from future versions of the super POM -->
        <profile>
          <id>release-profile</id>
    
          <activation>
            <property>
              <name>performRelease</name>
              <value>true</value>
            </property>
          </activation>
    
          <build>
            <plugins>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                  <execution>
                    <id>attach-sources</id>
                    <goals>
                      <goal>jar</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-javadoc-plugin</artifactId>
                <executions>
                  <execution>
                    <id>attach-javadocs</id>
                    <goals>
                      <goal>jar</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                  <updateReleaseInfo>true</updateReleaseInfo>
                </configuration>
              </plugin>
            </plugins>
          </build>
        </profile>
      </profiles>
    
    </project>
    <!-- END SNIPPET: superpom -->
  • 相关阅读:
    IOS Charles(代理服务器软件,可以用来拦截网络请求)
    Javascript中addEventListener和attachEvent的区别
    MVC中实现Area几种方法
    Entity Framework Code First 中使用 Fluent API 笔记。
    自定义JsonResult解决 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
    Code First :使用Entity. Framework编程(8) ----转发 收藏
    Code First :使用Entity. Framework编程(6) ----转发 收藏
    Code First :使用Entity. Framework编程(5) ----转发 收藏
  • 原文地址:https://www.cnblogs.com/Open-ing/p/12275324.html
Copyright © 2011-2022 走看看