WUJUNWEI'S BLOG
WuJunwei
Jun 22, 2020
It takes 17 minutes to read this article.

Eclipse使用maven;配置本地仓库;构建java项目(使用骨架);构建web工程(不使用骨架);pom.xml

Eclipse使用maven

Eclipse使用maven插件不需要安装。只需要配置maven程序。

eclipse中maven配置

必须需要配置两个地方:

  • 一个maven的安装目录
  • 一个是maven核心配置文件的位置

配置maven安装目录

  1. Window→preferences
  2. Maven→Installations→Add…
  3. 点击Directory… 选择maven的解压根目录
  4. 点击“Finish”,勾选刚刚添加的maven,点击“Apply”应用

配置maven的settings

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

点击“OK”完成配置

对本地仓库创建索引

打开Maven仓库视图:

  1. windows→Show View→Other
  2. Maven→Maven Repositories

对本地仓库创建索引:

构建java项目(使用骨架)

  1. 右键新建工程
  2. 选择maven工程

  1. 选择骨架

  1. 配置maven工程的参数

点击finish完成工程创建。

提示:如果跳出来一个错误,基本上会是你的仓库中没有这个骨架和相关插件,请检查你的仓库是否配置正确!当然,如果能联网,会自动下载相应的插件。

目录结构

执行命令

提示:eclipse下,当工程保存的时候,会自动编译。

右键maven项目run as 查看能够使用maven 命令

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

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

构建web工程(不使用骨架)

新建项目→maven工程→勾选create a simple project

下一步,填写坐标并选择打包方式:

创建完成后:

出现了两个问题:

  1. Pom.xml文件报错
  2. Jdk的版本不对,默认都是1.5(之前的java项目也有这个问题)

Pom.xml报错

有错误信息结合项目结构知:缺少web.xml造成的

解决方案:

  1. 在webapp目录下创建/WEB-INF/web.xml
  2. 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工程有两种运行方式:

  1. 外部tomcat运行(传统方式,运行方式跟之前一样把项目添加tomcat,然后启动即可)
  2. 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包

坐标主要三个元素:

  1. roupId:组ID
  2. artifactId:项目ID
  3. version:版本号

例如:

引入依赖的思路原理:

坐标决定项目在仓库中唯一位置,我们就可以通过坐标来导入依赖项目,即可以理解为:可以通过坐标导入jar包 。

示例:如何在项目中导入springMVC依赖包?

问题:要导入jar,首先要得到其坐标,那么怎么得到坐标呢?

两种方式:

  1. 使用网站搜索

http://search.maven.org/

http://mvnrepository.com/

  1. 使用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的依赖调节策略)

  1. 路径近者优先
  2. 第一声明者优先(当路径相同时,则有pom声明的依赖顺序原则)

依赖的排除

解决版本冲突问题的方案:

  1. 直接依赖
  2. 锁定版本
  3. 排除(项目)版本

锁定依赖:

点击锁定后,并保存后:

排除版本:

这是由于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>

依赖范围的可选值:

  1. compile默认值

空间角度:默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。

时间角度:缺省值,适用于所有阶段,会随着项目一起发布。

  1. test

空间角度:在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。只对test目录有效(junit)

时间角度:不参与部署,不参与服务器运行

  1. provided

依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。

  1. runtime 了解
  2. system 了解

插件