为什么使用Maven这样的构建工具【why】

  1. 一个项目就是一个工程
    如果项目非常庞大,就不适合使用package来划分模块,最好是每一个模块对应一个工程,利于分工协作。借助于maven就可以将一个项目拆分成多个工程

  2. 项目中使用jar包,需要“复制”、“粘贴”项目的libs中

同样的jar包重复的出现在不同的项目工程中,你需要做不停的复制粘贴的重复工作。借助于maven,可以将jar包保存在“仓库”中,不管在哪个项目只要使用引用即可就行。

  1. jar包需要的时候每次都要自己准备好或到官网下载

借助于maven我们可以使用统一的规范方式下载jar包,规范

  1. jar包版本不一致的风险

不同的项目在使用jar包的时候,有可能会导致各个项目的jar包版本不一致,导致未执行错误。借助于maven,所有的jar包都放在“仓库”中,所有的项目都使用仓库的一份jar包。

  1. 一个jar包依赖其他的jar包需要自己手动的加入到项目中

FileUpload组件->IO组件,commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar

极大的浪费了我们导入包的时间成本,也极大的增加了学习成本。借助于maven,它会自动的将依赖的jar包导入进来。

安装Maven

Maven 官方下载地址:http://maven.apache.org/download.cgi
Maven的历史发布请移步这个页面:https://maven.apache.org/docs/history.html

安装 Maven 3.3+ 需要 JDK 1.7 或者更高版本。
非常有必要考虑,不然会报错

Maven仓库

Maven 仓库有三种类型:

  • 本地仓库(local):顾名思义就是本地本机放置构件的地方。Maven
    从远程仓库下载下来的构件都存放在本地仓库中,项目可以从本地 Maven
    仓库中获取自己所依赖的文件。
  • 中央仓库(central):Maven 中央仓库是由 Maven社区提供的仓库,
    其中包含了大量常用的库。中央仓库是 Maven 官方提供的,可通过
    http://search.maven.org/ 来访问。
  • 远程私服(remote):私服一般是指公司内部使用的仓库。运行 Maven 时,Maven 所需要的任何构件都是从本地仓库获取的,但是如果本地仓库没有,它就会尝试从远程仓库中下载构件到本地仓库。如果 Maven 无法连接到远程仓库,将无法正常构建项目。

    本地仓库配置

  • \apache-maven-3.6.0\conf\setting.xml路径下可以修改Maven配置
    1
    2
    3
    4
    5
    6
    7
    8
    <settings>
    <!-- localRepository
    | The path to the local repository maven will use to store artifacts.
    | Default: ${user.home}/.m2/repository 本地仓库默认存放地址
    | 修改localRespository可以设置本地仓库位置,下载的jar保存路径
    -->
    <localRepository>E:\maven\repository</localRepository>
    </settings>
  • 设置Maven下载jar包阿里镜像网站
    1
    2
    3
    4
    5
    6
    <mirror>
    <id>aliyun</id>
    <name>aliyun Maven</name>
    <mirrorOf>*</mirrorOf>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
  • 配置JDK版本
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <profile>
    <id>jdk-1.6</id>
    <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.6</jdk>
    </activation>
    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>16</maven.compiler.source>
    <maven.compiler.target>16</maven.compiler.target>
    <maven.compiler.compilerVersion>16</maven.compiler.compilerVersion>
    </properties>
    </profile>

    构建Maven项目

    创建特定的目录结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    根目录:工程名
    |---src:源码
    |---main:存放主程序
    |---java:java源码文件
    |---resource:存放框架的配置文件
    |---test:存放测试程序
    |---java:java源码文件
    |---resource:存放框架的配置文件
    |---pop.xml:maven的核心配置文件

    Maven 坐标组成

    groupId:当前Maven构件隶属的组织名。
    artifactId:项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。(必须)
    version:当前版本。(必须)
    packaging:打包方式,比如 jar,war… (必须)
    classifier:classifier通常用于区分从同一POM构建的具有不同内容的构件。它是可选的,它可以是任意的字符串,附加在版本号之后。
    1
    2
    3
    4
    5
    6
    7
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    </dependency>
    此配置下对应的路径为: /本地仓库/junit/junit/...jar
  • scope就是依赖的范围
  1. compile, 默认值,适用于所有阶段(开发、测试、部署、运行),本jar会一直存在所有阶段。
  2. provided, 只在开发、测试阶段使用,目的是不让Servlet容器和你本地仓库的jar包冲突
  3. runtime, 只在运行时使用,如JDBC驱动,适用运行和测试阶段。
  4. test, 只在测试时使用,用于编译和运行测试代码。不会随项目发布。
  5. system, 类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
依赖范围 编译时期 测试时期 打包
compile Y Y Y
test - Y -
provided Y Y -
runtime - Y Y
system Y Y -

IDEA中设置tomcat插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<build>
<plugins>
<!--引入tomcat服务器插件即可启动的web应用 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- 修改tomcat 配置-->
<port>8088</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>