概述
jar包下载到lib目录下:有用没有,冲突,是否因关联而不可删除。
maven,ant,gradle都是用来解决jar包下载的问题。
maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。更好的管理项目,是一套强大的自动化工具。覆盖了编译、测试、运行、清理、打包和部署。贯穿了整个项目周期,提供了一个仓库的概念,统一管理项目依赖的第三方jar包,最大程度降低因环境问题导致的兼容性问题。
下载maven包后解压。bin目录中包含mvn的运行脚本。boot包含一个类加载器的框架。conf是配置文件目录。lib下是maven平时所用的类库,除了maven自身的,还包含第三方依赖的类库。
环境变量的配置:
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_91:没有\bin
MAVEN_HOME=E:\apache-maven-3.3.9
Path=%MAVEN_HOME%\bin
Path=%JAVA_HOME%\bin
maven的目录结构
src
-main
-java
-package
-test
-java
-package
resources
pom.xml文件的写法:
对于一个struts项目,找到struts源码文件的lib目录下的core的jar包,将其打开,找到maven中的pom文件,拷贝出来,保存到其他位置并打开。
删去无关项:仅保留第一行、project、modelversion(代表maven版本(4.0.0是固定的))。新增:groupId:项目的包名、artifactId的值是模块名、version版本名、dependencies依赖(里面每个依赖都要有上面三项)
都写好后,放到src一级的目录下
编译:mvn compile
测试:mvn test
给项目生成jar包:mvn package
查看maven版本:mvn -v
删除target:mvn clean//target中存放的是编译好的字节码文件和测试报告(report)
安装jar包到本地仓库中:mvn install
某个类不存在,即找不到某个类:通常是吧包含这个类的jar包添加到classPath路径中。maven提供了另外一种方法:
- 进入到被引用的(即被找不到的)那个类中的目录中
mvn install//包含缺失类的jar文件发布到本地仓库中 - 配置pom,新增依赖
<dependency>缺失类的jar包的坐标(groupId、artifactId、version)</dependency> mvn compile看是否会BUILD SUCCESS
在运行mvn compile进行编译的过程中,程序用到了其他的知识包,会到pom.xml上查找是否引入了该依赖包的坐标。若引入,则到本地仓库中查找,若有,maven会将该jar包加入到项目的classPath中,否则会从网上maven的中央仓库中去查找下载到本地仓库中供项目使用。
maven自动建立目录骨架
开发项目第一步:创建相应的目录来存放我们的项目资源和代码。
archetype插件:用于创建符合maven规定的目录骨架。
方法一:mvn archetype:generate:按照提示进行选择
- 然后选择archetype版本号:以6为例。
- 依次输入groupId,artifactId,version,package。
方法二:mvn archetype -DgroupId=com.snjsdcn.maven04(组织名、公司网址的反写.项目名) -DartifactId=maven04-demo(项目名-模块名) -Dversion=1.0.0SNAPSHOT(版本号) -Dpackage=com.scidsnas.maven04.demo(代码所存在的包名:groupId+artifactId):一次进行所有设置
maven中的坐标和仓库
任何一个依赖、插件、项目构建的输出都可以被称之为构件,构件通过坐标作为其唯一的标识。groupId,artifactId,version:就是项目的坐标,构成项目唯一的标识。包名应该与groupId,artifactId相吻合。
仓库:就是用来管理项目的依赖的。本地仓库中没有,则会到远程仓库(全球仓库)中查找。远程仓库中一般都会有我们所需的各种jar包的版本。
全球仓库的地址:lib目录下:maven-model-builder解压后的pom-4.0.0.xml(这是个超级pom,所有的pom都会继承自这个pom),<respository>里的地址就是默认的全球中央仓库的地址。
镜像仓库:提供了和国外的一样的功能。修改要镜像仓库所需的配置:
maven的安装目录下的conf文件夹下的settings.xml找到mirror。
<mirror>
<id>maven.net.cn</id><!--表示该镜像仓库的Id-->
<mirrorOf>central</mirrorOf><!--为哪个id的仓库配置镜像-->
<name>central mirror in china</name><!--指定仓库名-->
<url>http://maven.net.cn/content/groups/public</url><!--指定URl,所有对原中央仓库的访问都会变成对新的URl的访问-->
</mirror>
如何更改仓库的位置:maven从远程仓库中下载构件,默认是存放在当前用户目录中.m2的respository里面。一般不想放在C盘中。更改方法:
maven的安装目录下的conf文件夹下的settings.xml找到localRespository。直接更改路径。
将settings.xml文件直接复制到更改后的目标路径文件夹中,这样更新maven版本时,就不必再修改settings.xml。
在eclipse中安装maven插件以及创建maven项目
将maven插件安装到eclipse安装目录的dropins文件夹下,重启eclipse。
maven的运行需要JDK,而eclipse是运行在JRE上的。
解决办法:
- 根据提示修改eclipse.ini文件。进入eclipse根目录,打开eclipse.ini文件。在里面添加
-vm和JDK的安装路径\javaw.exe保存。 - 修改eclipse默认的JRE,让其可以找到JDK。(有的时候tools.jar报错就是因为eclipse运行的JRE中没有tools.jar,而JDK中有):
eclipse操作:点击Java→install JRE→打开JDK的目录→确定勾选 - 更改maven配置成本机的maven:
maven→Installation→maven的安装路径 - 修改settings.xml的路径:
maven→User Settings→settings的路径
用dropins安装zip插件遵循的原则
1.查看下载的zip包,如果是类似于update-site的zip包,其实这是离线更新包,正确的安装用法应该是用Eclipse Local update site installation.->这种包不应该放到dropins,即便有几率会成功,但是是非常规手段。
2.虽然有些zip包名字是类似update-site的包,但是其解压缩后只有features和plugins两个子目录而没有额外的东西,这样的包其实很多直接解压放到dropins目录下进行加载的。
3.查看zip包内容,如果包含content.jar/artifacts.jar/site.xml等文件的,一定要用Local update site installtion.因为这种是插件更新包,是专门用来本地更新安装的,会装额外的依赖等.
运行maven:pom.xml→右键→Run as→maven build→在Goals里面写命令(例如compile、package)→run
maven的声明周期和插件
完整的项目的构建过程包括:清理、编译、测试、打包、集成测试、验证、部署
maven生命周期是相互独立的:
- clean:清理项目
- default:构建项目
- site:生成项目站点
每个生命周期包含了很多阶段,这些阶段是有顺序的,而且后面的阶段依赖于前面的阶段。阶段会顺序执行,但不会触发其他生命周期中的任何一个阶段。
运行package命令时,如果compile、test还未执行,此时会先执行这两个命令。
clean:
- pre-clean:执行清理前的工作
- clean:清理上一次构建生成的所有文件
- post-clean:执行清理后的文件
default(最核心的)包含了构建项目中所需要的步骤: compile test package install
site会根据pom中的信息自动生成项目站点:
- pre-site在生成项目站点前要完成的工作
- site生成项目的站点文档
- post-site在生成项目站点后要完成的工作
- site-deploy发布生成的站点到服务器上
maven中的pom解析
pom.xml是maven项目的核心管理文件,用于项目描述、组织管理、依赖管理和构建信息的管理。
常用元素
- project:根元素,包含一些约束信息
- modelVersion:指定了当前pom的版本
- 坐标信息:groupId(主项目标识,用来定义maven是属于哪个实际的项目的:反写的公司网址+项目名)、artifactId(模块的标识:实际项目中的模块:项目名+模块名)、version(三个数字组成:第一个0表示大版本号,第二个表示分支版本号,第三个表示小版本号;snapshot是快照,alpha是内测版本,beta是公测版本,release版本是一个稳定的版本,GA版本是一个正式的发布版本)、package(maven项目的打包方式,不指定即默认时是jar,还可以打包成war,zip,pom)(maven的项目和实际的项目不是一一对应的关系,maven的项目体现的是一种模块化的概念,一个实际项目会被划分成很多模块)
- 还可以有name标签:项目描述名;URL:项目地址;description:项目描述;developers:开发人员列表;licenses:开源框架的许可证信息;organization:组织信息
- 依赖列表:dependencies,可以包含多个依赖项(dependency),通过指定坐标(groupId,artifactId,version,type,scope(依赖的范围:JUnit的依赖范围是test,即只在测试的范围内有用,在主代码中使用就会报错),optional(设置依赖是否可选,默认是false即继承,若为true则必须显式的引入该依赖),exclusions(排除依赖传递列表:A依赖B,B依赖C,想要排除A对C的依赖:只想要用spring的jar,而其他相关的不想引用),dependencyManagement(依赖管理:在这里面声明依赖列表,但并不会真正被运行:用于定义在父模块中,供子模块继承用:抽象出一个父类模块对JUnit进行定义,其他子模块直接继承),build(对构建行为提供相应的支持:内部定义plugins(插件列表)里面可以包含多个plugin,在plugin里面也要指明坐标),parent(用于在子模块中对父模块pom的继承),modules(用来聚合运行多个maven项目))
maven依赖范围
依赖范围是用来控制依赖与三种classPath(编译、测试、运行)之间的关系:
- compile:默认的范围,编译测试运行都有效
- provided:在编译和测试的时候有效(Servlet API 在本地时需要,但在容器中已经有了该API,就不需要了,否则会导致冲突:即运行时的环境已经provided)
- runtime:在测试和运行时有效(JDBC驱动)
- tese:只在测试是有效(JUnit)
- system:只在编译和测试时有效,与本机系统相关联,可移植性差
- import:导入的范围,它只是用在dependencyManagement中表示从其他的pom中导入dependency的配置
依赖传递
被依赖的一定要在要依赖的compile前打包(clean package→install)(compile不包括打包)
排除依赖:exclusions:
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</exclusion>
</exclusions>
<dependency>
</dependencies>
maven的JRE System Library默认是使用J2SE-1.5(右键→properties),实际是1.7,可以直接修改(这样每次都需要修改)。
经常使用:settings.xml找到profiles,把里面的1.4都改成1.7或者1.8
依赖冲突
A和B依赖了一个不同版本的相同的构件C,冲突:究竟依赖了哪一个版本的构件?
原则:
- 短路优先:优先解析路径短的版本。A→B→C→X(jar);A→D→X(jar)。此时会优先解析路径短的版本。
- 先声明先优先:如果路径相同,则谁先声明,先解析谁。
maven聚合和继承
想将多个项目进行install,将其安装到本地仓库中。maven中提供了一齐运行的方式:聚合。
聚合:
- 新建maven项目:packaging→pom
- 新建modules标签,内含多个module(原来install打包的单元)
- run as→clean package
继承:都使用了同一个依赖,若每个都配置则造成重复代码。可以当成一个父类:
- 新建一个父类,修改其pom。将子类中共同的依赖
<dependency></dependency>放到<dependencyManagement></dependencyManagement>中。在properties属性中可以增加版本信息,此时依赖中的版本信息就可以写作:<version>$(junit.version)</version>(EL表达式) - 将packaging改为pom
- 此时test文件夹上仍然有×号,对于父类来说,test,main没有用途,可以直接删除→maven→Update Project→OK
对于子类来说:
- 删除已经放在公共部分(JUnit)的版本号、scope
- 新增parent标签,引入父类pom的坐标
构建web项目
archetype:web-app
增加servlet的API(scope为provided)
1437

被折叠的 条评论
为什么被折叠?



