一、maven基础知识回顾

01-maven基础知识回顾(了解)

1581921352982.png

1.默认的依赖范围compile

2.java 是编译时目录,test是测试时目录,运行时: 动态加载

  1. 1.complie是默认值,表示在build,test,runtime阶段的classpath下都有依赖关系。
  2. test表示只在test阶段有依赖关系,例如junit
  3. provided表示在build,test阶段都有依赖,在runtime时并不输出依赖关系而是由容器提供,例如web war包都不包括servlet-api.jar,而是由tomcat等容器来提供
    provided意味着打包的时候可以不用打包进去,依赖关由容器提供。事实上该依赖理论上可以参与编译、测试、运行等周期。相当于compile,但是打包阶段做了exclude的动作。
  1. <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>servlet-api</artifactId>
  4. <version>3.0.1</version>
  5. <scope>provided</scope>
  6. </dependency>

当我们用maven install生成最终war包后,在其下的WEB-INF/lib中,会包含我们被标注为scope=compile的构件的jar包,而不会包含我们被标注为scope=provided的构件的jar包。这也避免了此类构件当部署到目标容器后产生包依赖冲突。

4.runtime表示在构建编译阶段不需要,只在test和runtime需要。这种主要是指代码里并没有直接引用而是根据配置在运行时动态加载并实例化的情况。虽然用runtime的地方改成compile也不会出大问题,但是runtime的好处是可以避免在程序里意外地直接引用到原本应该动态加载的包。例如JDBC连接池

  1. <dependency>
  2. <groupId>commons-dbcp</groupId>
  3. <artifactId>commons-dbcp</artifactId>
  4. <version>1.4</version>
  5. <scope>runtime</scope>
  6. </dependency>

spring applicationContext.xml

  1. <!-- mysql -->
  2. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  3. <property name="dataSource">
  4. <ref bean="dataSource" />
  5. </property>
  6. </bean>
  7. <!-- Connection Pool -->
  8. <bean id="dataSource" destroy-method="close"
  9. class="org.apache.commons.dbcp.BasicDataSource">
  10. <property name="driverClassName" value="${ckm.jdbc.driver}" />
  11. <property name="url" value="${ckm.jdbc.url}" />
  12. <property name="username" value="${ckm.jdbc.username}" />
  13. <property name="password" value="${ckm.jdbc.password}" />
  14. <property name="initialSize" value="6" />
  15. </bean>

5)system 和provide相同,不过被依赖项不会从maven仓库抓,而是从本地系统文件拿,一定要配合systemPath使用

systempath

当maven依赖本地而非repository中的jar包,sytemPath指明本地jar包路径

  1. <dependency>
  2. <groupId>org.hamcrest</groupId>
  3. <artifactId>hamcrest-core</artifactId>
  4. <version>1.5</version>
  5. <scope>system</scope>
  6. <systemPath>${basedir}/WebContent/WEB-INF/lib/hamcrest-core-1.3.jar</systemPath>
  7. </dependency>

使用 scope import 解决Maven 单继承问题

Maven 本身支持继承,很多时候我们会创建多模块项目,而多个模块会引入相同的依赖项,这个时候我们就能使用 Maven 的父子工程结构,
创建一个父 pom 文件,其他子项目中的 pom 文件继承父pom

  1. <parent>
  2. <groupId>base.parent</groupId>-->
  3. <artifactId>parent.management</artifactId>
  4. <version>1.0.0.RELEASE</version>
  5. </parent>

这样我们就能是的依赖项的管理更加有条理
但是 Maven 父子项目结构和 Java继承一样,都是单继承,一个子项目只能制定一个父 pom
很多时候,我们需要打破这种 单继承
例如使用 spring-boot 的时候, 官方推荐的方式是继承父pom spring-boot-starter-parent

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.1.RELEASE</version>
  5. </parent>

但是如果项目中已经有了其他父pom, 又想用 spring-boot 怎么办呢?

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-dependencies</artifactId>
  6. <version>1.5.1.RELEASE</version>
  7. <scope>import</scope>
  8. <type>pom</type>
  9. </dependencies>
  10. </dependencyManagement>

就是使用 scope import, 还需要指定 type pom
注意:scope import 只能在 dependencyManagement 中的使用

总结:

1.了解scope的默认值

2.compile和test分别管控的范围

3.provided的作用:打包时不打进去

