学习时笔记,方法自己用时可查阅
一,pop.xml编写
1,在pop.xml中以下四个是基本的元素
modelVsersion 这个在maven2及3来说一般只能是4.0.0
groupId 一般为工程名
artifactId 工程模块名
version 项目版本
二,代码目录强制规定
主代码 : src/main/java/ 包名一般与groupId和artifactId相吻合
主代码资源文件 : src/main/resources/ 放如果properties文件等
默认web资源 : src/main/webapp/ 放jsp,html,css
测试代码 :src/test/java/ 包名一般与groupId和artifactId相吻合
测试代码码资源文件 :src/test/resources
三,maven的主要命令
1,常用
mvn clear
mvn test
mvn clear test
mvn compile
mvn clear compile
mvn package
mvn package install 当install比package多一个打包安装到本地仓库中
2, 生成项目骨架
maven 3
mvn archetype : generate
maven 2
mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate
实际上运行的是 groupId:artifactId:version:generate
... ...
... ...
知识扩展: 按需构建多模块,玩转Maven反应堆
四,依赖关系
1,dependencies结点下dependencie中包含的元素
groupId,artifactId,version:这三个不再多说
type : 依赖的类型,对应项目坐标定义的packaging。大部分情况下,该元素不必声明 ,其默认值 为jar
scope : 依赖的范围
optional : 标记依赖是否可选
exclusions : 用来排队传递性依赖
2,依赖范围(用来控制依赖和三种classpath[编译,测试,运行])
Compile : 编译依赖范围,如果没有指定,则默认为此范围,且对于编译,测试,运行三种classpath都有效
Test : 这种依赖仅对于测试classpath有效。eg: JUnit
Provided : 己提供依赖范围,使用此依赖范围的Maven依赖,仅对于编译和测试classpath有效。eg:serlet-api
Runtime : 运行时依赖。这种依赖对于测试和运行有效。eg: JDBC驱动
System : 系统依赖。这种与Provided范围完全相同,但使用System范围的依赖时必须通过systemPath元素显示地指定 依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且住住与本机系统绑定,可能造成不可移植,因 此应该谨慎使用。systemPath元素可以引用环境变量 需另加:<systemPath>${java.home}/lib/rt.jar</systemPath>
依赖范围 | 编译 | 测试 | 运行 | 例子 |
compile | Y | Y | Y | spring-core |
test | - | Y | - | JUnit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地,maven之外的文件 |
3,传递性依赖 【坚列为第一依赖关系,横项为第二依赖关系,交叉为传递关系】
compile | test | provided | runtime | ||
compile | compile | - | - | runtime | |
test | test | - | - | test | |
provided | provided | - | provided | provided | |
runtime | runtime | - | - | runtime |
4,依赖调解 (不同依赖可能引用相同jar包的不同版本,所以maven要排除情况【下面优先级从高到低】)
4.1,路径优先原则(最短原则)
4.2, 第一声明优先(pop.xml中依赖声明顺序,此只适用2.9级以后版本,以下的版本不确定)
5,可选依赖
定意 :项目A依赖于项目B,B依赖于项目C、D但对于C、D的依赖都是可选依赖,那么C、D对A没有任何影响。
出现原因 :可能项目B实现了两种特性,一种依赖于C一种依赖于D,但是C与D的特性是互斥的,所以要配制可选。
pop配制 :<optional>true</optional>
6,排除依赖
原因 : 可能项目有一个第三方依赖,而第三方依赖由于某些原因依赖了另外一个库的不稳定版本,这个不稳定版本可能 对项目产生不可预料的结果,所以要排除这个依赖。
pop 配制 : <exclusions> <exclusion> <groupId>xxx</groupId><artifactId>xxxx</artifactId> </exlusion></exlusions>
7,归类依赖
有些包的依赖它们来自同一项目的不同模块,因此它们的版本是一样的。所以可以考虑用
<properties> <struts.version>2.6</struts.version></properties> ${struts.version} 等来统一版本号
8,优化依赖
查看当前项目己解析的依赖:mvn dependency:list
查看项目的依赖树 :mvn dependency:tree
分析当前项目依赖 :mvn dependency:analyze
打开maven的调式标记 :mvn install -X
====================2013=============================================
1,插件帮助信息
1.1.1使用help:describe 目标来获取Maven插件的信息。通过 plugin 参数你可以指定你想要研究哪个插件,你可以传入插件的前缀(如help 插件就是 maven-help-plugin),或者可以是 groupId:artifact[:version] ,这里 version 是可选的。比如, 下面的命令使用 help 插件的 describe 目标来输出Maven Help 插件的信息。
mvn help:describe -Dplugin=help
1.1.2 如果你想要 Help 插件输出完整的带有参数的目标列表,只要运行带有参数
full 的 help:describe 目标就可以了,像这样:
mvn help:describe -Dplugin=help -Dfull
1.1.3 有时候这些信息显得太多了。这时候你可以获取单个目标的信息,设置 mojo 参数和 plugin 参数。下面的命令列出了Compiler 插件的 compile 目标的所有信息
$ mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull
1.2maven基本插件用法
1.2.1设置插件参数表达式
testFailureIgnore Set this to true to ignore a failure during testing. Its use * Type: boolean * Required: No * Expression: ${maven.test.failure.ignore}
这个表达式可以从命令行通过 -D 参数设置。
$ mvn test -Dmaven.test.failure.ignore=true
1.2.2想要配置 Maven 使其完全跳过单元测试。 可能你有一个很大的系统,单元测试需要花好多分钟来完成,而你不想在生成最终输出前等单元测试完成。只需要使用 Surefire 插件的 skip 参数。 在命令行,只要简单的给任何目标添加maven.test.skip 属性就能跳过测试:
$ mvn install -Dmaven.test.skip=true ... [INFO] [compiler:testCompile] [INFO] Not compiling test sources [INFO] [surefire:test] [INFO] Tests are skipped.
pom.xml配制
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
1.2.3如果你正在实践测试驱动开发(TDD),你可能会使用测试失败来衡量你离项目完成有多远。 如果你有失败的单元测试,但你仍然希望产生构建输出,你就必须告诉 Maven 让它忽略测试失败。 当Maven 遇到一个测试失败,它默认的行为是停止当前的构建。 如果你希望继续构建项目,即使 Surefire 插件遇到了失败的单元测试,你就需要设置 Surefire 的testFailureIgnore 这个配置属性为 true。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> </plugins> </build>
2,pom关于配制数据连接与资源管理信息
2.1 指定maven编译版本与开启pom文件中配制数据库连接
<build> <!-- build后的war包名,如果没写则 artifactId.version.packaging --> <finalName>practice</finalName> <resources> <resource> <directory>src/main/resources</directory> <!-- 这里默认为false,为true时才支持pom.xml文件中配制数据连接信息生效 --> <filtering>false</filtering> </resource> </resources> <testResources> <testResource> <directory>src/test/resources</directory> <filtering>false</filtering> </testResource> </testResources> <!-- 编译版本 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> <pluginManagement> <plugins> <!--支持src/main/resouces下的二进制文件复制 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <nonFilteredFileExtensions> <nonFilteredFileExtension>dll</nonFilteredFileExtension> <nonFilteredFileExtension>so</nonFilteredFileExtension> <nonFilteredFileExtension>dylib</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin> </plugins> </pluginManagement> </build>
<build> <resources> <resource> <!-- 此处可指定自定义的资料文件路径 --> <directory>src/main/java</directory> <filtering>false</filtering> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> </build>