发表于: 2018-02-25 22:59:20

1 628


完成的事情:

昨天第一次接触maven,有点懵.今天主要将maven系统的学习了一遍

maven主要的目录骨架:

src

  -main

    -jave

     -package

  -test

    -jave

      -package

  resources

常用命令:

mvn -v 查看maven版本

        compile 编译

        test 测试运行

        package 打包为jar包

        clean 清理项目,删除打包生成的targe文件夹

        install 把项目安装到本地仓库中

自动创建目录的两种方式:

1.archetype:generate 按照提示进行选择

2.archetype:generate -DgroupId=com.jnshu.demo -DartufactId=demp-test -Dversion=1.0.0-SNAPSHOT -Dpackage=com.jnshu.demo.test

      参数意义:

      -DgroupId=组织名,一般格式: 组织名.公司网址的反写.项目名称

      -DartufactId=项目名-模板名

      -Dversion=版本号-SNAPSHOT

      -Dpackage=代码所存在的包名,一般为公司网址的反写.项目名.模板名

坐标:

在maven中任何一个依赖,插件,项目构建成功后都称之为构件,所有构件都通过坐标作为其唯一的标识,就如同工作单位或者家庭地址.pom配置文件中的 groupId\artifactId\version 组成项目的基本坐标,在maven中任何构建都是有这些坐标来进行标识的,在创建maven项目时,java的包名应该与pom配置文件中的groupId\artifactId相吻合.

Junit的坐标


仓库:

  本地仓库和远程仓库

    maven所有的构件都是从仓库中下载到当前项目中的,当本地仓库中没有项目中所需要的构件时,maven会从远程仓库中查找并下载构件到本地仓库供我们使用,如果远程仓库中也没有就会报错.

  镜像仓库

    maven默认提供了一个全球仓库的地址,由于服务器在国外,我们可以将其修改到国内镜像仓库,在maven安装目录的conf/settings.xml中,添加阿里云的镜像仓库

    <mirror>

      <!-- 该镜像仓库的id -->

      <id>alimaven</id>

      <!-- 为哪个仓库配置镜像,maven默认的镜像仓库名为central,可以使用默认的仓库名,可以使用通配符 * 号,一旦配置了镜像,所有原仓库的访问都会转到镜像仓库 -->

      <mirrorOf>central</mirrorOf>

      <name>aliyun maven</name>

      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>

    </mirror>

    

  更改本地仓库的位置:

    maven默认的仓库位置在c盘的个人文件夹/.m2/repository/ 中,一旦重装系统都会丢失.修改 conf/settings.xml中localrepository的路径,添加一行:

        <localRepository>E://maven//LocalWarehouse</localRepository>

        

maven生命周期:

  一个完整项目的生命周期包括:清理,编译,测试,打包,集成测试,本地验证,部署上线.

  maven有三个生命周期:clean 清理项目,default 构建项目,site 生成项目的站点. 这三个生命周期是相互独立的,每个生命周期又包含一些阶段,各个生命周期中的阶段都是有顺序的,后面的阶段依赖于前面的阶段,执行某个阶段时其前面的阶段会顺序执行,但不会触发另外两套生命周期中的任何阶段.

    如下面这个常见的生命周期:compile->test->package->install;

    当执行package时会先执行clean->compile->test.

  clean 清理项目的生命周期:

    pre-clean 执行清理前完成的工作

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

    post-clean 执行清理后的文件

  default 构建项目(最核心):

    compile -> test-> pachage-> install;

  site 生成项目站点:

    pre-site 在生成项目站点前完成的工作

    site  生成项目的站点文档

    post-site 在生成项目站点后完成的工作

    site-deploy 发布生成的站点到服务器上

maven插件:

  maven所有的命令都是调用插件太实现的,在maven的官网中提供的很多的插件:https://maven.apache.org/plugins/index.html.或者去阿里云仓库http://maven.aliyun.com/nexus/

  在pom.xml中添加以下信息即可添加一个maven-source插件:

  <build>

    <plugins>

     <plugin>

      <groupId>org.apache.maven.plugins</groupId>

      <artifactId>maven-source-plugin</artifactId>

      <version>3.0.1</version>

      <!-- 我想要在执行package这个命令时同时执行source将源码进行打包,需要把source绑定到default生命周期的package阶段: -->

     <!-- 执行阶段配置 -->

     <executions>

      <execution>

        <!-- 绑定 在打包成功后运行source 参数为jar-no-fork -->

        <phase>package</phase>

          <!-- 目标 -->

           <goals>

            <!-- 这是source可选目标选项,可在该插件定义中查看 -->

            <goal>jar-no-fork</goal>

           </goals>

       </execution>

      </executions>

     </plugin>

    </plugins>

  </build>

 保存后,运行package命令时会自动自行source命令生成源代码jar包.

  

