#eclipse中建立maven项目
打开eclipse–》菜单file–》new–>maven project–>【next】–>选择archetype(常用quickstart和webapp)–>【next】–输入groupId artifactId version package信息–>【finish】
- pom.xml中添加依赖可以从[http://mvnrepository.com/tags/maven]查询
#pom中scope标签
- compile:编译范围
compile是默认的范围;如果没有提供一个范围,编译范围依赖在所有的classpath 中可用,同时它 们也会被打包。而且这些dependency会***传递***到依赖的项目中。 - provided:已提供范围
provided 明了dependency 由JDK或者容器提供。例如如果开发了一个web 应用,可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这Servlet API JAR 由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的也不会被打包。
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
**<scope>provided</scope>**
</dependency>
-
runtime:运行时范围
runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。
比如可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。 -
test:测试范围
test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,也不传递。例如:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
**<scope>test</scope>**
</dependency>
- system:系统范围(不常用)
#maven依赖特性
maven项目a2依赖maven项目a1,a2会自动依赖a1项目的所有jar包(scope为compile)。
比如a1中已经引用了log4j-1.2.15.jar,a2中无需在依赖。
如果项目a3依赖a1和a2,a1和a2都依赖log4j jar包,根据传递特性,那么a3中是依赖a1的log4j jar包呢还是a2的log4j?
答案是:和a3项目pom.xml中依赖a1 a2的顺序有关,谁靠前依赖谁。
同时
直接依赖 大于 间接依赖 (比如 a1–>B.jar,a2–>A.jar–>B.jar)那么a3依赖的是a1中的B.jar
依赖层次小的 大于 依赖层次大的(比如 a1–>A.jar–>B.jar–>C.jar,a2–>D.jar–>C.jar)
那么a3依赖的是a2中的C.jar
排除依赖 (比如 a1–>B.jar,a2–>A.jar–>B.jar)那么a3应该依赖的是a2中的B.jar,这时应该在a3的pom.xml文件中,在依赖a1的dependency标签中添加exclusions标签
#maven隐藏变量
- ${basedir} 项目根目录
- ${project.build.directory} 构建目录,缺省为target
- ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
- p r o j e c t . b u i l d . f i n a l N a m e 产 出 物 名 称 , 缺 省 为 {project.build.finalName} 产出物名称,缺省为 project.build.finalName产出物名称,缺省为{project.artifactId}-${project.version}
- ${project.packaging} 打包类型,缺省为jar
- ${project.xxx} 当前pom文件的任意节点的内容,eg ${project.groupId}表示当前pom文件中的groupId