Apache Maven

Apache Maven 项目管理工具

Maven logo.svg
    Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
    Maven也可被用于构建和管理各种项目,例如C#,Ruby,Scala和其他语言编写的项目。Maven曾是Jakarta项目的子项目,现为由Apache软件基金会主持的独立Apache项目。
    Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组 成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。

Maven入门

    Maven是Apache下的一个纯java开发的开源项目,它是一个项目管理工具,使用Maven对Java项目进行构建、依赖管理。

项目构建

什么是项目构建

项目构建是一个项目从编写源代码到编译、测试、运行、打包、部署到运行的一系列过程

传统的项目构建过程

传统项目构建过程如下
  1. 在Eclipse中创建一个Java Web工程
  2. 在工程中编写源代码及配置文件等
  3. 对源代码进行编译(.java --> .class)
  4. 进行JUnit单元测试
  5. 将工程打包成war包部署到Tomcat运行

Maven项目构建过程

Maven将项目构建的过程进行标准化,每个阶段使用一个命令来完成,如下图
上图中部分阶段对应命令如下
  • clean:清理阶段的命令,清理输出的class文件
  • compile:编译阶段的命令,将Java代码编译成class文件
  • package:打包阶段的命令,将Java工程打成jar包,Java Web工程打成war包
运行一个Maven工程(Web工程)需要使用一个 tomcat:run 命令
Maven工程构建的优点
一个命令完成构建、运行,方便快捷
Maven对每个构建阶段进行规范,有利于大型团队协作开发

依赖管理

什么是依赖管理

    什么是依赖?一个java项目可能要使用一些第三方的jar包才可以运行,那么我们说这 个java项目依赖了这些第三方的jar包。
    举个例子, crm系统,它的架构是SsH框架,该crm项目依赖SSH框架,具体它 依赖的Hibernate、Spring、Struts2。
     什么是依赖管理?就是对项目所有依赖的jar包进行规范化管理。
简言之,依赖管理就是jar包的管理

传统项目的依赖管理

    传统的项目工程要管理所依赖的jar包完全靠 人工手动进行,程序员从网上下载jar包添加 到项目工程中,如下图:程序员手工将 Hibernate、Struts2、Spring的jar添加到工程中的WEB-INF/lib 目录下。
传统的依赖管理方式的缺陷
  • 没有对jar包的版本统一管理,容易导致版本冲突
  • 从网上手动寻找jar包不方便,效率低下
  • jar包被添加到工程中导致工程变得庞大

Maven项目的依赖管理

    Maven项目管理所依赖的jar包不需要手动向工程添加jar包,只需要在pom.xml文件(maven 工程的配置文件)中添加jar包的坐标,自动从Maven仓库中下载jar包、运行,如下图:
使用Maven进行依赖管理的优点
  • 通过pom.xml文件对jar包的版本进行统一管理,可以避免版本冲突
  • Maven团队维护了一个非常全的Maven仓库,包括了当前使用的jar包,Maven工程可以通过坐标自动从Maven仓库中下载jar包,方便快捷
    • Maven项目中没有jar包文件实体,体积相对小很多

使用Maven的优势

通过上边介绍传统项目和Maven项目在项目构建及依赖管理方面的区域,Maven有如下的 好处
  • 一步构建(一键构建):Maven对项目构建的过程进行标准化,通过一个命令即可完成构建过程
    • 有项目源码和Maven直接可以通过tomcat:rum命令构建这个Web项目,毋需提供其他jar/Tomcat环境等
  • 依赖管理:Maven工程不用手动导jar包,通过在pom.xml中定义坐标从Maven仓库自动下载,方便且不易出错,节省空间
  • Maven可跨平台,可在Window、Linux上使用
  • Maven遵循规范开发有利于提高大型团队的开发效率,降低项目的维护成本,大公司都会考虑使用Maven来构建项目

Maven的安装

略,见附件pdf

Maven仓库

    Maven工作时需要从仓库下载相应的jar包,如下图,本地项目A和项目B第一次通过Maven运行时都会从远程仓库(互联网上的长裤)下载jar包并保存在本地仓库(即本地文件夹),当第二次需要这些jar包时不再从远程仓库下载,而是从本地仓库中获取,而远程仓库中没有的jar包将从中央仓库获取,并下载到远程仓库中,类似 多级缓存

