一、为什么使用Maven
你是否遇到过下面的这些情况:
- 使用一个框架(如spring),需要依赖的jar包太多太杂,每次要找到整理好保存在磁盘中的jar包文件夹,把所有jar导进项目。
- 在IDE中因为缺失jar包或版本问题,各种小红叹号
- 导入别人的项目,又是各种小红叹号
- 好不容易百度解决了叹号,运行时tomcat又出现问题
- 正常运行后,回头想看一下代码,猛一看"乱七八糟",它的配置文件扔到哪里了…
而Maven的出现,主要就是为了解决这些问题。所说的Maven项目,就是用Maven这一工具,来管理我们的项目。而Maven的作用由重要程度可以总结为以下三个方面:
-
依赖(jar包)管理 Maven有一个仓库的概念,下面会有介绍。在一个Maven工程中,我们不用手动的管理jar包,只需要写一下配置文件(pom.xml),Maven就会通过这个仓库,给我们整理依赖、下载jar包、导入jar包。 -
清晰的目录结构 Maven不仅给我们管理jar包,而对于一个Maven工程,它有一套约定俗成的目录结构,就好比我们所有的开发程序员,都商量好各种文件要怎么放置、放在什么位置。这样来看,方便了我们阅读别人的程序,而且也避免了在不同IDE下导致的各种各样的路径问题。Maven的目录结构如下: -
跨平台 不管是windows还是linux,只要安装的maven,拿到一个maven项目,都可以成功搭建或是部署(maven集成了tomcat,甚至没有安装tomcat也可以运行项目)
二、Maven仓库
上面提到Maven对jar包的管理是通过仓库来实现的,很容易理解,Maven有一个jar包的仓库,项目中需要什么jar包或者需要哪个版本的jar包,就和Maven说,Maven从仓库中找到这些jar包并导入到项目中。Maven涉及到的仓库分为三种,本地仓库、远程仓库、中央仓库。
- 本地仓库
本地仓库即在你本地电脑中,maven维护的一个仓库(文件夹)。这个仓库一开始肯定什么都没有,当你在项目配置文件中(pom.xml)配置你所需要的jar包时,maven会根据需求,从远程仓库或中央仓库下载相应的jar包到本地仓库,再从本地仓库导入到项目中。自然,当下载过一次后,下一次你需要这个同样的jar包,maven就可以直接从本地仓库导入。 - 远程仓库
maven默认没有配置远程仓库,远程仓库是为了加快jar包下载的速度,一般在学校、公司内部维护的一个私有仓库。下文没有提及配置远程仓库的方法。 - 中央仓库
中央仓库网址为http://mvnrepository.com/, 即maven官方或其他第三方(如阿里)维护的一个十分全的大仓库,基本覆盖了我们日常所需的所有jar包。因从maven官方下载速度慢,下文在maven安装中会将中央仓库改为阿里的仓库(建议改),阿里仓库网址:https://maven.aliyun.com。
三、Maven的安装配置
更改本地仓库路径、中央仓库
在Maven解压目录下的conf文件夹中的settings.xml为maven的基本配置文件。打开settings.xml,在标签下添加配置本地仓库的存放目录,即所有jar包都存放在这个目录下,若不配置,默认为用户目录下的.m2/repository
<localRepository>本地仓库存放目录</localRepository>
在< mirrors >标签下添加以下内容,更改Maven的中央仓库为阿里仓库
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
四、常用的Maven命令
当我们拿到一个maven项目,在项目目录下即可通过maven命令来实现编译、运行等操作,常用的maven命令如下:
- mvn clean清理编译后的文件(target文件)
- mvn compile 编译main下的代码
- mvn test-compile 编译test下的代码
- mvn test 运行test的代码
- package 打包
java项目–>jar包 web项目–>war包 由项目中pom.xml 配置war - install 发布项目到本地仓库,用在打jar包上,打成jar包可以被其他项目使用
- tomcat:run 使用tomcat运行
注意,以上的命令按顺序依次为compile、test-compile、test、package、install、tomcat:run,执行后面的会一并把前面的执行
五、依赖的作用域
前面也提到,在pom.xml可以配置项目需要的jar包,(具体怎么配置,在下面的demo中有涉及),但对于一些jar包,根据在不同的场景下,是可以有不同的打包策略的。
比如servlet相关的一些jar包,我们在开发测试环境下,编译阶段是需要的,而在运行阶段,用到的是tomcat中的相关的包,无需项目自带,因此是不用打包的。
再比如单元测试相关的包,如junit的包,仅是测试时使用,项目的编译、运行都用不到这些包。
而maven为我们提供了四中打包策略(即jar包的作用域),总结如下
1、maven-assembly-plugin 打包所有依赖
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass></mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
2、 maven-jar-plugin 打包 不包含依赖 同时 exclude可以排除一些文件
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>make-a-jar</id>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<excludes>
<exclude>*.properties</exclude>
<exclude>*.txt</exclude>
</excludes>
</configuration>
</plugin>
3、org.apache.maven.plugins 跳过测试环节
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
4、maven-war-plugin 打成war包 同时排除一些文件
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<packagingExcludes>WEB-INF/lib/*.jar,WEB-INF/classes/**</packagingExcludes>
</configuration>
</plugin>
六、写一个maven+ssm 核心文件配置
- 创建Maven项目
- pom.xml(Maven的核心)
pom.xml中就是我们项目需要的依赖或是插件的配置,需要的jar包都写在这里面,下面整理了ssm框架最基本的一些jar包,复制进pom.xml即可
<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.ssm</groupId>
<artifactId>SSM</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring.version>4.1.7.RELEASE</spring.version>
<mybatis.version>3.5.3</mybatis.version>
<mybatis-spring.version>1.3.2</mybatis-spring.version>
<mysql-connector.version>5.1.40</mysql-connector.version>
<junit.version>4.9</junit.version>
<c3p0.version>0.9.5</c3p0.version>
<servlet-api.version>3.1.0</servlet-api.version>
<slf4j.version>1.7.5</slf4j.version>
<lombok.version>1.18.10</lombok.version>
<jackson-databind.version>2.5.4</jackson-databind.version>
<maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
<tomcat7-maven-plugin.version>2.2</tomcat7-maven-plugin.version>
<jdk.version>1.8</jdk.version>
<encoding>utf-8</encoding>
</properties>
<dependencies>
<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>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</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-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
<encoding>${encoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>${tomcat7-maven-plugin.version}</version>
<configuration>
<port>8081</port>
<path>/</path>
<uriEncoding>${encoding}</uriEncoding>
<finalName>SSM</finalName>
</configuration>
</plugin>
</plugins>
<finalName>SSM</finalName>
</build>
</project>
|