发表于: 2018-02-25 22:59:20
1 627
完成的事情:
昨天第一次接触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遇到问题也知道怎么解决了.
评论