Maven仓库类型

  • 本地仓库:由自己维护
  • 远程仓库:由公司维护
  • 中央仓库:由Maven团队维护

本地仓库

用于存储从远程仓库或中央仓库下载的插件和jar包,项目使用到的jar包和插件会优先从本地仓库中查找
默认本地仓库位置位于 ${user.dir}/.m2/repository下,${user.dir}表示Windows用户目录
配置本地仓库
MAVEN_HOME/conf/settings.xml文件中配置本地仓库的位置
本文是 D:/apache-maven-3.5.4/conf/settings.xml

远程仓库

如果本地需要的插件或者jar包,本地仓库没有,则默认到远程仓库中下载,远程仓库可以在互联网中也可以在局域网中
一般公司自己会搭建一个远程仓库作为私服

中央仓库

在Maven软件中内置一个远程仓库地址http://repo1.maven.org/maven2,即中央仓库,服务整个互联网,由Maven团队自己维护,里面存储了非常全的jar包,包含世界上大部分流行的开源项目构件

Maven的基本使用

Maven项目的目录结构


Maven的常用命令

执行下列命令时命令行需要进入到项目目录中
  • clean:清理编译后的文件
  • compile:编译主目录的源代码文件
  • test:编译并运行test目录的代码
  • package:打包这个项目
    • 隐含了编译操作
    • 打包后项目包的位置名称由配置文件pom.xml决定,例如版本名称
  • install:将项目打包并发布到本地仓库
    • 同上,配置文件可以配置输出属性(位置,名称等)
  • tomcat:run:一键搭建Tomcat服务器并运行这个项目
    • 注意:Tomcat版本需要与Maven使用的jdk版本(环境变量配置的JAVA_HOME)兼容,否则启动后不能访问

*Maven命令的生命周期

Maven对项目构建过程分为 三套相互 独立的生命周期
  • clean生命周期
    • clean命令
  • default生命周期
    • compile命令
    • test命令
    • package命令
    • install命令
  • site生命周期
    • site命令
生命周期的阶段
    每个Maven命令对应生命周期的某个阶段,例如:mvn clean命令对应clean生命周期的clean阶段,mvn test命令对应default生命周期的test阶段。
    执行命令会将该命令再生命周期当中之前的阶段自动执行,如执行mvn clean命令会自动执行pre-clean和clean两个阶段,mvn test命令会执行validate、compile、test等阶段。
注意:执行某个生命周期的某个阶段不会影响其他生命周期
    如果要同时执行多个生命周期的阶段可在命令行输入多个命令,中间以空格隔开,如:clean package,将执行clean生命周期的clean阶段和default生命周期的package阶段。

*使用IntelliJ IDEA创建基本的Maven项目

如何添加jar包

手动添加
修改pom.xml,添加对应的依赖
如:添加servlet-api,jsp-api,junit等
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zella</groupId>
    <artifactId>mavenDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
        <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>
    </dependencies>

</project>
33
 
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0"
3
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
    <modelVersion>4.0.0</modelVersion>
6
7
    <groupId>com.zella</groupId>
8
    <artifactId>mavenDemo</artifactId>
9
    <version>1.0-SNAPSHOT</version>
10
    <packaging>war</packaging>
11
12
    <dependencies>
13
        <dependency>
14
            <groupId>junit</groupId>
15
            <artifactId>junit</artifactId>
16
            <version>4.9</version>
17
            <scope>test</scope>
18
        </dependency>
19
        <dependency>
20
            <groupId>javax.servlet</groupId>
21
            <artifactId>servlet-api</artifactId>
22
            <version>2.5</version>
23
            <scope>provided</scope>
24
        </dependency>
25
        <dependency>
26
            <groupId>javax.servlet</groupId>
27
            <artifactId>jsp-api</artifactId>
28
            <version>2.0</version>
29
            <scope>provided</scope>
30
        </dependency>
31
    </dependencies>
32
33
</project>
点选添加
在Windows环境在pom.xml使用
在pom.xml中的dependencies标签内使用快捷键alt+g呼出Generate菜单,点选dependency即可呼出搜索框直接一键导入依赖


