1. maven应用详解
maven核心概念
l 仓库
l 坐标
l 依赖
l 多模块&继承
l 生命周期
l 插件
1.1. 仓库
仓库分为 本地仓库、远程仓库、中央仓库
Maven内置了远程公用仓库:http://repo1.maven.org/maven2
用户编写pom.xml 继承 超级POM文件 (有效POM = 超级POM + pom.xml)
超级POM里有一些默认的插件,和一些配置和 pom.xml合成有效POM
eclipse中
远程仓库:网络中服务器 (私服)
当公司开发项目,这些项目没有开源,在公司内部搭建私服,公司员工通过私服共享项目。 (中央仓库存放公共开源项目 ),如果要使用私服,超级POM没有定义,需要在pom.xml(settings.xml )配置私服
还有安全控制, 缓存中央仓库jar作用
顺序: 本地仓库 ---私服----中央仓库
1.2. 坐标
自己编写pom.xml继承 超级POM,两个pom内容合并称为 有效POM
坐标 (groupId,artifactId,version )可以在仓库中唯一定位项目的位置
在安装项目 repository/groupId/artifactId/version/xxx.jar、xxx.war
打包方式(packaging) ,项目在打包后,产生怎么样类型文件如pom,jar,maven-plugin,ejb,war,ear,rar,par
(jar 将项目制作为jar包,被其它项目依赖 , war独立运行javaweb项目,pom被其它项目继承 )
1.3. 依赖(重点!!! )
1.3.1. 使用坐标导入jar包
在开发中,项目需要依赖各种各样的框架(项目),坐标可以作为项目唯一标识,通过坐标进行依赖项目引入!
问题: 如何获得需要项目的坐标??
方法一: 网站搜索
• http://search.maven.org/
• http://mvnrepository.com/
以log4j为例
方法二: 索引搜索
以junit4 为例
开启maven 仓库视图
先对仓库建立索引
导入的jar包如果本地仓库不存在,去中央仓库下载 !
eclipse中依赖视图
1.3.2. dependency元素详细分析
<dependency>
<groupId>……</groupId>
<artifactId>……</artifactId>
<version>……</version>
<classifier>……</classifier>
<scope>是用来指定当前包的依赖范围,maven的依赖范围</scope>
<type>默认为jar类型,常用的类型有:jar,ejb-client,test-jar...,可设置plugins中的extensions值为true后在增加 新的类型,</type>
<systemPath>……</systemPath>
<optional>设置指依赖是否可选,默认为false,即子项目默认都继承,为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似 。</optional>
<exclusions>如果X需要A,A包含B依赖,那么X可以声明不要B依赖,只要在exclusions中声明exclusion.</exclusions>
</dependency>
n exclusions:排除传递依赖 (主要解决jar冲突问题 )
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.8</version>、
<!-- 排除依赖 asm ---如果X需要A,A包含B依赖,那么X可以声明不要B依赖,只要在exclusions中声明exclusion.-->
<exclusions>
<exclusion>
<artifactId>asm</artifactId>
<groupId>asm</groupId>
</exclusion>
</exclusions>
</dependency>
scope 依赖范围 ,导入jar在生命周期哪个节点起作用
compile:编译范围,默认scope,在classpath中存在 (存活整个生命周期)
provided:已提供范围,比如容器提供Servlet API(不参与打包码,只参与编译测试)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
runtime:运行时范围,编译不需要,接口与实现分离 (不参与编译,参与打包)
test:测试范围,单元测试环境需要 (只在测试时使用)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
system:系统范围,自定义构件,指定systemPath(引入外部系统的jar包)
1.3.3. 传递性依赖
在导入项目A ,如果项目A依赖项目B,B也会自动导入
B-C-X(1.5)
A-D-X(2.0)
问题: 导入X哪个版本?
哪个先声明,就导入哪个版本 ,如果A在前2.0, 如果B在前1.5
技巧:
1、 版本统一维护
<properties>
<spring.version>3.2.0.RELEASE</spring.version>
</properties>
<!-- 导入spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
2、 防止传递性依赖导入冲突
<!-- 路径最短,优先导入-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
如果不是传递性依赖,导入两个相同坐标,不同版本,后导入坐标覆盖了之前的坐标!
1.4. 综合练习--- 基于maven构建SSH项目
n 新建maven web项目
将 ssh整合后项目 web.xml 复制maven项目
使用坐标导入jar包
<properties>
<spring.version>3.2.0.RELEASE</spring.version>
<struts2.version>2.3.15.2</struts2.version>
<hibernate.version>3.6.10.Final</hibernate.version>
</properties>
<dependencies>
<!-- 导入struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts2.version}</version>
</dependency>
<!-- 导入spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 导入struts2整合spring插件 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<!-- 导入hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
<!-- c3p0 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- servlet、jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
将页面复制 src/main/webapp 目录
将配置文件复制 src/main/resources
将源码复制 src/main/java
将测试代码复制src./test/java
注意 hbm.xml也是配置文件 !!!!!
测试下面命令(关联源码)
• dependency:sources -U