maven pom.xml常用元素介绍:

<!-- 包含了maven一些约束的信息 -->

<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">

  <!-- 指定了当前pom的版本 -->

  <modelVersion>4.0.0</modelVersion>


  <!-- 主项目的标识,定义当前maven属于哪一个实际的项目,maven的项目和我们实际的项目不是一一对应的关系,maven项目体现的是一个模块化的概念,一个项目会被划分会很多个模块 -->

  <groupId>反写的公司网址.项目名</groupId>

  

  <!--  模块的标识 实际项目中的一个模块 -->

  <artifactID>项目名-模块名</artifactID>

  

  <!-- 版本号 一般由三个数字和一个版本描述来组成的,

     第一个0表示大版本号 

     第二个0表示分支版本号

     第三个0表示小版本号

     snapshot 快照版本

     alpha 内部测试

     beta 公测

     Release 稳定版本

     GA(General Availability) 正式发布 -->

  <version></version>

  

  <!-- 打包的方式,默认为jar,可选war zip pom -->

  <package></package>

  

  <!-- 项目描述名,一般产生项目文档时才会使用 -->

  <name></name>

  <!-- 项目的地址 -->

  <url></url>

  <!-- 项目的描述 -->

  <description></description>

  <!-- 开发人员列表 -->

  <developers></developers>

  <!-- 许可证信息 -->

  <licenses></licenses>

  <!-- 组织信息 -->

  <organization></organization>

  

  <!-- 依赖列表 下可包含多个依赖项 -->

  <dependencies>

  <!-- 依赖项 -->

  <dependency>

   <!-- 依赖项id -->

   <groupId></groupId>

   <artifactId></artifactId>

   <version></version>

   <!-- 类型 -->

   <type></type>

   <!-- 指定依赖的生效范围 -->

   <scope>test</scope>

   <!-- 设置依赖是否可选 有false/true两个值,默认是false,false 子项目是继承的/true 子项目必须引入该依赖 -->

   <optional></optional>

   

   <!-- 排除依赖列表 如:建立三个项目 a b c, a依赖b的部分功能,b依赖c的部分功能. c对于a来说就是传递依赖,如果a不需要依赖c,就可以使用这个标签排除对c的依赖-->

   <exclusions>

    <exclusion>

    <!-- 排除依赖时不需要版本号 添加后生效后,com.jnshu.demo01.jar会自动从资源中删除 -->

      <groupId>com.jnshu.demo01</groupId>

            <artifactId>demo01-test</artifactId>

    </exclusion>

   </exclusions>

  </dependency>

  </dependencies>

  

  <!-- 依赖的管理 依赖的管理中也可以声明依赖列表但他不会被运行,不会引入到实际的依赖中,该标签主要定义在父模块中供子模块继承,比如多个maven项目中都使用到了同一个依赖,就可以抽象出来一个父类的模块,然后在父类模块中对这个依赖进行定义,其他子模块直接继承就可以了 -->

  <dependencyManagement>

  <dependencies>

   <dependency></dependency>

  </dependencies>

  </dependencyManagement>

  

  <build>

  <!-- 插件列表 -->

  <plugins>

   <plugin>

    <!-- 坐标 -->

    <groupId></groupId>

    <artifactId></artifactId>

    <version></version>

   </plugin>

  </plugins>

  </build>

  

  <!-- 子模块对父模块pom的继承 -->

  <parent></parent>

  

  <!-- 聚合运行多个maven项目模块,如果有很多maven项目需要编译,之前是一个一个编译,使用这个标签可以定义多个模块进行一起编译-->

  <modules></modules>

</project>