使用Maven自带Tomcat
注意pom.xml必须配置packaging属性为war
然后可以通过手动输入命令的方式运行
或配置运行方式,以后可以点选运行

整合Struts2

在pom.xml中只要编写Struts2核心依赖,Maven会自动将框架所依赖的其他jar包(即org.apache.struts.xwork依赖的jar包)导入到项目中
只添加了struts2-core依赖,发现项目中出现更多的jar包,这种情况称为 依赖传递

整合过程
  • 编辑pom.xml文件,添加Struts2的核心jar包
    • 注意要修改jar的scope(依赖范围/作用域),与Tomcat冲突的jar需要改为provided
  • 编写一个简单的Action
  • src/resource目录下创建并编写struts.xml配置文件
  • 编辑web.xml配置核心过滤器
  • 访问网页测试是否整合成功

Maven的依赖范围

  • compile(默认):编译时、测试时、运行时和打包时均依赖该jar包(如struts-core)
  • provided:编译时和测试时依赖,运行时和打包时不依赖(如上文的servlet-api和jsp-api)
  • runtime:编译时不依赖,测试时、运行时和打包时依赖(如数据库驱动包(一般数据库驱动包由反射方式引入,不会报错))
  • test:编译时不依赖,测试时依赖,运行时和打包时都不依赖(如上文的junit)
  • system :不推荐使用

打包时依赖的jar包将会被打包进jar文件内部,不依赖则不打包该jar包,这就是产生冲突的原因
另外,依赖范围决定了在哪个目录的文件可以使用这个jar包,如只有在test目录下才可以使用junit这个jar
依赖范围对依赖传递的影响

Maven插件的添加

默认的普通的tomcat:run命令运行时使用的Tomcat版本是Tomcat6,默认端口是8080,可以添加插件使其使用Tomcat7并修改其默认端口
添加方法
编辑pom.xml,添加build->plugins->plugin标签
其中version不能自动补全,可以使用导入dependency的方法搜索该插件查看其对应的version版本号手动填写

配置好后出现新的可执行命令,使用tomcat7:run可以使用上面配置的端口和访问路径用Tomcat7部署这个项目
访问
在Maven窗口右键这个命令可以使用debug模式执行这个命令

整合SSH

整合Spring
在上文整合Struts2的基础上,添加struts2-spring-plugin:2.3.24插件jar包,依赖传递如下
再添加spring-context4.2.4,如下
pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zella</groupId>
    <artifactId>mavenDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
        <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>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.24</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.24</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>

    </dependencies>
</project>
48
 
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0"
3
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
    <modelVersion>4.0.0</modelVersion>
6
7
    <groupId>com.zella</groupId>
8
    <artifactId>mavenDemo</artifactId>
9
    <version>1.0-SNAPSHOT</version>
10
    <packaging>war</packaging>
11
12
    <dependencies>
13
        <dependency>
14
            <groupId>junit</groupId>
15
            <artifactId>junit</artifactId>
16
            <version>4.9</version>
17
            <scope>test</scope>
18
        </dependency>
19
        <dependency>
20
            <groupId>javax.servlet</groupId>
21
            <artifactId>servlet-api</artifactId>
22
            <version>2.5</version>
23
            <scope>provided</scope>
24
        </dependency>
25
        <dependency>
26
            <groupId>javax.servlet</groupId>
27
            <artifactId>jsp-api</artifactId>
28
            <version>2.0</version>
29
            <scope>provided</scope>
30
        </dependency>
31
        <dependency>
32
            <groupId>org.apache.struts</groupId>
33
            <artifactId>struts2-core</artifactId>
34
            <version>2.3.24</version>
35
        </dependency>
36
        <dependency>
37
            <groupId>org.apache.struts</groupId>
38
            <artifactId>struts2-spring-plugin</artifactId>
39
            <version>2.3.24</version>
40
        </dependency>
41
        <dependency>
42
            <groupId>org.springframework</groupId>
43
            <artifactId>spring-context</artifactId>
44
            <version>4.2.4.RELEASE</version>
45
        </dependency>
46
47
    </dependencies>
