Maven的安装和配置
1、mvn -v检验windows下maven是否安装成功
2、Maven下的bin目录的文件
A:其中mvn是基于unix平台的shell脚本
B:mvn.bat是基于windows平台的bat脚本
C:在命令行输入一条mvn任意命令,都是调用这些脚本
3、maven的boot下的文件是一个类加载器框架
4、用户目录/.m2/settings.xml为用户范围的配置文件
Maven目录/conf/settigs.xml为全局范围的配置文件
Maven使用入门
5、POM,project object model项目对象模型
6、Model version指定当前pom模型的版本,maven2和maven3只能是4.0.0
7、Clean告诉清理输出目录target,在项目的根目录下
8、Compile告诉maven编译项目主代码
9、依赖默认的范围是compile,对主代码和测试代码有效,可通过<scope></scope>来进行设置
10、范围是test,对测试代码有效
11、没设置setting文件的时候,maven默认是从http://repo1.maven.org/maven2中去下载jar包
12、Surefire是maven负责执行测试的插件,由它来运行测试用例,并输出测试服务
13、Pom没有指定打包类型,默认是jar
14、打包命令:mvn chean package
15、测试命令:mvn clean test
16、打包后的jar包是位于target的输出目录中
17、Mvn clean install把打包的包安装到maven的本地仓库中,只有插件安装到本地仓库中,其他maven项目才能使用它
18、执行test之前先执行compile,执行package先执行test,执行install之前先执行package
19、用maven-shade-plugin插件可以生成可执行jar
20、Mvn archetype:generate生成项目骨架,实际运行的插件是maven-archetype-plugin
21、默认的骨架是maven-archetype-quickstart
坐标和依赖
22、Maven坐标的元素:groupId,artifactId,version,packaging,classifier
默认情况下,maven生成的构建,其文件名会以artifactId作为开头。
groupId,artifactId,version这三个必须定义
Packaging可选的
Classifier不能直接定义
23、项目构建文件名artifactId-version[-classifier].packaging
24、使用mvn clean install构建工程,maven这时候才会根据pom配置自动下载所需要的依赖构件,执行编译、测试、打包等工作
25、编译classpath:在编译项目主代码的时候需要使用
测试classpath:在编译和执行测试的时候会使用
运行classpath:实际运行maven项目的时候
26、依赖范围:
Compile(默认):编译、测试、运行classpath
Test:测试classpath
Provided:编译和测试classpath,如servlet.api
Runtime:测试和运行,如jdbc驱动
27、maven会解析各个直接依赖的pom,将那些必要的间接依赖,以传递性的形式引入到当前的项目中
28、当第二直接依赖的范围是compile的时候,传递性的依赖与第一直接依赖范围一致,当第二依赖是test的时候,依赖不会传递
29、当依赖进行传递性引入冲突的时候,会有两种依赖调节的方法:
A:依赖的寻找路径最短优先,当路径相同的时候
B:在pom的依赖声明的顺序决定了谁会被解析使用
29、当B项目使用可选依赖,<optional>true</optional>的时候,该依赖只会对项目B产生影响,当其他项目依赖B的时候,这个依赖不会被传递
30、Exclusions排除依赖,只需要groupId和artifacId即可
31、查看整个项目的依赖树:mvn dependency:tree
32、可使用properties元素定义maven属性
33、Mvn denpendency:list查看依赖列表
34、mvn denpendency:analyze可以帮助分析当前项目的依赖,但是只会分析编译主代码和测试代码需要用到的依赖,一些执行测试和运行时需要的依赖它发现不了
35、use undeclared denpendencies:指项目中使用到的,但是没有显示声明的依赖
最佳实践:显示声明任何项目中直接用到的依赖,因为传递性依赖的版本号等可能发生变化
仓库
36、构件:任何一个依赖、插件、项目构建的输出
37、Maven大概的仓库存储路径:groupId/artifactId/version/artifactId-version.packaging
38、Maven先查看本地仓库,如果没有此构建,就去远程仓库查找,有的话下载到本地仓库,没有的话报错
39、Setting.xml的localReponsitory设置本地仓库的地址
40、一个构件只有在本地仓库中之后,才能由其他maven项目使用
41、Install插件的install目标将项目的构建文件安装到本地仓库
42、安装好maven后,本地仓库目录是不存在的,但输入第一条maven命令后,才会创建,maven安装目录/lib/maven-model-buider-3.0.jar里面有个pom文件,该pom是所有maven项目都会继承的超级pom,里面设置了默认的中央仓库,并定义了Id为contral。
43、当maven下载构件的时候,它从私服请求,如果私服上不存在此构件,则从外部的远程仓库下载,缓存在私服上之后,再为maven的下载提供服务。
44、在setting.xml文件中,respositories元素下可以使用respositionry子元素,声明一个或者多个远程仓库。
45、Respository元素下的releases和snapshots元素的enabled为true表示会下载该类型,为false表示不会下载该类型。
元素updatepolicy用来配置从远程仓库检查更新频率,默认是一天检查一次,元素checksumpolicy用来配置maven检查检验和文件的策略,当构件被部署到maven仓库中时,会同时布置对应的校验和文件
46、setting.xml的server节点是用来配置认证信息,且id需要与respository中的id一致
47、Mvn clean deploy会将项目构建执行的构件部署到配置对应的远程仓库,pom文件的distributionManagement节点包含respository和snapshotRepository子元素,前者表示发布版本的构件,后者表示快照版本的仓库
48、快照版本因为每次构件都带有时间戳,所以可以自动检查更新并下载,但是默认是每天检查一次更新,可以使用mvn clean install -U强制检查更新
49、Maven-metadata.xml为元数据,用于检查更新使用。该xml列出了仓库中存在的该构件所有可用的版本
50、如果仓库x可以提供仓库y存储的所有内容,那么就可以认为x是y的一个镜像
生命周期和插件
51、Maven声明周期:项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成。实际的任务都是交由插件插件
52、每个构建步骤都可以绑定一个或者多个插件行为,而且maven为大多数构建步骤编写并绑定了默认插件
53、针对编译的插件maven-compile-plugin,针对测试的插件maven-surefire-plugin
54、三个周期:
A:clean清理项目
B:default构建项目
C:建立项目站点
55、maven-dependency-plugin是基于项目的依赖
56、Dependency:tree 前面是插件前缀,插件目标,如compile:compile,eclipse:eclipse
57、
生命周期阶段 |
插件目标 |
执行任务 |
Process-resources |
Maven-resources-plugin:resources |
复制主资源文件至输出目录 |
Compile |
Maven-compile-plugin:compile |
编译主代码至主输出目录 |
Process-test-resources |
Maven-resources-plugi:testResources |
复制测试资源文件至测试输出目录 |
Test-compile |
Maven-compile-plugin:testCompile |
编译测试代码至测试删除目录 |
test |
Maven-surefire-plugin:test |
执行测试用例 |
Package |
Maven-jar-plugin:jar |
创建项目jar包 |
Install |
Maven-install-plugin:install |
将项目输出构建安装到本地仓库 |
Deploy |
Maven-deploy-plugin:deploy |
将项目输出构件部署到远程仓库 |
58、maven-source-plugin创建源码jar包
59、有很多插件的目标在编写时已经定义了默认绑定阶段
60、用户可以在maven命令中使用-D参数,并伴随一个参数键-参数值的形成,来配置插件目标的参数
61、参数-D是java自带的,其功能是通过命令行设置一个java属性
62、输出默认的groupId为org.apache.maven.plugins
63、使用插件的时候,虽然有默认的解析机制,但是还是最好显示地设置参数版本,以免插件频繁更新不稳定
聚合和继承
64、对于聚合模块来说,其打包方式packaging的值必须为pom,否则就无法创建,用于可以通过一个打包方式为pom的maven项目中声明任意数量的module元素,实现模块的聚合
65、子模块隐式地从父模块继承了groupId和version的两个元素
66、可继承的模块如下:
A、groupId:项目组ID,项目坐标的核心元素
B、Version:项目版本,项目坐标的核心元素
C、Description:项目的描述信息
D、Organization:项目的组织信息
E、inceptionYear:项目的创始年份
F、Url:项目的URL地址
G、Developers:项目的开发者信息
H、Contributors:项目的贡献者信息
I、distributionManagement:项目的部署配置
J、issueManagement:项目的缺陷跟踪系统信息
K、ciManagement:项目的持续集成系统信息
L、Scm:项目的版本控制系统信息
M、mailingLists:项目的邮件列表信息
N、Properties:项目的依赖配置
O、Dependencies:项目的依赖配置
P、dependencyManagement:项目的依赖管理配置
Q、Repositories:项目的仓库配置
R、Build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
S、Reporting:包括项目的报告输出目录配置、报告插件配置等
67、maven提供的dependencyManagement元素,既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性,有dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用
68、denpendencies里面的依赖子模块都会被动继承
69、如果子模块不声明依赖的使用,即使该依赖已经在pom的denpencyManagement中声明了,也不会产生任何的实际效果。强烈推荐这种感,可统一项目依赖的版本。
70、Import范围:使用该范围的依赖通常指向一个pom,作用是将目标pom中的denpencyManagement配置导入并合并到当前pom的denpendencyManagement元素中
71、pluginManagement元素帮助管理插件,该元素中配置的依赖不会造成实际的插件调用行为,当pom中配置了真正的plug的元素,并且其groupId和artifiId与pluginManagenment配置的插件匹配时,pluginManagement的配置才会影响实际的插件行为
72、如果子模块不需要使用父模块的pluginManagement配置的插件,可以尽管忽略,如果子模块需要不同的插件配置,则可以自行配置以覆盖父模块的配置
73、当父模块在上一级目录时不再需要relativepath,否则需要指定父模块pom的位置
74、超级pom在/lib/maven-model-builder-x.x.x.jar中的根目录下
75、Maven中在超级pom中关于项目结构的定义和约定
76、Maven按序读取pom,如果该pom没有依赖模块,那么就构建该模块,否则就先构建其他依赖模块,如果该依赖还依赖其他模块,则进一步先构建依赖的依赖
77、构建指定的模块-pl,中间间用逗号隔开,mvn clean install -pl acount-email
78、Public Respositories:将仓库组所有策略为Release的仓库聚合并通过一致的地址提供服务
79、Public Snapshot Repositories:该仓库组将上述所有策略为Snapshot的仓库聚合并通过一致的地址提供服务
使用maven进行测试
80、Kaptcha是一个用来生成验证码(Captcha)的开源类库
81、在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/java/)下所有符合一组命令模式的测试类。这组模式为:
A、**/Test*.java:任何子目录下所有命名以Test开头的java类
B、**/*Test.java:任何子目录下所有命名以Test结尾的Java类
C、**/*TestCase.java:任何子目录下所有命名以TestCase结尾的java类
82、-DskipTests:跳过测试运行
83、-Dmaven.test.skip=true:跳过侧四编译和运行,同时控制了maven.compile-plug和maven-surefire-plugin的执行
84、-Dtest=类名:表示指定要运行的类名
85、Mvn cobertura:cobertura测试覆盖率报告
使用maven构建web应用
86、account-web依赖servlet-api和jsp-api这两个几乎所有web项目都要依赖的包,它们为servlet和jsp的编写提供支持,需要注意的是,这两个依赖的范围是provided,表示它们最终不会打包至war文件中,这是因为几乎所有web容器都会提供这两个类库,如果war包中重复出现,就会导致潜在的依赖冲突问题
87、finalName该元素用来标识项目生成的主构建的名称,该元素的默认值已在超级pom中设定,值为${project.artifactId}-${project.version},因此代码可能会变成account-web-1.0.0-SNAPSHOT.war。可以使用<finalName>account</finalName>
88、自动化的web测试技术,如selenium
89、Jetty等容易的scanIntervalseconds:自动扫描项目变更的时间间隔
90、Cargo是一组帮助用户操作web容器的工具,它可能帮助用户实现自动化部署
91、版本号:1.3.4-bata-2
该项目或者产品的第一个重大版本的第二个次要版本的第四次增量版本的beta-2里程碑
<主版本>.<次版本>.<增量版本>-<里程碑版本>
92、svn的几点:
A、主干:项目开发代码的主体
B、分支:从主干的某个点分离出来的代码拷贝
C、标签:用来标识主干或者分支的某个点的状态
灵活的构建
93、${basedir}:项目根目录,${version}:项目版本
94、${user.home}:指向了用户目录,${env.JAVA_HOME}:java_home环境变量的值
95、POM属性:
A、${project.build.sourceDiretory}:项目的主源码目录,默认为src/main/java/
B、${project.build.testSourceDiretory}:项目的测试源码目录,默认为sr/test/java/
C、${project.build.diretory}:项目构建输出目录,默认为target/
D、${project.outputDiretory}:项目主代码编译输出目录,默认为target/classes
E、${project.testOutputDiretory}:项目测试代码编译输出目录,默认为target/test-classes
F、${project.groupId}:项目的groupId
G、${project.artifactId}:项目的artifactId
H、${project.version}:项目的version,与${version}等价
I、${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}
95、为主目录开启资源过滤,maven属性配置只有在POM中才会被解析,也就是说${db.username}放到pom中会变成test,但是如果放到src/main/resources/目录下的文件中,构建的时候它将仍然还是会变成test,但是如果放到src/main/resources/目录下的文件中,构建的时候它将仍然还是${db.username}。因此,需要让maven解析资源文件的maven属性
资源文件的处理其实是maven-resources-plugin做的事情,它默认的行为只是将项目主资源文件复制到主代码编译输出目录中,将测试资源文件复制到测试代码编译输出目录中。不过只要通过一些简单的pom配置,该插件就能够解析资源文件中的maven属性,即开启资源过滤。
<resources> <resource> <directory>${project.basedir}/src/main/resources</directory> <filtering>true</filtering> </resource> </resources>
为测试资源目录开启过滤
<testResources> <testResource> <directory>${project.basedir}/src/test/resources</directory> <filtering>true</filtering> </testResource> </testResources>
96、mvn clean install -Pdev -P参数表示在命令行激活一个profile
97、默认激活
<profiles> <profile> <id>dev</id> <properties> <!--第一种配置--> <db.drive>${db.drive}</db.drive> <db.url>${db.url}</db.url> <db.username>${db.username}</db.username> <db.password>${db.password}</db.password> <!--第二种,引用外部的properties文件--> <configPath>src/main/resources/config/dev</configPath> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles>
98、mvn help:active-profiles:当前激活的profile
99、Mvn help:all-profiles:列出当前所有的profile
<sourceDirectory>src/main/java</sourceDirectory> <resources> <resource> <directory>src/main/resources</directory> </resource> </resources> <outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory> <testOutputDirectory>src/main/webapp/WEB-INF/classes</testOutputDirectory>
maven在pom资料里引用本地jar
maven在pom文件里引用本地jar
方法1:
<dependency> <groupId>org.wltea</groupId> <artifactId>IKAnalyzer</artifactId> <version>2012_u6</version> <scope>system</scope> <systemPath>E:/repositories/IKAnalyzer2012_u6.jar</systemPath> </dependency>
方法2:
<dependency> <groupId>org.wltea</groupId> <artifactId>IKAnalyzer</artifactId> <version>3.2.8</version> <scope>system</scope> <systemPath>${basedir}/mylib/IKAnalyzer-3.2.8.jar</systemPath> </dependency>