二、解决依赖冲突

02-什么是maven的依赖传递(理解)

00:04:25
▶内容

由于依赖传递现象的存在, spring-webmvc 依赖 spirng-beans-4.3.9,spring-aop 依赖 spring-beans-5.0.5,但是发现 spirng-beans-4.3.9 加入到了工程中,而我们希望 spring-beans-5.0.5加入工程。这就造成了依赖冲突

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-webmvc</artifactId>
  4. <version>4.3.9.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-aop</artifactId>
  9. <version>5.0.5.RELEASE</version>
  10. </dependency>

总结

依赖传递:引用jar包时,当前jar包依赖的其他jar,并引入进来

03-什么是依赖冲突(理解)

00:05:22
▶内容

在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。
1581921375311.png

由于依赖传递现象的存在, spring-webmvc 依赖 spirng-beans-4.2.4,spring-aop 依赖 spring-beans-5.0.2,但是发现 spirng-beans-4.2.4 加入到了工程中,而我们希望 spring-beans-5.0.2 加入工程。这就造成了依赖冲突

总结:

不同jar包依赖了相同jar包的不同版本,造成了依赖冲突

04-使用第一声明者优先原则(理解)

00:04:55
▶内容

  1. 使用maven提供的依赖调解原则
    第一声明者优先原则

注意:

如果maven窗口的坐标,在pom.xml中调换顺序后没有变化,

双击maven窗口,缩回再弹出,即可看到变化

如果不行,点击All maven reimport

总结:

第一声明者优先原则:谁先声明,谁起作用,在pom文件中的体现是,谁在最上面,谁起作用

05-使用路径近者优先原则(理解)

00:03:12
▶内容

  • 路径近者优先原则

在 pom 文件定义依赖,以路径近者为准。

还是上述情况,spring- spring- spirng,那如果直接把 的依赖直接写到 spring-beans.pom中定义 要比其他依赖传递过来的路径要近

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-webmvc</artifactId>
  4. <version>4.3.9.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-aop</artifactId>
  9. <version>5.0.5.RELEASE</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework</groupId>
  13. <artifactId>spring-beans</artifactId>
  14. <version>5.0.5.RELEASE</version>
  15. </dependency>

总结:

直接声明优先于间接引用

06-排除依赖(掌握)

00:04:26
▶内容

排除依赖的写法

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-webmvc</artifactId>
  4. <version>4.3.9.RELEASE</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-beans</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>

注意:

排除依赖时,如果发现排除后的包还显示,点击All maven reimport

总结:

排除依赖的写法,注意不需要写版本号

  1. <exclusions>
  2. <exclusion>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-beans</artifactId>
  5. </exclusion>
  6. </exclusions>

optional 当optional为true时,子项目不会依赖此依赖,可以减少开销

07-版本锁定(掌握)

00:07:33
▶内容

版本锁定后,依赖传递的包,版本会变为锁定的版本

使用版本锁定后,依然需要声明,但不需要再进行版本声明

注意:标签在外边

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-beans</artifactId>
  6. <version>5.0.5.RELEASE</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-context</artifactId>
  11. <version>5.0.5.RELEASE</version>
  12. </dependency>
  13. </dependencies>
  14. </dependencyManagement>

注意:如果版本锁定后,在进行显式声明,并指定版本,此时版本为显式申明的版本,版本锁定失效

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-beans</artifactId>
  4. <version>5.1.5.RELEASE</version>
  5. </dependency>

三、基于maven构建SSM工程案例

08-数据库环境搭建