48
</project>
此时引入的jar大纲如下,可以发现引入了低版本(3.0.5)的spring-beans包
此时就发生了 版本冲突问题
处理版本冲突有多种方法,见下文,处理妥当后继续下面的操作
导入其余jar包
其实pom文件网络上有很多现成的,稍作修改就可以作为己用,如下
pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.itcast.maven-crm</groupId>
    <artifactId>maven-crm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>maven-crm</name>
    <description>maven-crm项目描述</description>

    <!-- 属性 -->
    <properties>
        <spring.version>4.2.4.RELEASE</spring.version>
        <hibernate.version>5.0.7.Final</hibernate.version>
        <struts.version>2.3.24</struts.version>
    </properties>

    <!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
    <dependencyManagement>
        <dependencies>
            <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-test</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.struts</groupId>
                <artifactId>struts2-core</artifactId>
                <version>${struts.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.struts</groupId>
                <artifactId>struts2-spring-plugin</artifactId>
                <version>${struts.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!-- 依赖管理 -->
    <dependencies>
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <!-- hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </dependency>

        <!-- 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
            <scope>runtime</scope>
        </dependency>
        <!-- c3p0 -->

        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>


        <!-- 导入 struts2 -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
        </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>
        <!-- 日志 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.2</version>
        </dependency>
        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
        <!-- jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- 设置编译版本为1.7 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!-- maven内置 的tomcat6插件 -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>tomcat-maven-plugin</artifactId>
                <version>1.1</version>
                <configuration>
                    <!-- 可以灵活配置工程路径 -->
                    <path>/ssh</path>
                    <!-- 可以灵活配置端口号 -->
                    <port>8080</port>
                </configuration>
            </plugin>

        </plugins>
    </build>
</project>
180
 
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>cn.itcast.maven-crm</groupId>
5
    <artifactId>maven-crm</artifactId>
6
    <version>0.0.1-SNAPSHOT</version>
7
    <packaging>war</packaging>
8
    <name>maven-crm</name>
9
    <description>maven-crm项目描述</description>
10
11
    <!-- 属性 -->
12
    <properties>
13
        <spring.version>4.2.4.RELEASE</spring.version>
14
        <hibernate.version>5.0.7.Final</hibernate.version>
15
        <struts.version>2.3.24</struts.version>
16
    </properties>
17
18
    <!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
19
    <dependencyManagement>
20
        <dependencies>
21
            <dependency>
22
                <groupId>org.springframework</groupId>
23
                <artifactId>spring-context</artifactId>
24
                <version>${spring.version}</version>
25
            </dependency>
26
            <dependency>
27
                <groupId>org.springframework</groupId>
28
                <artifactId>spring-aspects</artifactId>
29
                <version>${spring.version}</version>
30
            </dependency>
31
            <dependency>
32
                <groupId>org.springframework</groupId>
33
                <artifactId>spring-orm</artifactId>
34
                <version>${spring.version}</version>
35
            </dependency>
36
            <dependency>
37
                <groupId>org.springframework</groupId>
38
                <artifactId>spring-test</artifactId>
39
                <version>${spring.version}</version>
40
            </dependency>
41
            <dependency>
42
                <groupId>org.springframework</groupId>
43
                <artifactId>spring-web</artifactId>
44
                <version>${spring.version}</version>
45
            </dependency>
46
            <dependency>
47
                <groupId>org.hibernate</groupId>
48
                <artifactId>hibernate-core</artifactId>
49
                <version>${hibernate.version}</version>
50
            </dependency>
51
            <dependency>
52
                <groupId>org.apache.struts</groupId>
53
                <artifactId>struts2-core</artifactId>
54
                <version>${struts.version}</version>
55
            </dependency>
56
            <dependency>
57
                <groupId>org.apache.struts</groupId>
58
                <artifactId>struts2-spring-plugin</artifactId>
59
                <version>${struts.version}</version>
60
            </dependency>
61
        </dependencies>
62
    </dependencyManagement>
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
107
108
        <!-- 导入 struts2 -->
109
        <dependency>
110
            <groupId>org.apache.struts</groupId>
111
            <artifactId>struts2-core</artifactId>
112
        </dependency>
113
        <dependency>
114
            <groupId>org.apache.struts</groupId>
115
            <artifactId>struts2-spring-plugin</artifactId>
116
        </dependency>
117
118
        <!-- servlet jsp -->
119
        <dependency>
120
            <groupId>javax.servlet</groupId>
121
            <artifactId>servlet-api</artifactId>
122
            <version>2.5</version>
123
            <scope>provided</scope>
124
        </dependency>
125
        <dependency>
126
            <groupId>javax.servlet</groupId>
127
            <artifactId>jsp-api</artifactId>
128
            <version>2.0</version>
129
            <scope>provided</scope>
130
        </dependency>
131
        <!-- 日志 -->
132
        <dependency>
133
            <groupId>org.slf4j</groupId>
134
            <artifactId>slf4j-log4j12</artifactId>
135
            <version>1.7.2</version>
136
        </dependency>
137
        <!-- junit -->
138
        <dependency>
139
            <groupId>junit</groupId>
140
            <artifactId>junit</artifactId>
141
            <version>4.9</version>
142
            <scope>test</scope>
143
        </dependency>
144
        <!-- jstl -->
145
        <dependency>
146
            <groupId>javax.servlet</groupId>
147
            <artifactId>jstl</artifactId>
148
            <version>1.2</version>
149
        </dependency>
150
    </dependencies>
151
152
    <build>
153
        <plugins>
154
            <!-- 设置编译版本为1.7 -->
155
            <plugin>
156
                <groupId>org.apache.maven.plugins</groupId>
157
                <artifactId>maven-compiler-plugin</artifactId>
158
                <configuration>
159
                    <source>1.7</source>
160
                    <target>1.7</target>
161
                    <encoding>UTF-8</encoding>
162
                </configuration>
163
            </plugin>
164
165
            <!-- maven内置 的tomcat6插件 -->
166
            <plugin>
167
                <groupId>org.codehaus.mojo</groupId>
168
                <artifactId>tomcat-maven-plugin</artifactId>
169
                <version>1.1</version>
170
                <configuration>
171
                    <!-- 可以灵活配置工程路径 -->
172
                    <path>/ssh</path>
173
                    <!-- 可以灵活配置端口号 -->
174
                    <port>8080</port>
175
                </configuration>
176
            </plugin>
177
178
        </plugins>
179
    </build>
180
</project>
然后可以开始配置dao层的环境了
在mysql创建一个新的数据库,名称为maven,新建一个表用于存储数据
Hibernate
  • 创建实体类(bean)用于接收数据条目
  • 引入Hibernate主配置文件hibernate.cfg.xml
  • 引入hbm映射文件
    • 注意,hbm文件等配置文件应该放置到resource文件下,且目录结构应该与main目录下Customer实体的目录结构相同,如下
      • 最终都会被打包到同一个目录中
导入Hibernate之后再导入Spring的配置文件(applicationContext文件)

*解决版本冲突

有多种方法解决版本冲突
根据Maven处理冲突的原则解决
Maven在处理版本冲突的时候遵循以下原则
  • 第一声明者优先:在pom文件中定义依赖,采用先声明的依赖
    • 运用这个原则:上文可以在pom文件中先声明spring-context以导入4.2.4版本的spring-beans,如下图
  • 路径近者优先:简单说就是在pom文件中声明需要的版本,直接引入这个版本的依赖,不通过依赖传递来引入jar包
排除依赖
上述问题也可以 通过排除依赖的方法来辅助依赖调解,在pom文件声明exclusions标签定义需要排除的依赖
锁定版本
    面对众多的依赖,有一种方法不需要考虑依赖路径、声明优化等因素,可以使用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或路径,以锁定的版本为准添加到项目中, 企业开发常用。
这种方法类似添加依赖,但是两者不同,锁定版本不代表添加依赖
  • 版本锁定声明在添加依赖前,相当于先告知Maven需要的版本,Maven根据锁定声明来引入对应版本的jar
  • 添加依赖是在dependencies标签内声明,而锁定版本是在dependencyManagement标签中声明,如下
pom文件如下:锁定了4.2.4的spring-beans版本,若依赖传递涉及spring-beans这个jar包,将 不受依赖声明顺序的影响,直接引入该版本jar
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zella</groupId>
    <artifactId>mavenDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.2.4.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
        <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>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.3.24</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.3.24</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>

    </dependencies>
</project>
57
 
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0"
3
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
    <modelVersion>4.0.0</modelVersion>
6
7
    <groupId>com.zella</groupId>
8
    <artifactId>mavenDemo</artifactId>
9
    <version>1.0-SNAPSHOT</version>
10
    <packaging>war</packaging>
11
12
    <dependencyManagement>
13
        <dependencies>
14
            <dependency>
15
                <groupId>org.springframework</groupId>
16
                <artifactId>spring-beans</artifactId>
17
                <version>4.2.4.RELEASE</version>
18
            </dependency>
19
        </dependencies>
20
    </dependencyManagement>
21
    <dependencies>
22
        <dependency>
23
            <groupId>junit</groupId>
24
            <artifactId>junit</artifactId>
25
            <version>4.9</version>
26
            <scope>test</scope>
27
        </dependency>
28
        <dependency>
29
            <groupId>javax.servlet</groupId>
30
            <artifactId>servlet-api</artifactId>
31
            <version>2.5</version>
32
            <scope>provided</scope>
33
        </dependency>
34
        <dependency>
35
            <groupId>javax.servlet</groupId>
36
            <artifactId>jsp-api</artifactId>
37
            <version>2.0</version>
38
            <scope>provided</scope>
39
        </dependency>
40
        <dependency>
41
            <groupId>org.apache.struts</groupId>
42
            <artifactId>struts2-core</artifactId>
43
            <version>2.3.24</version>
44
        </dependency>
45
        <dependency>
46
            <groupId>org.apache.struts</groupId>
47
            <artifactId>struts2-spring-plugin</artifactId>
48
            <version>2.3.24</version>
49
        </dependency>
50
        <dependency>
51
            <groupId>org.springframework</groupId>
52
            <artifactId>spring-context</artifactId>
53
            <version>4.2.4.RELEASE</version>
54
        </dependency>
55
56
    </dependencies>
57
</project>

*pom文件中的properties标签

可以在pom文件中的properties标签定义引用,以使用${xxx}的格式来引用这些属性

Maven的分模块开发

概述

我们的项目分为Web层、Service层、Dao层和 Entity层
  • 创建父工程
    • 父工程的作用
      • 统筹调度作用
      • 配置主要依赖
  • 创建首个子模块
    • 基本
      • 子模块不需要再配置父类已配置的依赖,可以直接继承父类配置好的依赖
      • 子模块的配置文件有时候需要根据模块名称来命名(如applicationContext-dao.xml),以区分各模块之间的配置文件
    • 一般来说Web层模块打包方式为war包,其他为jar包
  • 创建其余子模块
    • 模块之间的依赖通过在这个模块的pom文件引入依赖模块的依赖即可(同普通引入依赖)
      • 而配置文件(applicationContext文件)间的依赖需要这样配置
        • 注意:classpath*:(包括jar包)和classpath:(不包括jar包)    
      • service依赖dao的bean
    • 创建Web层模块时打包方式应该设置为war,并记得创建web.xml文件(和Weg层框架的配置文件如struts.xml)
分模块开发最终得到的是Web层模块打包成的war包,内含其他模块的jar包,Tomcat运行的是这个war包
分模块开发中依赖范围对依赖传递的影响

*使用Intellij IDEA创建多模块的Maven工程

可以参考

Maven的概念模型

    Maven包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
下图为Maven的概念模型图
  • 项目对象模型(Project Object Model)
    • 一个Maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等
  • 依赖管理系统(Dependency Management System)
    • 通过Maven的依赖管理对项目所依赖的jar包进行统一管理
    • 如:项目依赖JUnit4.9,通过在pom.xml中定义JUnit4.9的依赖即可使用JUnit4.9,如下所示
  • 一个项目的生命周期(Project Lifecycle)
    • 使用Maven完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,Maven将这些过程规范为一个生命周期,如下图
    • Maven通过执行一些简单命令即可实现上边生命周期的各个过程,如:mvn compile命令执行编译
  • 一组标准集合
    • Maven将整个项目管理过程定义一组标准,比如:通过Maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理和标准的坐标定义
  • 插件(plugin)目标(goal)
    • Maven管理项目生命周期过程是基于插件完成的

私服-Nexus

详见附件实战篇
(建议复习)
JUnit测试

*IDEA快速生成测试类的方法


附件列表

    猜你喜欢

    转载自www.cnblogs.com/zella1996/p/9550390.html