Eclipse使用maven;配置本地仓库;构建java项目(使用骨架);构建web工程(不使用骨架);pom.xml
Eclipse使用maven
Eclipse使用maven插件不需要安装。只需要配置maven程序。
eclipse中maven配置
必须需要配置两个地方:
- 一个maven的安装目录
- 一个是maven核心配置文件的位置
配置maven安装目录
- Window→preferences
- Maven→Installations→Add…
- 点击Directory… 选择maven的解压根目录
- 点击“Finish”,勾选刚刚添加的maven,点击“Apply”应用

配置maven的settings
Window→preferences→User Settings→Browse…→选择解压maven下的settings配置文件

点击“OK”完成配置
对本地仓库创建索引
打开Maven仓库视图:
- windows→Show View→Other
- Maven→Maven Repositories

对本地仓库创建索引:

构建java项目(使用骨架)
- 右键新建工程
- 选择maven工程

- 选择骨架

- 配置maven工程的参数
点击finish完成工程创建。
提示:如果跳出来一个错误,基本上会是你的仓库中没有这个骨架和相关插件,请检查你的仓库是否配置正确!当然,如果能联网,会自动下载相应的插件。
目录结构

执行命令
提示:eclipse下,当工程保存的时候,会自动编译。
右键maven项目run as 查看能够使用maven 命令

通过手动输入命令,来执行mvn package命令:

点击“Run”,并刷新工程后:

构建web工程(不使用骨架)
新建项目→maven工程→勾选create a simple project
下一步,填写坐标并选择打包方式:

创建完成后:

出现了两个问题:
- Pom.xml文件报错
- Jdk的版本不对,默认都是1.5(之前的java项目也有这个问题)
Pom.xml报错
有错误信息结合项目结构知:缺少web.xml造成的


解决方案:
- 在webapp目录下创建/WEB-INF/web.xml
- Eclipse自动生成,推荐 右键maven-web工程 Jave EE Tools Generate Deployment Descriptor Stub
JDK版本
Maven工程默认jdk版本是1.5,而现在主流的开发版本都高于这个版本。
可以通过settings配置修改jdk版本号:
注意:在profiles标签中添加这段配置
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>

配置好之后,需要更新工程:
右键maven-web工程→Maven→update project
目录结构

src/main/java 存放项目源码
src/main/resources 存放项目配置文件
src/test/java 存放测试源码
src/test/resources 存放测试配置文件
src/main/webapp存放页面代码,相当于之前的WebRoot
添加jsp页面
首先创建一个jsp页面:
如果发现报错了,错误原因:jsp页面需要servlet的依赖包
两种解决方案:
1.添加tomcat的library(传统方式)
2.添加servlet的依赖(maven方式)
传统方式
右键→Bulid Path→configure Build Path…
Libraries→Add Library…→Server Runtime→选一个Tomcat→finish
更新maven:工程右键→maven→Update Project…
maven方式
找到maven工程的pom.xml→添加servlet的依赖坐标:
<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.atguigu</groupId>
<artifactId>maven-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
运行测试
Maven的web工程有两种运行方式:
- 外部tomcat运行(传统方式,运行方式跟之前一样把项目添加tomcat,然后启动即可)
- Maven的tomcat插件运行
在pom.xm中添加tomcat插件:
<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.atguigu</groupId>
<artifactId>maven-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 配置tomcat7插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- tomcat编码 -->
<charset>utf-8</charset>
<!-- tomcat端口 -->
<port>8088</port>
</configuration>
</plugin>
</plugins>
</build>
</project>
直接右键命令启动即可:右键→Run As→Maven bulid(第二个)→mvn tomcat7:run

点击run按钮即可启动。
该tomcat是内置的,和外面的tomcat没有关系。是内置运行的,每个tomcat都是独立运行的。
它会在target中临时生成本次运行的tomcat的环境:

通过浏览器访问测试:

pom.xml
Pom.xml文件是maven工程项目的核心配置文件。
【关于POM的三个概念】:自定义POM、超级POM、有效POM
- 自定义的POM(最小POM)就是用户创建的工程中的那个POM文件,内容较少。
- 超级POM位于maven的内部,拥有POM的所有默认配置。
- 有效POM=自定义POM+超级POM。
项目属性配置

modelVersion:使用pom对象模板的版本,一般就是4.0.0。
groupId:域名反写
artifactId:项目名
version:版本号
packaging:打包方式:pom(聚合) jar(Java工程) war(web工程)
name:项目的显示名,常用于 Maven 生成的文档。可以和artifactId不一致
description:项目描述,常用于 Maven 生成的文档
groupId artifactId version:项目坐标。这三个组合在一起可以唯一锁定项目在仓库中的位置。
如果要寻找一个项目在本地仓库中的位置,先要获得其项目坐标,格式:仓库/groupId/artifactId/version/项目包(jar、war)
引入依赖
依赖项目可以是第三方的,也可以是自己编写的。
通过坐标导入jar包
坐标主要三个元素:
- roupId:组ID
- artifactId:项目ID
- version:版本号
例如:

引入依赖的思路原理:
坐标决定项目在仓库中唯一位置,我们就可以通过坐标来导入依赖项目,即可以理解为:可以通过坐标导入jar包 。
示例:如何在项目中导入springMVC依赖包?
问题:要导入jar,首先要得到其坐标,那么怎么得到坐标呢?
两种方式:
- 使用网站搜索
http://search.maven.org/
http://mvnrepository.com/
- 使用maven插件的搜索功能
方式一:使用网站搜索。
在网站搜索项目,获取对应坐标。如:http://mvnrepository.com/

点击“Spring Web MVC”

下拉找到需要的版本,并点击版本号,例如:这里点击了4.3.22.REALEASE:

把该坐标copy到工程的pom.xml中,保存即可看到效果:

提示:所有的依赖都必须放到
方式二:使用maven插件的搜索功能
在工程上右击,或者在POM.xml文件上右击→maven→Add Dependency:
提示:前提是必须建立索引(本地索引)
效果:

依赖的传递
思考:为什么只导入核心core一个jar,但会导入这么多?
原因是:这个core的jar包会依赖其他jar,其本身的项目中的POM会描述其依赖的jar。
优势在于:如果手动的导入jar包,如果依赖的jar包忘记导入了,会报错。而maven会自动导入
传递性依赖也称之为间接依赖。

例如:

依赖的冲突
问题:如果两个jar,同时依赖与另外一个jar的不同版本,就可能导致jar冲突问题。这就是依赖的Jar版本冲突问题。
示例:同时引入spring-webmvc和spring-context的依赖(版本号不一致):

依赖关系图:

调换一下pom依赖的顺序:

依赖关系图:

提示:依赖是有顺序的!谁依赖的版本在前面,项目就使用哪个版本的jar包。
maven是如何选择版本的呢?(maven的依赖调节策略)
- 路径近者优先
- 第一声明者优先(当路径相同时,则有pom声明的依赖顺序原则)
依赖的排除
解决版本冲突问题的方案:
- 直接依赖
- 锁定版本
- 排除(项目)版本
锁定依赖:

点击锁定后,并保存后:

排除版本:


这是由于spring-context和spring-webmvc都被添加了exclusions排除:

这时可以手动去除一个排除exclusions。
依赖的范围
之前引入的servlet依赖,有scope标签就是配置的依赖范围。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
依赖范围的可选值:
- compile默认值
空间角度:默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。
时间角度:缺省值,适用于所有阶段,会随着项目一起发布。
- test
空间角度:在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。只对test目录有效(junit)
时间角度:不参与部署,不参与服务器运行
- provided
依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。
- runtime 了解
- system 了解
插件