00:03:16
▶内容

  1. CREATE TABLE `item` (
  2. `id` int(11) NOT NULL auto_increment,
  3. `name` varchar(255) default NULL,
  4. `price` float default NULL,
  5. `createtime` datetime default NULL,
  6. `detail` varchar(255) default NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

09-maven项目构建步骤分析

00:04:08
▶内容

maven项目构建

  1. 创建maven web项目
  2. 配置pom.xml文件
  3. 实现spring+mybatis整合创建POJO类
    持久层DAO接口编写
    Mapper映射文件编写
    业务层Service编写

    1. spring配置文件applicationContext-dao.xml编写
    2. spring配置文件applicationContext-service.xml编写

4.加入springmvc相关配置

  1. 表现层Controller编写
  2. springmvc.xml文件编写
  3. jsp页面编写
  1. 配置web.xml文件

10-创建项目并配置pom.xml

00:09:35
▶内容

archetypeCatalog用来指定maven-archetype-plugin读取archetype-catalog.xml文件的位置:

internal——maven-archetype-plugin内置的

local——本地的,位置为~/.m2/archetype-catalog.xml

remote——指向Maven中央仓库的Catalog

在maven的VM Options加上-DarchetypeCatalog=internal参数,如下:
1562405085995.png
1562405101452.png

注意:pom文件中 serverlet相关坐标有问题

  1. <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>javax.servlet-api</artifactId>
  4. <version>3.0.1</version>
  5. <scope>provided</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>javax.servlet.jsp</groupId>
  9. <artifactId>javax.servlet.jsp-api</artifactId>
  10. <version>2.2.1</version>
  11. <scope>provided</scope>
  12. </dependency>

11-实现spring和mybatis整合1

00:10:48
▶内容

POJO

  1. public class Item {
  2. private int id;
  3. private String name;
  4. private float price;
  5. private Date createtime;
  6. private String detail;
  7. }

Mapper接口

  1. public interface ItemMapper {
  2. public Item findById(int id);
  3. }

Mapper.xml

别名不区分大小写

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.itheima.ssm.dao.ItemMapper">
  5. <select id="findById" parameterType="int" resultType="Item">
  6. select * from item where id = #{id}
  7. </select>
  8. </mapper>

12-实现spring和mybatis整合2

00:17:24
▶内容

  1. public interface ItemService {
  2. public Item findById(int id);
  3. }
  1. @Service
  2. @Transactional
  3. public class ItemServiceImpl implements ItemService {
  4. @Autowired
  5. private ItemMapper itemMapper;
  6. public Item findById(int id) {
  7. return itemMapper.findById(id);
  8. }
  9. }

applicationContext-dao.xml

  1. <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
  2. <!--配置数据源信息,使用druid连接池-->
  3. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  4. <property name="driverClassName" value="${jdbc.driver}"/>
  5. <property name="url" value="${jdbc.url}"/>
  6. <property name="username" value="${jdbc.username}"/>
  7. <property name="password" value="${jdbc.password}"/>
  8. </bean>
  9. <!--配置spring整合mybatis框架的SQLSessionFactoryBean-->
  10. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  11. <property name="dataSource" ref="dataSource"/>
  12. <!--扫描pojo包,为实体类创建别名-->
  13. <property name="typeAliasesPackage" value="com.itheima.ssm.pojo"/>
  14. </bean>
  15. <!--mapper扫描器,用于产生代理对象-->
  16. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  17. <property name="basePackage" value="com.itheima.ssm.dao"/>
  18. </bean>

applicationContext-service.xml

ref=”dataSource” 报错是Idea 提示,实际运行无错

  1. <!--配置扫描器,扫描Service-->
  2. <context:component-scan base-package="com.itheima.ssm.service"/>
  3. <!--事务管理器-->
  4. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  5. <property name="dataSource" ref="dataSource"/>
  6. </bean>
  7. <!--事物注解驱动-->
  8. <tx:annotation-driven transaction-manager="transactionManager"/>

13-Spring和mybatis整合测试

00:05:02
▶内容

测试类:

注意:配置文件是两个,名称不要写错

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration(locations = {"classpath:applicationContext-dao.xml","classpath:applicationContext-service.xml"})
  3. public class SpringMybatisTest {
  4. @Autowired
  5. private ItemService itemService;
  6. @Test
  7. public void test1(){
  8. Item item = itemService.findById(1);
  9. System.out.println(item);
  10. }
  11. }

14-加入SpringMVC相关配置

00:13:31
▶内容

  1. @Controller
  2. @RequestMapping("/item")
  3. public class ItemController {
  4. @Autowired
  5. private ItemService itemService;
  6. @RequestMapping("/showItem/{id}")
  7. public String findByid(@PathVariable("id") int id, Model model){
  8. Item item = itemService.findById(id);
  9. model.addAttribute("item",item);
  10. return "item";
  11. }
  12. }

springmvc.xml

  1. <!--配置扫描器,扫描Controller-->
  2. <context:component-scan base-package="com.itheima.ssm.controller"/>
  3. <!--视图解析器-->
  4. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  5. <property name="prefix" value="/WEB-INF/jsp/"/>
  6. <property name="suffix" value=".jsp"/>
  7. </bean>

web.xml

classpath*代表加载jar包里的配置文件,目前情况,可以不加

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>classpath*:applicationContext-*.xml</param-value>
  4. </context-param>
  5. <listener>
  6. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  7. </listener>
  8. <servlet>
  9. <servlet-name>DispatcherServlet</servlet-name>
  10. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  11. <init-param>
  12. <param-name>contextConfigLocation</param-name>
  13. <param-value>classpath:springmvc.xml</param-value>
  14. </init-param>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>DispatcherServlet</servlet-name>
  18. <url-pattern>/</url-pattern>
  19. </servlet-mapping>
  20. <filter>
  21. <filter-name>CharacterEncodingFilter</filter-name>
  22. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  23. <init-param>
  24. <param-name>enconding</param-name>
  25. <param-value>UTF-8</param-value>
  26. </init-param>
  27. </filter>
  28. <filter-mapping>
  29. <filter-name>CharacterEncodingFilter</filter-name>
  30. <url-pattern>/*</url-pattern>
  31. </filter-mapping>

item.jsp

isELIgnored=”false” 开启EL表达式

  1. <%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <h1>${item}</h1>
  8. </body>
  9. </html>

15-部署到tomcat

00:06:08
▶内容

web.xml中前端控制器注意加载springmvc.xml文件

  1. <servlet>
  2. <servlet-name>DispatcherServlet</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:springmvc.xml</param-value>
  7. </init-param>
  8. </servlet>

视图解析器记得/结尾

  1. <!--视图解析器-->
  2. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  3. <property name="prefix" value="/WEB-INF/jsp/"/>
  4. <property name="suffix" value=".jsp"/>
  5. </bean>

四、分模块构建maven工程(重点)

16-分析

00:07:22
▶内容

在企业项目开发过程中,由于项目规模庞大,业务复杂,参与的人员比较多,一般会通过合理的模块拆分将一个大型的项目拆分为N多个小模块,分别进行开发。而且拆分出的模块可以非常容易的被其他模块复用。

常见的拆分方式有两种:

第一种:按照业务模块进行拆分,每个模块拆分成一个maven工程,例如将一个项目分为用户模块、订单模块、购物车模块等,每个模块对应就是一个maven工程

第二种:按照层进行拆分,例如持久层、业务层、表现层等,每个层对应就是一个maven工程

不管是上面哪种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一管理和配置。

maven高级 - 图5

17-继承概念

00:09:09
▶内容

在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。同样,在maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。

继承的目的是为了消除重复代码

被继承的maven工程通常称为父工程,父工程的打包方式必须为pom,所以我们区分某个maven工程是否为父工程就看这个工程的打包方式是否为pom

maven高级 - 图6

继承其他maven父工程的工程通常称为子工程,在pom.xml文件中通过parent标签进行父工程的继承

maven高级 - 图7

18-聚合概念

00:06:55
▶内容

在maven工程的pom.xml文件中可以使用标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作

例如拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。这时就可以使用标签将这些工程统一聚合到maven工程中,需要打包的时候,只需要在此工程中执行一次打包命令,其下被聚合的工程就都会被打包了。

maven高级 - 图8

注意:继承和聚合是没有必然联系的,聚合是聚合,继承是继承

  1. 不继承也可以进行聚合

使用maven命令进行聚合

maven高级 - 图9

maven高级 - 图10

尝试一下 clean -X

19-工程创建

00:14:18
▶内容

1.创建父工程maven_parent

打包方式是pom

  1. <groupId>com.itheima</groupId>
  2. <artifactId>maven_parent</artifactId>
  3. <version>1.0-SNAPSHOT</version>
  4. <modules>
  5. <module>maven_pojo</module>
  6. <module>maven_service</module>
  7. <module>maven_dao</module>
  8. <module>maven_web</module>
  9. </modules>
  10. <packaging>pom</packaging>

在pom.xml中指定版本 不引入具体包

  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <maven.compiler.source>1.8</maven.compiler.source>
  4. <maven.compiler.target>1.8</maven.compiler.target>
  5. <spring.version>5.0.5.RELEASE</spring.version>
  6. <springmvc.version>5.0.5.RELEASE</springmvc.version>
  7. <mybatis.version>3.4.5</mybatis.version>
  8. </properties>
  9. <!--锁定jar版本-->
  10. <dependencyManagement>
  11. <dependencies>
  12. <!-- Mybatis -->
  13. <dependency>
  14. <groupId>org.mybatis</groupId>
  15. <artifactId>mybatis</artifactId>
  16. <version>${mybatis.version}</version>
  17. </dependency>
  18. <!-- springMVC -->
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-webmvc</artifactId>
  22. <version>${springmvc.version}</version>
  23. </dependency>
  24. <!-- spring -->
  25. <dependency>
  26. <groupId>org.springframework</groupId>
  27. <artifactId>spring-context</artifactId>
  28. <version>${spring.version}</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-core</artifactId>
  33. <version>${spring.version}</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework</groupId>
  37. <artifactId>spring-aop</artifactId>
  38. <version>${spring.version}</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.springframework</groupId>
  42. <artifactId>spring-web</artifactId>
  43. <version>${spring.version}</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.springframework</groupId>
  47. <artifactId>spring-expression</artifactId>
  48. <version>${spring.version}</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework</groupId>
  52. <artifactId>spring-beans</artifactId>
  53. <version>${spring.version}</version>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.springframework</groupId>
  57. <artifactId>spring-aspects</artifactId>
  58. <version>${spring.version}</version>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.springframework</groupId>
  62. <artifactId>spring-context-support</artifactId>
  63. <version>${spring.version}</version>
  64. </dependency>
  65. <dependency>
  66. <groupId>org.springframework</groupId>
  67. <artifactId>spring-test</artifactId>
  68. <version>${spring.version}</version>
  69. </dependency>
  70. <dependency>
  71. <groupId>org.springframework</groupId>
  72. <artifactId>spring-jdbc</artifactId>
  73. <version>${spring.version}</version>
  74. </dependency>
  75. <dependency>
  76. <groupId>org.springframework</groupId>
  77. <artifactId>spring-tx</artifactId>
  78. <version>${spring.version}</version>
  79. </dependency>
  80. </dependencies>
  81. </dependencyManagement>

2.创建子工程maven_pojo

pom.xml

  1. <parent>
  2. <artifactId>maven_parent</artifactId>
  3. <groupId>com.itheima</groupId>
  4. <version>1.0-SNAPSHOT</version>
  5. </parent>
  6. <modelVersion>4.0.0</modelVersion>

3.创建子工程maven_dao

  1. <parent>
  2. <artifactId>maven_parent</artifactId>
  3. <groupId>com.itheima</groupId>
  4. <version>1.0-SNAPSHOT</version>
  5. </parent>
  6. <modelVersion>4.0.0</modelVersion>
  7. <artifactId>maven_dao</artifactId>
  8. <dependencies>
  9. <dependency>
  10. <groupId>com.itheima</groupId>
  11. <artifactId>maven_pojo</artifactId>
  12. <version>1.0-SNAPSHOT</version>
  13. </dependency>
  14. <!-- Mybatis和mybatis与spring的整合 -->
  15. <dependency>
  16. <groupId>org.mybatis</groupId>
  17. <artifactId>mybatis</artifactId>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.mybatis</groupId>
  21. <artifactId>mybatis-spring</artifactId>
  22. <version>1.3.1</version>
  23. </dependency>
  24. <!-- MySql驱动 -->
  25. <dependency>
  26. <groupId>mysql</groupId>
  27. <artifactId>mysql-connector-java</artifactId>
  28. <version>5.1.32</version>
  29. </dependency>
  30. <!-- druid数据库连接池 -->
  31. <dependency>
  32. <groupId>com.alibaba</groupId>
  33. <artifactId>druid</artifactId>
  34. <version>1.0.9</version>
  35. </dependency>
  36. <!-- spring相关 -->
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-context</artifactId>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework</groupId>
  43. <artifactId>spring-core</artifactId>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.springframework</groupId>
  47. <artifactId>spring-aop</artifactId>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework</groupId>
  51. <artifactId>spring-web</artifactId>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.springframework</groupId>
  55. <artifactId>spring-expression</artifactId>
  56. </dependency>
  57. <dependency>
  58. <groupId>org.springframework</groupId>
  59. <artifactId>spring-beans</artifactId>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework</groupId>
  63. <artifactId>spring-aspects</artifactId>
  64. </dependency>
  65. <dependency>
  66. <groupId>org.springframework</groupId>
  67. <artifactId>spring-context-support</artifactId>
  68. </dependency>
  69. <dependency>
  70. <groupId>org.springframework</groupId>
  71. <artifactId>spring-test</artifactId>
  72. </dependency>
  73. <dependency>
  74. <groupId>org.springframework</groupId>
  75. <artifactId>spring-jdbc</artifactId>
  76. </dependency>
  77. <dependency>
  78. <groupId>org.springframework</groupId>
  79. <artifactId>spring-tx</artifactId>
  80. </dependency>
  81. <!-- junit测试 -->
  82. <dependency>
  83. <groupId>junit</groupId>
  84. <artifactId>junit</artifactId>
  85. <version>4.12</version>
  86. </dependency>
  87. <dependency>
  88. <groupId>javax.servlet</groupId>
  89. <artifactId>javax.servlet-api</artifactId>
  90. <version>3.0.1</version>
  91. <scope>provided</scope>
  92. </dependency>
  93. <dependency>
  94. <groupId>javax.servlet.jsp</groupId>
  95. <artifactId>javax.servlet.jsp-api</artifactId>
  96. <version>2.2.1</version>
  97. <scope>provided</scope>
  98. </dependency>
  99. <!-- jstl -->
  100. <dependency>
  101. <groupId>javax.servlet</groupId>
  102. <artifactId>jstl</artifactId>
  103. <version>1.2</version>
  104. </dependency>
  105. </dependencies>

4.创建子工程maven_service

pom.xml

  1. <parent>
  2. <artifactId>maven_parent</artifactId>
  3. <groupId>com.itheima</groupId>
  4. <version>1.0-SNAPSHOT</version>
  5. </parent>
  6. <modelVersion>4.0.0</modelVersion>
  7. <artifactId>maven_service</artifactId>

5.创建子工程maven_web

pom.xml

打包方式war

  1. <parent>
  2. <artifactId>maven_parent</artifactId>
  3. <groupId>com.itheima</groupId>
  4. <version>1.0-SNAPSHOT</version>
  5. </parent>
  6. <modelVersion>4.0.0</modelVersion>
  7. <packaging>war</packaging>

6.maven_dao

引入具体包

7.maven_dao依赖 maven_pojo

  1. <dependency>
  2. <groupId>com.itheima</groupId>
  3. <artifactId>maven_pojo</artifactId>
  4. <version>1.0-SNAPSHOT</version>
  5. </dependency>

8.maven_service依赖maven_dao

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.itheima</groupId>
  4. <artifactId>maven_dao</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. </dependency>
  7. </dependencies>

9.maven_web依赖maven_service

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.itheima</groupId>
  4. <artifactId>maven_service</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. </dependency>
  7. </dependencies>

20-完善工程代码

00:09:33
▶内容

web.xml中必须classpath*配置

  1. <param-value>classpath*:applicationContext-*.xml</param-value>

web模块,pom.xml中添加webmvc 坐标

  1. <!-- springMVC核心-->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-webmvc</artifactId>
  5. </dependency>

21-部署到tomcat

00:07:31
▶内容

dao,pojo,service都被打成了jar包,

在WEB-INF/lib文件夹下(maven_web工程中)

maven高级 - 图11

五、maven私服(了解)

22-安装nexus并启动服务

00:05:00
▶内容

注意:

有个别同学出现安装成功,但无法启动的情况,建议使用其他同学的电脑练习,本章节不作为必要掌握内容

maven仓库分为本地仓库和远程仓库,而远程仓库又分为maven中央仓库、其他远程仓库和私服(私有服务器)其中,中央仓库是由maven官方提供的,而私服就需要我们自己搭建了。

nexus 是一个maven仓库管理器(其实就是一个软件),nexus可以充当maven私服,同时nexus还提供强大的仓库管理、构件搜索等功能。

安装nexus

将下载的压缩包进行解压,进入bin目录

maven高级 - 图12

l打开cmd窗口并进入上面bin目录下,执行nexus.bat install命令安装服务(注意需要以管理员身份运行cmd命令)

maven高级 - 图13

启动nexus

经过前面命令已经完成nexus的安装,可以通过如下

两种方式启动nexus服务:

1.在Windows系统服务中启动nexus

maven高级 - 图14

2.命令行执行nexus.bat start命令启动nexus

maven高级 - 图15

为什么访问http://localhost:8081/nexus

maven高级 - 图16

nexus.properties

  1. application-port=8081
  2. application-host=0.0.0.0
  3. nexus-webapp=${bundleBasedir}/nexus
  4. nexus-webapp-context-path=/nexus
  5. # Nexus section
  6. nexus-work=${bundleBasedir}/../sonatype-work/nexus
  7. runtime=${bundleBasedir}/nexus/WEB-INF

23-nexus仓库类型

00:06:09
▶内容

通过前面的仓库列表可以看到,nexus默认内置了很多仓库,这些仓库可以划分为4种类型,每种类型的仓库用于存放特定的jar包,具体说明如下:

①hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括Releases和Snapshots两部分,Releases为公司内部发布版本仓库、 Snapshots为公司内部测试版本仓库

②proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件

③group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组

④virtual(虚拟):兼容Maven1版本的jar或者插件

maven高级 - 图17

24-nexus仓库和磁盘目录对应关系

00:03:21
▶内容

maven高级 - 图18

25-将项目发布到maven私服

00:09:07
▶内容

  1. <server>
  2. <id>releases</id>
  3. <username>admin</username>
  4. <password>admin123</password>
  5. </server>
  6. <server>
  7. <id>snapshots</id>
  8. <username>admin</username>
  9. <password>admin123</password>
  10. </server>
  1. <!--配置jar包上传仓库路径-->
  2. <distributionManagement>
  3. <repository>
  4. <id>releases</id>
  5. <url>http://localhost:8081/nexus/content/repositories/releases/</url>
  6. </repository>
  7. <snapshotRepository>
  8. <id>snapshots</id>
  9. <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
  10. </snapshotRepository>
  11. </distributionManagement>

出现的错误:

maven高级 - 图19

maven高级 - 图20

解决办法:

直接在相应包下,点depoly

maven高级 - 图21

26-从私服下载jar到本地仓库

00:11:42
▶内容

  1. <profile>
  2. <id>dev</id>
  3. <repositories>
  4. <repository>
  5. <id>nexus</id>
  6. <!--仓库地址,即nexus仓库组的地址-->
  7. <url> http://localhost:8081/nexus/content/groups/public/</url>
  8. <!--是否下载releases构件-->
  9. <releases>
  10. <enabled>true</enabled>
  11. </releases>
  12. <!--是否下载snapshots构件-->
  13. <snapshots>
  14. <enabled>true</enabled>
  15. </snapshots>
  16. </repository>
  17. </repositories>
  18. <pluginRepositories>
  19. <!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
  20. <pluginRepository>
  21. <id>public</id>
  22. <name>Public Repositories</name>
  23. <url>http://localhost:8081/nexus/content/groups/public/</url>
  24. </pluginRepository>
  25. </pluginRepositories>
  26. </profile>
  27. <activeProfiles>
  28. <activeProfile>dev</activeProfile>
  29. </activeProfiles>

27-将第三方jar安装到maven本地仓库

00:05:45
▶内容

应用场景:

第三方的jar包在maven仓库中找不到,比如Oracle驱动

首先在cmd页面,切换到jar所在的目录

  1. mvn install:install-file -Dfile=ojdbc14-10.2.0.4.0.jar -DgroupId=com.oracle -DartifactId=ojdbc14 Dversion=10.2.0.4.0 -Dpackaging=jar

如果出现mvn 不是内部命令,请配置maven的环境变量

上传的本地仓库是setting文件中配置的仓库位置

28-将第三方jar安装到maven私服

00:04:52
▶内容

  1. <server>
  2. <id>thirdparty</id>
  3. <username>admin</username>
  4. <password>admin123</password>
  5. </server>

命令:

  1. mvn deploy:deploy-file -Dfile=ojdbc14-10.2.0.4.0.jar -DgroupId=com.oracle -DartifactId=ojdbc14 Dversion=10.2.0.4.0 -Dpackaging=jar Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty

maven高级 - 图22

六、总结

重点掌握内容:

1.理解什么是依赖传递

2.理解什么是依赖冲突

3.掌握解决依赖冲突的四种方式:

  • 使用第一声明者优先原则
  • 路径近者优先
  • 排除依赖
  • 版本锁定

4.理解继承和集合的概念(掌握)

5.分模块构建maven工程(重点、重中之重)

6.maven私服,自行测试,不要求掌握,但要了解