-
目录结构:
src
-main
--java
-test
--java
resource
查看全部 -
课程总结
【一】maven下载和环境搭建:如何在windows下安装maven,主要是配置了maven 的环境变量,分别是建一个pom变量指向maven的安装目录,然后为能在maven 的命令行中使用maven命令,然后将Path路径指向maven的bin目录。
【二】maven目录骨架说明:学习了maven的基本骨架src——>main——>java——>主代码,src——>test——>测试代码,用于测试用例存放的路径,并且要在maven项目的根目录中存放pom.xml用于管理项目依赖和构建构成。
【三】常用的maven命令:介绍了常用命令以及使用archetypes自动生命maven的目录骨架。
【四】仓库和坐标:如何修改仓库位置,和坐标的基本概念
【五】在eclipse安装和创建maven项目
【六】生命周期,pom.xml以及依赖、聚合、继承:对pom中常用的标签进行了解析
【七】eclipse中使用maven插件创建web项目和jetty插件的安装,并在jetty和tomcat容器中进行运行。
查看全部 -
使用maven构建Web项目(介绍如何使用maven创建web项目,如何安装jetty插件和tomcat插件,并简介如何将项目打包到jetty和tomcat 中,并运行。)
案例:
描述:新建maven项目,这里使用webapp的模板(Group Id为org.apache.maven.archetypes,Artifact Id为maven-archetype-webapp),项目的Group Id为com.imooc.webdemo,Artifact Id为webdemo,项目里的index.jsp有×号,是因为没有ServletAPI的原因,所以需要在pom.xml中添加Servlet的依赖,打开浏览器进入maven的中央仓库,(https://mvnrepository.com/)搜索Servlet,点击3.0.1,将Servlet的坐标复制到pom中,为该坐标设置scope为provided,也就是说只在编译时和测试时运行,然后将junit的版本更改为4.10,接下来检查为我们创建的目录是否正确,只为我们创建了资源目录,所以按照maven的约定我们手动创建其他目录,在Java Resource下,只为我们创建了资源目录,按照maven的约定,手动创建其他目录,点击Java Resource选择New——>Source Folder,Project名为maven项目名,Folder name为src/main/java,然后再创建存放测试用例的目录,Folder name为src/test/java,如果无法创建目录,在Navigator视图下src的main下进行创建,再转到Explorer视图,进行更新Maven——>Update Project,这样存放资源文件的目录就显示出来了,接下来需要检查,classes文件的输出路径,项目上右键Build Path——>Configuration Build Path,点击source,如下图二为输出路径,确保它的输出路径为target/classes,接着要把项目转化成Web项目,项目上右键Properties——>Project Facets选上Dynamic Web Module,接下来需要修改部署时的默认配置,项目右键Properties——>Deployment Assembly,里面除了主代码的目录之外,测试目录的代码依旧是在发布时部署上去的,这里要将其删除,因为最终发布产品时,我们并不需要这些测试的文件,这样一个Web项目就创建成功了,访问的网址为:localhost:8080/webdemo/。
使用package命令将其打包,也就是打成war包,然后将其拷贝到支持的web容器中,项目就可在浏览器中进行访问了,这里使用jetty作为web容器。
首先在<builder>标签中添加jetty插件,jetty插件去maven的中央仓库中搜索Jetty Maven Plugin,使用的是最新的版本,把该插件的坐标复制到pom的<builder><plugins><plugin>标签中,然后启动一下,Run as——>Maven build,Goals输入jetty:run,如果控制台显示Started Jetty Server表明Jetty容器启动成功了,这样就可以在浏览器访问该项目了,访问http://localhost:8080/出现HelloWorld代表成功,如果想在打包的阶段直接运行jetty插件,可以在Jetty的坐标中添加<executions><execution>指定它的阶段,也就是package阶段运行目标,<phase>package</phase><goals>run</goal></execution></executions>目标为run如图三,在打包成功后使用jetty:run来运行jetty服务,然后右键项目,run as——>Maven build,Goals:输入clean package,访问localhost:8080出现hello world表示成功,如果要使用Tomcat作为容器,需要加入一个Tomcat的插件,进入Tomcat的官网,点击Maven Plugin,找到Version2.2,这里面有个例子,将它的坐标复制到pom中,如图4。
查看全部 -
maven聚合和继承
maven聚合:如果想在maven中将多个项目进行install,将其安装到本地仓库中,必须对其依次执行install命令,maven中有一种方式可以将其放到一起运行,这种方式称为聚合。
案例:将山鸡、南哥、B哥聚合到本地仓库中,这里需要新建一个maven项目,依旧使用quickstart模板,Group Id为com.hongxing,Artifact Id为hongxing-aggreation,它作为其他pom的容器,需要修改它的pom的<package>为pom</package>,然后使用<modules><module>B哥的maven项目名</module><module>南哥的maven项目名</module><module>山鸡的maven项目名</module></modules>,然后右键hongxing-aggreation的Maven——>Maven build,Goals输入clean install控制台输出结果为三次构建,第一次生成B哥的jar,并且将其安装到本地仓库中,第二次生成南哥的jar,并且将其安装到本地仓库中,第三次生成山鸡的jar,并且将其安装到本地仓库中。
继承:三个maven项目中都有一个共同的特点,就是都使用了junit,并且在每个项目的pom.xml中,都对其进行了配置,比如说b哥的maven使用了如下图,这样就出现了很多重复的地方,其实maven中可以想java中一样,将其共同的特性封装成一个父类,所以新建一个maven项目,Group Id为com.hongxing,Artifact Id为hongxing-parent,然后修改它的pom.xml,要将<dependencies>标签放置在<dependencyManagement>标签里,如果使用这个标签对依赖进行管理,它并不会在这个项目中运行,也可以将junit的版本号提取出来,在外面定义一个<properties>属性,并在该属性里通过<junit.version>设置junit的版本号,这样就可以在<dependencies>中的<version>中像使用EL表达式那样来调用它,${junit.version},最后将它的<package>改成pom,然后打开B哥的pom让其继承pom,这里就可以将junit的版本号进行删除,<scope>也可以删除掉,这里要使用到<parent>标签,然后引入我们的parent的maven的坐标,这样junit已经从父类parent,也就是pom中继承过来了。
src目录依然有报错,其实test目录和main目录,对于parent的pom来说,是没有作用的,可以将其进行删除,然后更新一下它,Maven——>Update Project,这个叉号就消除了。
查看全部 -
maven依赖冲突:如果有A(南哥)和B(B哥)依赖了一个不同版本相同的构件(commons-io),那么对于依赖于AB的C(山鸡哥)来说,它究竟依赖于A和B的哪一个版本的构件,这里有两条原则。
原则1:短路优先:优先解析路径短的版本,加入有以下的依赖,假如有以下的依赖,A依赖B,B依赖C,C依赖X,X可以理解为一个jar。A依赖D,D依赖X。会优先解析路径短的这个版本。
案例:B哥依赖commons-io的2.4版本,南哥依赖的是commons-io的2.0版本
描述:这里使用到了一个新的依赖,https://mvnrepository.com/输入commons-io,点击第一个,会出现很多的版本,使用2.4和2.0
点击了这个版本之后,会出现该构件的坐标,为B哥复制的依赖时Commons-io的2.4版本
原则2:先声明先优先:如果路径长度相同,则谁先声明,先解析谁
案例2:
南哥不在依赖B哥,所以删除南哥pom中依赖B哥的标签,山鸡哥同时依赖南哥和B哥,也就是说山鸡依赖的路径长度相同,但是依赖B哥的标签在依赖南哥标签的前面,这样就可以看到山鸡依赖的是B哥所依赖的jar包2.4。
查看全部 -
maven依赖传递
举例:古惑仔电影中,山鸡和南哥混,南哥和B哥混,对于山鸡而言就间接和B哥混了,换成程序而言,山鸡依赖南哥,南哥依赖B哥,山鸡就就依赖传递B哥了。
案例:
描述:新建3个maven项目,选择quickstart模板,第一个Group Id为com.hongxing,Artifact Id为hongxing-bge,Package为默认的,第二个Group Id为com.hongxing,Artifact Id为hongxing-nange,第三个Group Id为com.hongxing,Artifact Id为hongxing-shanji。
步骤1:南哥依赖于B哥,南哥的pom.xml中进行配置,引入B哥的依赖,需要知道B哥的坐标,然后编译一下南哥,Maven——>Maven build(在Goals:compile)。
南哥的maven项目首先会到本地仓库中进行查找B哥的jar包,如果本地仓库中没有,则会从远程中央仓库中下载,如果远程中央仓库中没有,则会报错,我们先将B哥进行打包,Maven——>Maven build(Goals:clean package),然后再将B哥安装到本地仓库中Maven——>Maven build(install),它依然会编译,并且会测试一遍,并且安装到指定的仓库中,接下来再对南哥进行编译Maven——>Maven build(clean compile),这样南哥就构建成功了。
步骤2:山鸡依赖于南哥,首先,要打包南哥的maven项目,并进行安装到本地仓库中Maven——>Maven build(clean install),依旧要找到南哥的坐标,然后编译一下山鸡Maven——>Maven build(compile)
依赖具有传递性,山鸡的maven项目并没有依赖B哥,B哥的依赖缺自动的加入到了山鸡的依赖目录里。排除依赖:依赖南哥的<dependency>标签中添加<exclusions><exclusion>B哥的坐标<exclusions><exclusion>
举例:山鸡只听从南哥的吩咐,不听其他人的吩咐,将B哥的依赖从山鸡的maven项目依赖中排除,。
产生如下图JRE System Library为J2SE1.5的原因是:maven默认使用jdk1.5,我们可以将其修改,点击JRE System Library的Properties属性,选择JavaSE-1.7(jre7),这样修改比较麻烦每次创建一个项目都需要修改一下,可以修改settings.xml,找到<profiles>大概182行,加入如下图片的代码,指定它默认的jdk为1.7。
查看全部 -
maven依赖范围
通过junit依赖来讲解依赖的范围<scope>
我们平时开发时,如果使用某一框架,就要引入相应的jar包到项目的classpath路径中,这样我们的项目就可以使用框架封装好的一些方法。
maven中提供了三种classpath:
1、编译
2、测试
3、运行
而我们使用junit依赖范围的值为test,这就表明了junit只存在测试的classpath中,也就是存在测试的范围,所以依赖范围就是控制依赖与三种classpath的关系的。
具体的scope的属性:查看maven官网(maven.apache.org),查看它的文档,点击Index (category),找到The Dependencies and Dependency Exclusions,找到Dependency Scope,提供了6种scope,分别是
compile:默认的范围,如果没有指定依赖范围,就会使用此依赖的范围的maven依赖,编译测试运行这三种classpath都有效。
provided:编译和测试时都有效,最后运行不会被加入(举了一个例子,当我们构建一个JavaEE的Web应用时,可以依赖ServletAPI,但是在最后运行时,并不会被加入,因为Web容器已经包含了这个API,如果再加入就会导致冲突)。
runtime:在测试和运行时有效,典型的例子就是jdbc驱动的实现,项目的主代码的编译只需要jdk提供的jdbc的API,只有在执行测试或者运行项目的时候才需要实现生成接口的具体jdbc的驱动
test:只在测试时有效,典型应用就是junit。
system:和provided一样,编译和测试时有效,与本机系统相关联,可移植性差,比如要引用本机的Java_Home,如果把项目移植到其他系统上,就可能由于路径的不一致,而导致错误。
import:导入的依赖范围,它只使用在dependencyManagement标签中,表示从其他的pom中继承过来的依赖。
该文档提供了import的例子,将A中的依赖导入到B中。
查看全部 -
maven中Pom.xml解析
Pom.xml:maven项目的核心管理文件,用于项目描述、组织管理、依赖管理、构建信息的管理,Pom中包含了许多的标签。
Pom.xml的常用元素:
<project>是pom.xml的根元素,包含了pom的一些约束信息。
<modelVersion>是一个固定的版本,也是必须的元素,指定了当前pom的版本。
坐标的信息由以下标签组成:
<groupId>主项目的标识,用来定义当前的maven属于哪个实际的项目,和我们为项目创建的包是一样的,是由反写的公司网址+项目名组成</groupId>
注意:maven的项目和实际的项目不是一一对应关系,maven项目体现的是模块化的概念,因此一个实际项目往往会划分成很多的模块。
<artifactId>表示一个模块的标识,实际项目中的一个模块,一般会使用项目名+模块名进行标识,比如struts2项目,它下面可能分为struts2demo01、struts2demo02,struts2是项目名,而demo01和demo02是模块名</artifactId>
<version>标识当前项目的版本号,版本号一般都是由三个数字来组成的,第一个0标识大版本号,第二个0表示分支版本号,第三个0表示小版本号,一般形式可以写为0.0.1snapshot,snapshot为快照的版本,版本除了snapshot,还有内测的测试版本alpha,以及公测版beta,比如在网上玩新出的游戏,经常会有公测不删档,对应的就是该版本,还有Release版本,它是一个稳定的版本,以及GA版本是一个正式的发布版本<version>。
<packaging>maven项目打包的方式,不指定默认打包是jar,还可以打包成其他类型,比如war、zip、pom等<packaging>
其他的标签:
<name>项目的描述名,一般是在产生对象文档时候才会使用</name>
<url>项目的地址</url>
<description>项目的描述</description>
<developers>开发人员的列表,项目发布的时候,可以把开发人员的信息填写进去</developers>
<licenses>许可证的信息,比如经常用到的开源框架,它都会有一些许可证的信息</licenses>
<organization>组织信息</organization>
依赖列表:它是比较重要的,会经常使用到,依赖列表下可以包含多个依赖项,依赖项通过制定它的坐标来确定依赖所在的位置,也就是<groupId><artifactId><version>,还可以指定它的<type>,还可以使用<scope>指定依赖的范围(之前写的junit的测试范围是test,test表示junit,这个构件(junit的jar包),只在测试的依赖范围内有用,比如在主代码中引用junit这个类,它就会报错),<optional>该标签有两个值,分别是true和false,它的作用是设置依赖是否可选,默认是false,子项目默认是false时,子项目默认是继承的,如果为true,子项目必须显示的引入该依赖,<exclusions>是一个排除依赖传递的列表,该标签下可以排除多个依赖通过<exclusion>,作用是:比如Ajar包依赖Bjar包,Bjar包又依赖Cjar包,C对于A来说就是传递依赖,如果A不想依赖C,就可以使用这个标签,比如我们使用的Spirng除了核心的jar包之外,它的jar包还引用其它很多相关的jar包,但对于我们而言只需要使用Spring的jar包,而其他的一些相关的jar包我们并不需要使用。
<dependencyManagement>依赖的管理,也可以通过<dependencies>声明依赖列表,通过<dependency>包含多个依赖,但是它并不会被运行,也就是说它不会被引入到实际的依赖当中,该标签一般主要用于定义在父模块中,供子模块继承用的。比如之前多个maven项目中,都使用到junit,我们就可以抽象出一个父类的模块,然后在父类模块中对junit进行一个定义,其他子模块直接继承该父模块即可。
<build>通常为我们构建的行为来提供相应的支持,我们经常在这里使用到<plugins>表示插件的列表,在该标签下可以有多个<plugin>标签,(我们之前使用到source插件对项目进行打包),在<plugin>中依旧是要指出插件的坐标通过<groupId><artifactId><version>
<parent>以及<modules>:经常使用到的:<parent>通常用于在子模块中对父模块的pom的一个继承,<modules>用来聚合运行多个maven的项目,如果有很多的maven模块是要编译的话呢,我们之前的办法是一个一个的编译,而使用<modules>就可以指定多个的模块,然后在一起进行编译。
查看全部 -
maven的生命周期和插件
拓展:
1、解决不能在eclipse项目中创建maven项目的解决办法:https://www.cnblogs.com/DreamDrive/p/5571913.html
2、https://blog.csdn.net/weixin_42223248/article/details/80809499解决Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:3.0.2 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-resources-plugin:jar:3.0.2
我们之前使用到clean、compiler、test、package、install,这几个命令对对象进行操作,这其实也对应了项目完整的构建过程。
完整的项目构建过程包括:清理——>编译——>测试——>打包——>集成测试——>验证——>部署,等步骤。
maven将这个过程进行了抽象,实际上maven和插件是密不可分的,maven抽象出了项目构建的生命周期,而插件是对maven抽象的具体实现,比如我们对项目进行编译,那么compiler就对应了maven compiler plugin。
maven中定义三套独立的生命周期:分别包括clean、default、site,这三套生命周期是相互独立的,每个生命周期又包含一些阶段,各个生命周期的阶段是有顺序的,且后面的阶段依赖前面的阶段,执行每个阶段时,其前面的阶段会依次顺序执行,但不会触发另外两套生命周期的任何阶段,就好像之前使用到的package命令,该命令用于打包,虽然在运行package命令之前,并没有compile和test,但当我们运行package之后,它的compile和test是依次执行的,也就是运行package这个阶段时,compile和test会自动的运行。
1、clean:目的是来清理项目,它又分为三个阶段。
pre-clean执行清理前的工作
clean清理上一次构建生成的所有文件
post-clean执行清理后的文件
2、default:目的是来构建项目(生命周期中最核心,包含了构建项目时所要执行的步骤),阶段比较多,常用阶段有以下几种。
例如:compile test package install,默认都是default这个生命周期中的。
3、site:生成项目的站点,会根据pom种的信息,自动生成一个站,它又分为以下几个阶段。
pre-site:在生成项目站点前要完成的工作。
site:生成项目的站点文档。
post-site:在生成项目站点后要完成的工作。
site-deploy:发布生成的站点到服务器上。
eclipse支持java、C、C++、PHP等开发语言,eclipse中也可以使用它的sql插件来访问数据库,而eclipse的基本版本默认仅是支持java的,其它许许多多的功能都是由于第三方的插件来实现的,单单对maven而言,它没有什么执行业务的功能,它的下载包也非常小,maven中所有的命令也是调用这个插件来实现的,maven的官网中提供了很多的插件,在plugins都是它的插件。
使用source插件:source插件可以将项目源码进行打包,需哟在pom.xml中加入一个插件如下图一,当运行target命令时,就可以将项目源码进行打包,所以要绑定source到default生命周期package阶段,如下图二,也就是说在这个阶段要运行source这个插件,至于目标可以查看maven官网source插件的目标,有五个目标,我们可以使用其中一个。如图三,然后run as——>maven build如下图4,当运行完package命令后,项目自动的帮我们完成了编译、测试、以及对该项目的打包,并且生成了source.jar包,说明对生命周期的阶段而言,执行某个阶段时,其前面的阶段会依次顺序的执行。
拓展:
【a】IntelliJ IDEA 可以参考这篇文章
https://liuyanzhao.com/6012.html【b】给大家推荐 一个中央库 http://www.mvnrepository.com/ 重点是可以自动把坐标写好了 直接复制就好了。
【c】给你们个博客看看
https://www.cnblogs.com/hongwz/p/5456578.html【d】eclipse配置jdk以适应maven,感觉讲的太复杂了绕晕了。
推荐:https://blog.csdn.net/nmjuzi/article/details/82352624【e】https://blog.csdn.net/GDUTACMA2011149/article/details/50993257解决Could not calculate build plan:Plugin org.apache.maven.plugins:maven-resources
查看全部 -
<scope>classpath范围,只能用于什么范围</scope>
compile:默认的范围,编译测试运行都有效
provided:在编译和测试有效
runtime:在测试和运行时有效
编译
测试(test)范围有效
运行
查看全部 -
<project>:他包含了pom的约束信息
<modelVersion>指定了pom的版本</modelVersion>
<packaging>maven项目打包的方式,不指定默认是jar包,还可以war包,zip包</packaging>
<name>项目的描述名</name>
<url>项目的地址</url>
<description>项目描述</dscription>
<developes>开发的人员的信息</developes>
<licenses>许可证信息</licenses>
<organization>组织信息</organization>
<dependencies>依赖列表
<dependencies>
依赖项(可以包含多个)
依赖项用坐标确定依赖的位置
<groupId></groupId>
...
<type>类型</type>
<scope>依赖的范围(test(只能在test里面用))</scope>
<optional>设置依赖是否可选(默认是false)</optional>
<executions>
排除依赖的传递列表(可以排除多个依赖)
<execution ><execution>
</executions>
</dependencies>
<dependencyManagementy>依赖的管理</dependencyManagementy>
<build>
插件列表
<plugins>
<plugin>坐标</plugins>
</plugins>
</build>
<parent>用于子模块对父模块的pom的继承</parent>
<modules>指定多个模块一起编译</modules>
查看全部 -
<groupId>项目的包名</groupId>
<artifactId>模块名</artifactId>
<version>版本号</version>
查看全部 -
一、eclipse中安装maven插件(如果eclipse是4.0以上或者myEclipse就不用安装插件了)
1、插件放置在eclipse中的dropins文件夹下,并重启eclipse。
2、Maven需要jdk支持,而eclipse已经添加了jre,根据提示修改eclipse.ini。
3、eclipse-ini文件中
512m下添加-vm
再在底下添加jdk的bin目录的路径+javaw.exe
4、修改eclipse默认的jre(eclipse运行在JRE之上,maven使用到了JRE的支持,所以要修改eclipse的JRE,使其可以找到JDK,使用目录中私有的JRE,这样就能完全解决这个问题,默认的JRE没有一些包)
Preferences——>Java——>Installed JREs——>Add——>我们安装JDK的位置
Preferneces——>Maven——>Installations——>Add——>我们安装的Maven的位置
5、修改User Settings(找到settings.xml)
二、创建Maven项目
1、目录模板选择maven-archetype-quickstart
2、运行Maven项目——》右键run as——》Maven Builder——》输入compile点击run即可
3、Maven打包——》右键run as——》Maven Builder——》package(打包之后在项目根目录中就会有一个target文件夹,该文件夹下就会有该jar包
查看全部
举报