Maven干货2
回顾:
1、 maven核心
a) 依赖管理:对jar统一管理。根据坐标(groupId,artifactId,version)去找jar包,本地,私服,中央仓库
b) 项目构建:通过命令构建。clean,compile,test,package,install,deploy
2、 pom.xml
a) 当前项目坐标信息
b) Jdk插件,tomcat插件
c) 依赖信息
1 传递依赖冲突解决(了解)
传递依赖:A(项目)依赖B,B依赖C。B称为A的直接依赖,C称为A传递依赖。
A依赖B,B依赖C(1.1)
A依赖D,D依赖C(1.5)
1.1 Maven提供
1.1.1 第一声明者优先原则
谁先定义的就优先使用谁的传递依赖。
1.1.2 路径近者优先原则
直接依赖级别大于传递依赖。
1.2 排除依赖
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
1.3 版本锁定(项目中会用到的方式)
<properties>
<spring-version>4.2.4.RELEASE</spring-version>
</properties>
<!-- 指定项目中用到依赖信息版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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-asm</artifactId>
<version>${spring-version}</version>
</dependency>
</dependencies>
</dependencyManagement>
2 使用maven整合ssh框架(重点)
2.1 pom.xml
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>com.itheima</groupId> 5 <artifactId>maven_ssh_61</artifactId> 6 <version>0.0.1-SNAPSHOT</version> 7 <packaging>war</packaging> 8 9 <!-- 属性 --> 10 <properties> 11 <spring.version>4.2.4.RELEASE</spring.version> 12 <hibernate.version>5.0.7.Final</hibernate.version> 13 <struts.version>2.3.24</struts.version> 14 </properties> 15 16 <!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 --> 17 <dependencyManagement> 18 <dependencies> 19 <dependency> 20 <groupId>org.springframework</groupId> 21 <artifactId>spring-context</artifactId> 22 <version>${spring.version}</version> 23 </dependency> 24 <dependency> 25 <groupId>org.springframework</groupId> 26 <artifactId>spring-aspects</artifactId> 27 <version>${spring.version}</version> 28 </dependency> 29 <dependency> 30 <groupId>org.springframework</groupId> 31 <artifactId>spring-orm</artifactId> 32 <version>${spring.version}</version> 33 </dependency> 34 <dependency> 35 <groupId>org.springframework</groupId> 36 <artifactId>spring-test</artifactId> 37 <version>${spring.version}</version> 38 </dependency> 39 <dependency> 40 <groupId>org.springframework</groupId> 41 <artifactId>spring-web</artifactId> 42 <version>${spring.version}</version> 43 </dependency> 44 <dependency> 45 <groupId>org.hibernate</groupId> 46 <artifactId>hibernate-core</artifactId> 47 <version>${hibernate.version}</version> 48 </dependency> 49 <dependency> 50 <groupId>org.apache.struts</groupId> 51 <artifactId>struts2-core</artifactId> 52 <version>${struts.version}</version> 53 </dependency> 54 <dependency> 55 <groupId>org.apache.struts</groupId> 56 <artifactId>struts2-spring-plugin</artifactId> 57 <version>${struts.version}</version> 58 </dependency> 59 60 </dependencies> 61 </dependencyManagement> 62 63 <!-- 依赖管理 --> 64 <dependencies> 65 <!-- spring --> 66 <dependency> 67 <groupId>org.springframework</groupId> 68 <artifactId>spring-context</artifactId> 69 </dependency> 70 <dependency> 71 <groupId>org.springframework</groupId> 72 <artifactId>spring-aspects</artifactId> 73 </dependency> 74 <dependency> 75 <groupId>org.springframework</groupId> 76 <artifactId>spring-orm</artifactId> 77 </dependency> 78 <dependency> 79 <groupId>org.springframework</groupId> 80 <artifactId>spring-test</artifactId> 81 </dependency> 82 <dependency> 83 <groupId>org.springframework</groupId> 84 <artifactId>spring-web</artifactId> 85 </dependency> 86 <!-- hibernate --> 87 <dependency> 88 <groupId>org.hibernate</groupId> 89 <artifactId>hibernate-core</artifactId> 90 </dependency> 91 92 <!-- 数据库驱动 --> 93 <dependency> 94 <groupId>mysql</groupId> 95 <artifactId>mysql-connector-java</artifactId> 96 <version>5.1.6</version> 97 <scope>runtime</scope> 98 </dependency> 99 <!-- c3p0 --> 100 101 <dependency> 102 <groupId>c3p0</groupId> 103 <artifactId>c3p0</artifactId> 104 <version>0.9.1.2</version> 105 </dependency> 106 <!-- 导入 struts2 --> 107 <dependency> 108 <groupId>org.apache.struts</groupId> 109 <artifactId>struts2-core</artifactId> 110 </dependency> 111 <dependency> 112 <groupId>org.apache.struts</groupId> 113 <artifactId>struts2-spring-plugin</artifactId> 114 </dependency> 115 116 <!-- servlet jsp --> 117 <dependency> 118 <groupId>javax.servlet</groupId> 119 <artifactId>servlet-api</artifactId> 120 <version>2.5</version> 121 <scope>provided</scope> 122 </dependency> 123 <dependency> 124 <groupId>javax.servlet</groupId> 125 <artifactId>jsp-api</artifactId> 126 <version>2.0</version> 127 <scope>provided</scope> 128 </dependency> 129 <!-- 日志 --> 130 <dependency> 131 <groupId>org.slf4j</groupId> 132 <artifactId>slf4j-log4j12</artifactId> 133 <version>1.7.2</version> 134 </dependency> 135 <!-- junit --> 136 <dependency> 137 <groupId>junit</groupId> 138 <artifactId>junit</artifactId> 139 <version>4.9</version> 140 <scope>test</scope> 141 </dependency> 142 <!-- jstl --> 143 <dependency> 144 <groupId>javax.servlet</groupId> 145 <artifactId>jstl</artifactId> 146 <version>1.2</version> 147 </dependency> 148 <dependency> 149 <groupId>com.alibaba</groupId> 150 <artifactId>fastjson</artifactId> 151 <version>1.1.15</version> 152 </dependency> 153 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> 154 <dependency> 155 <groupId>org.apache.commons</groupId> 156 <artifactId>commons-lang3</artifactId> 157 <version>3.4</version> 158 </dependency> 159 </dependencies> 160 161 <build> 162 <plugins> 163 <!-- 设置编译版本为1.7 --> 164 <plugin> 165 <groupId>org.apache.maven.plugins</groupId> 166 <artifactId>maven-compiler-plugin</artifactId> 167 <configuration> 168 <source>1.7</source> 169 <target>1.7</target> 170 <encoding>UTF-8</encoding> 171 </configuration> 172 </plugin> 173 </plugins> 174 </build> 175 </project>
2.2 配置文件加载过程
2.3 分别搭建框架
1、 搭建hibernate环境
a) 在classpath下创建核心配置文件:hibernate.cfg.xml
2、 搭建spring环境
a) 在classpath下创建配置文件:applicationContext.xml
b) Web.xml中配置监听器
3、 搭建struts2环境
a) 在classpath下创建配置文件:struts.xml
b) 在web.xml配置核心过滤器
2.4 整合框架
2.4.1 Spring-hibernate整合
关键点:1、数据源配置 2、SessionFactory对象创建 3、事务管理
在spring配置文件中配置:
db.properties
1 jdbc.driverClass = com.mysql.jdbc.Driver 2 jdbc.jdbcUrl=jdbc:mysql://localhost:3306/maven 3 jdbc.user=root 4 jdbc.password=root
applicationContext.xml中: 8 <context:property-placeholder location="classpath:db.properties"/> 9 <!-- 数据源 --> 10 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 11 <property name="driverClass" value="${jdbc.driverClass}"></property> 12 <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> 13 <property name="user" value="${jdbc.user}"></property> 14 <property name="password" value="${jdbc.password}"></property> 15 </bean> 16 17 <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 18 <property name="dataSource" ref="dataSource"></property> 19 <property name="configLocations" value="classpath:hibernate.cfg.xml"></property> 20 <!-- 也可以通过注入hibernate配置信息 --> 21 </bean> 22 23 <!-- 配置事务管理器 --> 24 <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 25 <property name="sessionFactory" ref="sessionFactory"></property> 26 </bean> 27 28 <!-- 注解方式管理事务 --> 29 <tx:annotation-driven transaction-manager="transactionManager"/>
2.4.2 Struts2-spring整合
关键点:action对象交给spring创建
1、 创建action类
2、 将action对象配置到spring文件中
3、 在struts.xml中action节点 class属性=action对象bean的id
2.5 需求:查询客户信息
地址栏中:http://localhost:8080/project/customerAction_findOne.action?custId=1
1、 创建dao,service,接口跟实现类
2、 IOC 将dao,service对象在spring配置文件
3、 添加属性,生成set方法。在spring配置文件中注入对象
4、 在action创建findOne方法;
5、 创建客户实体、映射文件。将映射文件引入hibernate核心配置文件中
6、 配置结果视图。
3 使用maven对项目拆分、聚合(重点)
对现有的项目进行拆分,将dao层代码(源代码,配置文件),都提取工程中:ssh-dao,servivce,web层使用同样的方式进行拆分。
ssh-parent:
ssh-dao:jar
ssh-service:
ssh-web:
对拆分项目进行聚合,为了达到聚合目的,提出概念:父工程
3.1 创建父工程 ssh-parent
创建好的父工程:推断父工程不进行编码;将项目中用到的依赖定义;jdk版本在父工程中。
将依赖信息,jdk 插件定义在父工程pom.xml中
3.2 将父工程打包到本地仓库
如果忘记,将来打service项目到本地仓库,会报错。到时将父工程直接打包到本地仓库:父工程下所有的子模块都会打包到本地仓库。
3.3 创建子模块:ssh-dao
此工程中:存放数据访问层代码
创建好的子模块ssh-dao:
将dao层相关代码移到ssh-dao工程。
测试类:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:spring/applicationContext-*.xml") public class CustomerDaoTest { @Autowired private CustomerDao customerDao; @Before public void setUp() throws Exception { } @Test public void testFindOne() { customerDao.findOne(1l); } }
3.4 创建子模块:ssh-service
3.4.1 传递依赖范围(了解)
传递依赖不是不限传递,通过设置依赖scope作用范围控制。
A:ssh-serivce
B:ssh-dao
C:junit
结论:当发现某个依赖没有传递过来,在本工程中添加依赖。
3.5 创建子模块:ssh-web
Web.xml
3.6 运行项目
Maven提供:
1、 直接运行web项目
2、 运行父工程:将各个子模块聚合到一起,再运行web项目
Tomcat运行
4 私服(应用)
4.1 下载安装
1、资料,解压
3、 使用管理员身份运行命令行:
4、 安装服务,启动服务
5、 私服访问路径:http://localhost:8081/nexus/#welcome
6、 登陆私服 admin/admin123
4.2 私服上仓库分类
Hosted:宿主仓库,一般存放本公司开发jar包
本公司测试版本,正式版本jar包。第三方jar包(一般存在版权问题,比如oracle驱动包)
Proxy:代理仓库
代理中央仓库,Apache下测试版本jar包
Group:组仓库:
包含宿主仓库,代理仓库,将来连接组仓库即可。
Virtual:虚拟仓库 maven1仓库,废弃
4.3 将jar包发布到私服(应用)
1、 在MAVEN_Home/conf/settings.xml中,配置私服认证信息(登陆信息)
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
2、 在将要上传项目pom.xml中,配置上传url地址
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
3、 执行命令:deploy
4.4 将jar包从私服上下载到本地仓库(应用)
1、 在MAVEN_Home/conf/settings.xml中配置模板(知道从哪下载jar包)
<profile> <!--profile的id--> <id>dev</id> <repositories> <repository> <!--仓库id,repositories可以配置多个仓库,保证id不重复--> <id>nexus</id> <!--仓库地址,即nexus仓库组的地址--> <url>http://localhost:8081/nexus/content/groups/public/</url> <!--是否下载releases构件--> <releases> <enabled>true</enabled> </releases> <!--是否下载snapshots构件--> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 --> <pluginRepository> <!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 --> <id>public</id> <name>Public Repositories</name> <url>http://localhost:8081/nexus/content/groups/public/</url> </pluginRepository> </pluginRepositories> </profile>
2、 激活模板
<activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles>
3、 测试