maven依赖冲突(以下->为依赖于):

  1.短路优先 如果A B依赖了一个不同版本的构件X(jar),且A->B->C,对于依赖于A B的C,此时会依赖哪个版本的构件?比如以下情况,会优先解析第二个,C会继承B的依赖版本2.0

    A->B->C-X-2.0(jar)

    A->B-X-1.0(jar)

    下图中demo01test中引入了commons-io-2.0版本的依赖,demo02test引入了commons-io-2.4版本的依赖,demo03test依赖于demo02test,demo02test依赖于demo01test,最后demo03test引入了demo02test的依赖版本.

    测试的时候需demo01test,demo02test需要安装到本地仓库才会生效.

  2.先声明先优先,如果路径长度相同,则谁先在pom中声明,先解析谁,

    A->B->X-1.0(jar)

    A->C->X-2.0(jar)

  A的pom.xml配置中,先声明B的坐标就依赖1.0版本,反之就依赖C的2.0版本,下面的情况依赖demo01的版本

maven聚合:

  如果在maven中我们想将多个项目进行install将其安装到本地仓库中必须依次对其进行install命令.maven有种方式可以将其放到一起运行,这种方式称之为聚合.

  新建一个maven项目,与要聚合的项目同级目录,在pom.xml文件中添加modules标签,packageing改为pom

  <packaging>pom</packaging>

  <modules>

    <module>../demo01test</module>

    <module>../demo02test</module>

    <module>../demo03test</module>

  </modules>

  聚合后聚合的项目会加入到视图中:

  在新项目中运行clean install都会同时操作:

maven继承:

  如果多个maven项目都依赖同一个构建 可以新建一个父类maven,将该依赖放入父类中管理,如Junit依赖,为Junit添加父类依赖,创建一个maven项目,在其pom.xml中添加:

 <modelVersion>4.0.0</modelVersion>

  <groupId>com.jnshu</groupId>

  <artifactId>demo-parent</artifactId>

  <version>1.0-SNAPSHOT</version>

  <!-- 打包方式为pom -->

  <packaging>pom</packaging>

  <name>demo-parent</name>

  <url>http://maven.apache.org</url>

  <properties>

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

    <!-- 将版本号指定到此为置方便以后统一管理 -->

    <junit.version>3.8.1</junit.version>

  </properties>

<!-- 在dependencyManagement 中定义的依赖jar包不会导入到本项目 会被继承本pom的项目导入 -->

  <dependencyManagement>

    <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

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

      <scope>test</scope>

    </dependency>

  </dependencies>

  </dependencyManagement>

继承的pom.xml配置:

添加parent标签

<parent>

    <groupId>com.jnshu</groupId>

    <artifactId>demo-parent</artifactId>

    <version>1.0-SNAPSHOT</version>

  </parent>

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <!-- 添加父类后 只需要填写groupId和artifactId,其他属性都会自动继承

      <version>3.8.1</version>

      <scope>test</scope>

      -->

    </dependency>

  </dependencies>

添加web项目并通过插件发布:

  师兄说这个是任务2中的,顺手写完记录一下:

  IDEA新建项目-选择webapp项目(上面创建的都是quickstart项目):

    

  

  选自己安装的maven

   

  完成即可:

   

  提示需要导入依赖,导入即可: 



   把为未创建的文件夹创建一下:

   

  添加 javax.servlet ,在仓库中搜索,将坐标复制到pom.xml配置中.

  使用package 将其打包发布,用支持的容器运行.可以直接配置一个jetty maven插件作为容器

  

  将其坐标复制到plugin标签中

新建一个命令,使用jetty:run运行.

  运行成功,访问http://127.0.0.1:8080 测试一下

  

  使web项目在package时运行容器:

  

  停止容器:

明天的计划:

  明天休息,完成17小节,把jdbc、jdbctemplate、mybatis走一遍.

遇到的问题:

  主要是maven的项目教程都是由eclipse演示的,IDEA都是自己慢慢摸索的,把流程过一次大概的都有了解了,主要是pom.xml配置,IDEA找不到maven projects窗口的在Help->Find Actions搜索maven projects就可以了,我找了半天eclipse那种运行命令的方式.

  收获:

   昨天做maven时只知道按教程做,做完有点懵.今天重新系统的过了一遍,以后Maven遇到问题也知道怎么解决了.


返回列表 返回列表
评论

    分享到