Maven介绍安装与IDEA使用(JavaWeb)

一、Maven

Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标 (goal)的逻辑。

1.Maven的优势

没有使用Maven的web项目,是需要将各种jar包添加到工程中,如果相同架构项目有很多个,就需要将jar包复制到十个不同的项目中,导致项目占用空间大。

如果使用maven,则不需要将jar包添加到工程,而是将jar包存在maven仓库,然后引入项目中,当有多个项目,则不需要复制多次jar包,节省磁盘空间。

2.核心功能

2.1依赖管理

依赖管理 :传统的web项目将jar包放在项目中,但是maven的项目将jar包放在maven仓库中,项目中只存放jar包的坐标( 存放在pom.xml 文件中),当项目编译运行的时候,就会根据pom.xml 文件的jar包坐标从maven仓库中找到对应的jar包。

问题:

  • 通过读取 pom.xml 文件中的坐标,再到仓库中找到 jar 包,会不会很慢?
    • 通过 pom.xml 文件配置要引入的 jar 包的坐标,再读取坐标并到仓库中加载 jar 包 。 为了解决这个过程中速度慢的问题,maven 中也有索引的概念,通 过建立索引,可以大大提高加载 jar 包的速度,使得我们认为 jar 包基本跟放在本地的工程文件中再 读取出来的速度是一样的。

2.2 项目的一键构建

本地安装tomcat构建项目:编译、测试、运行、打包、安装、部署。项目放在toncat的webapp目录下,然后在bin目录下启动tomcat才可以部署项目。

maven的一键构建 :不使用本地安装的tomcat,使用maven自带的tomcat一键构建,而是在 项目目录下,打开cmd窗口,输入命令:mvn tomcat:run 便可以完成项目部署,操作更简便。

3.maven的下载安装

官网下载:https://maven.apache.org/download.cgi

根据自己的JDK选择合适的maven。JDK8的版本推荐使用Maven3.6.3

下载地址:https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip

通过网盘分享的文件:apache-maven-3.6.3-bin.zip

链接: https://pan.baidu.com/s/19Mi2CW1wwN9MwFtZpRqvJw?pwd=4p5s 提取码: 4p5s

Maven 版本 最低 JDK 要求 推荐 JDK 版本 支持的最高 JDK 版本 特点说明

Maven 3.9.x JDK 8 JDK 11/17 JDK 21+ 最新稳定版,支持新特性

Maven 3.8.x JDK 7 JDK 8/11 JDK 20 企业常用稳定版

Maven 3.6.x JDK 7 JDK 8 JDK 11-13 非常稳定的版本

Maven 3.5.x JDK 6 JDK 7/8 JDK 9 较老但稳定

出现的问题:对于JDK8、maven3.8.8的组合,会出现IDEA与maven版本不兼容的情况,推荐修改maven为mavn3.6.3,会出现以下异常信息:

java.lang.RuntimeException: java.lang.RuntimeException: org.codehaus.plexus.component.repository.exception.ComponentLookupException: com.google.inject.ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method ()V not found

3.1maven目录

下载之后解压可得到如下目录

  • bin:存放了 maven 的命令,比如我们前面用到的 mvn tomcat:run
  • ** boot**:存放了一些 maven 本身的引导程序,如类加载器等
  • ** conf**:存放了 maven 的一些配置文件,如 setting.xml 文件
  • ** lib**:存放了 maven 本身运行所需的一些 jar 包

3.2maven环境配置

  • 环境变量增加:MAVEN_HOME,同时在Path变量中添加MAVEN_HOME:%MAVEN_HOME%\bin
  • Maven的正常使用需要有JAVA_HOME的配置,mvn.cmd的脚本文件中会获取JAVA_HOME
  • maven检验是否成功:cmd打开窗口命令,输入:mvn -v,查看maven的版本和java的版本和os信息

3.3maven的settings.xml配置

2.3setting.xml文件的配置

在maven的conf目录下,可以进行setting.xml文件的修改进行配置。一般配置Maven的仓库地址(本地仓库)、远程仓库的地址。本地仓库用来存储jar包,一般不要放在C盘;远程仓库是当jar包在本地仓库没有的时候,去拉取远程仓库中的jar包。

该文件主要进行以下修改:

1、修改本地仓库地址(以实际为准)

xml 复制代码
    <!--1、修改本地仓库地址-->
<localRepository>E:\maven\mavenhost</localRepository>

2、修改远程仓库:在mirrors中添加以下内容(此处修改为阿里云公共仓库)

xml 复制代码
	<!--2、修改远程仓库:在mirrors中添加以下内容-->
<mirror>
	<id>aliyunmaven</id>
	<mirrorOf>*</mirrorOf>
	<name>阿里云公共仓库</name>
	<url>https://maven.aliyun.com/repository/public</url>
</mirror>

3、配置jdk,在profiles中配置

xml 复制代码
	<!--3、配置jdk,在profiles中配置-->
<profile>
	<id>jdk-8</id>
	<activation>
	<activeByDefault>true</activeByDefault>
	<jdk>8</jdk>
	</activation>
	<properties> 
	<maven.compiler.source>8</maven.compiler.source> 
	<maven.compiler.target>8</maven.compiler.target> 
 <maven.compiler.compilerVersion>8</maven.compiler.compilerVersion> 
	</properties>
</profile>

4.maven仓库

  • 本地仓库
    • 用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包, 优先从本地仓库查找
    • 本地仓库默认的配置路径是:${user.home}/.m2/repository,可以通过:E:\maven\mavenhost 来修改本地仓库地址
    • 当项目中使用的jar包在本地仓库没有,则会从私服或则中央仓库中寻找
  • 远程仓库(私服)
    • 公司内部不连接外网的时候(连接外网的时候也可以),会建立一个私服,存储使用的jar包
    • 远程仓库的jar包可以来源于:中央仓库,或则本地仓库上传
  • 中央仓库
    • 包含非常全面的jar包
    • 可以在settings.xml中的来配置

5.maven标准目录结构

一个项目分为四个部分:

  • 核心代码部分:会打jar包
  • 配置文件部分:不打在jar包,保证修改配置文件的时候不需重新部署项目
  • 测试代码部分:单元测试文件
  • 测试配置文件部分

maven项目的目录:

  • java的目录放核心代码

6.maven命令

  • clean:会删除target目录,清除项目编译信息
  • compile:会编译核心代码
    • src/main/java 目录--->>>classes,核心配置文件--->>>generated-sources
  • test:编译核心代码、测试代码 ,** 执行 src/test/java 下的单元测试类 **
    • java目录--->>>classes,核心配置文件--->>>generated-sources
    • 测试java目录--->>>test-classes,测试配置文件--->>>generated-test-sources
    • 执行 src/test/java 下的单元测试类
  • package:编译核心代码、测试代码,web项目打包项目成war包 (pom文件配置),java项目打包成jar包
    • java目录--->>>classes,核心配置文件--->>>generated-sources
    • 测试java目录--->>>test-classes,测试配置文件--->>>generated-test-sources
    • 打包war包java项目打包成jar包,maven-helloworld-0.0.1-SNAPSHOT.war
  • install:编译核心代码、测试代码,打包项目成war包 (pom文件配置)、安装项目到本地仓库
    • java目录--->>>classes,核心配置文件--->>>generated-sources
    • 测试java目录--->>>test-classes,测试配置文件--->>>generated-test-sources
    • 打包war包,maven-helloworld-0.0.1-SNAPSHOT.war
    • 将项目安装在本地仓库里
  • deploy:项目发布,会执行前面的命令,需要一些配置

7.maven生命周期

  • 清理生命周期: 在进行真正的构建之前进行一些清理工作。
  • 默认生命周期: 构建的核心部分,编译,测试,打包,部署等等。
  • 站点生命周期: 生成项目报告,站点,发布站点。

8.maven概念模型

(1)项目对象模型(Project Object Model)

项目对象模型就是项目的pom.xml文件,通过pom.xml文件定义:项目自身信息、依赖信息、运行环境信息(tomcat、jdk信息)

**(2) 依赖管理系统(Dependency Management System) **

通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理

xml 复制代码
<dependency>
  <!-- junit 的项目名称 -->
  <groupId>junit</groupId>
  <!-- junit 的模块名称 -->
  <artifactId>junit</artifactId>
  <!-- junit 版本 -->
  <version>4.9</version>
  <!-- 依赖范围:单元测试时使用 junit -->
  <scope>test</scope>
</dependency>

9.Idea集成maven开发

(1)idea的maven配置

** File --->> Settings --->> 配置maven**

(2)Runner配置

设置Maven -->>Runner的VM Options 为:-DarchetypeCatalog=internal,(可以从本地资源获取骨架)这样做是为了当没有联网的情况 使用骨架 创建maven项目,可以获取到原先的骨架历史,因为骨架每次都会下载,不联网无法获取骨架。

(3)创建maven 的Web项目

  • 指定资源包
    • main/java:核心代码,可以通过右键- Mark Directory as设置包性质
    • main/resources:配置文件
    • main/webapp:web项目,可以创建jsp文件。需要在Project Structure设置Modules,选择Modules新建web,同时设置webapp目录和web.xml文件
    • test/java:测试核心代码
    • test/resources:测试配置文件

(4)出现的错误:

1.webapp目录下无法创建jsp文件

'

解决措施:

2.javax.servlet.ServletException: Class com.oneHeart.Servlets.HelloServlet is not a Servlet

type Exception report

message ++Class com.oneHeart.Servlets.HelloServlet is not a Servlet++

description ++The server encountered an internal error that prevented it from fulfilling this request.++

exception

javax.servlet.ServletException: Class com.oneHeart.Servlets.HelloServlet is not a Servlet

编译的时候不出错,运行项目的时候出现的错误,创建的Servlet被提示 不是Servlet。

原因:maven集成了tomcat,我们可以查看本地tomcat 的依赖包,发现包含:servlet-api、jsp-api

而我们在maven 的pom.xml文件中添加了相同名称 servlet-api、jsp-api 的jar包(创建Servlet的时候需要),

而在项目运行的时候,则会和maven集成的tomcat包相冲突。

而解决的办法就是: 我们需要将pom文件中,我们添加的 servlet-api、jsp-api 包只在编译之时生效,而不在运行的时候生效,避免发生jar包冲突。我们可以使用provided指定jar包作用范围为编译,只在编译时候生效。

xml 复制代码
3.严重: Failed to initialize end point associated with ProtocolHandler ["http-bio-8080"]

java.net.BindException: Address already in use: JVM_Bind :8080

端口被占用异常,原因:之前启动了maven项目,未关闭。而后重新启动,就会出现端口被占用异常。

4.org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 1 in the generated java file

The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files

使用maven启动了Servlet之后,在浏览器访问对应的Servlet,Servlet可以正常访问,但是跳转页面会出现错误。

原因:maven集成的tomcat默认是tomcat6.0.29(如图所示),而java的jdk使用的是1.8,所以猜测这应该是tomcat与jdk版本不兼容引起的

解决措施:使用高版本的tomcat,在pom.xml文件中进行配置,配置好之后可以从Maven的Plugins执行tomcat7:run的命令。

xml 复制代码
<build>
  <plugings>
          <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
  </plugings>
</build>
5.配置模板Live Templates

10.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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<!-- pom文件的版本 -->
	<modelVersion>4.0.0</modelVersion>
	<!-- 企业域名倒序 -->
	<groupId>com.sofwin</groupId>
	<!-- 项目名称 -->
	<artifactId>test03</artifactId>
	<!-- 版本 snapshot快照版,在项目每次启动时会自动检查更新 release:1.1 -->
	<version>0.0.1-SNAPSHOT</version>
	<!-- 名称 -->
	<name>maven test</name>
	<!-- 描述 -->
	<description>maventest</description>
	<!-- 打包格式 jar:java project的打包,.jar文件 war:web project打包,打包为.war文件,可以直接在应用服务器中执行
pom:父级项目的打包格式 -->
	<packaging>war</packaging>
  <!-- 定义常用的依赖的版本
			 可以使用:${spring-version}、${mybatis-version} 来获取对应的值
	-->
<properties>
  <spring-version>4.3.6.RELEASE</spring-version>
  <mybatis-version>3.5.5</mybatis-version>
</properties>
  
	<!-- 依赖管理 一般出现在父级项目中,他用来规范继承关系的项目中使用的依赖的版本信息, 如果父项目中dependencyManagement,子项目中是不需要指定版本信息的 -->
	<!-- <dependencyManagement> dependencies如果定义在dependencyManagement中 规范父级别依赖
</dependencyManagement> -->
	<dependencies>
		<!-- dependency用于描述依赖的项目坐标 groupid:项目所属的组织机构 artifactid:项目id,将依赖中的每个jar称为一个项目
version:版本 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>5.2.7.RELEASE</version>
			<!-- 用于指定依赖的生命周期的 compile:编译、测试、运行有效,默认使用compile provided:编译、测试有效,运行无效(servlet依赖)
test:编译,测试有效,运行无效(junit,spring-test) runtime:测试、运行有效 system:与本机的系统变量相关,一致性差(不建议使用),编译测试有效。
import:从其他 pom 文件导入时有效 -->
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.4</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>
	<!-- 配置构建环境 -->
	<build>
		<!--
項目最終部署的名稱
-->
		<finalName>baseProject</finalName>
		<!-- 配置插件: 比如tomcat插件 -->
		<plugins>
			<!-- 配置JDK -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8.0_201</source>
					<target>1.8.0_201</target>
				</configuration>
			</plugin>
			<!-- tomcat插件 -->
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<configuration>
					<port>9991</port>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
  • 默认引入 的 jar 包 ------- compile 【默认范围 可以不写】(编译、测试、运行 都有效 )
  • servlet-api 、jsp-api ------- provided (编译、测试 有效, 运行时无效 防止和 tomcat 下 jar 冲突)
  • jdbc 驱动 jar 包 ---- runtime (测试、运行 有效 )
  • junit ----- test (测试有效)

依赖范围由强到弱的顺序是:compile>provided>runtime>test

相关推荐
不知几秋2 小时前
配置JDK和MAVEN
java·开发语言·maven
howard20052 小时前
在IPython和PyCharm里通过PySpark实现词频统计
pycharm·pyspark·ipython·词频统计
残雪飞扬2 小时前
Pycharm社区版安装
ide·python·pycharm
星光一影2 小时前
SpringBoot+Vue3无人机AI巡检系统
人工智能·spring boot·websocket·mysql·intellij-idea·mybatis·无人机
多多*13 小时前
分布式系统中的CAP理论和BASE理论
java·数据结构·算法·log4j·maven
合作小小程序员小小店13 小时前
web网页开发,在线考勤管理系统,基于Idea,html,css,vue,java,springboot,mysql
java·前端·vue.js·后端·intellij-idea·springboot
合作小小程序员小小店19 小时前
web网页开发,在线%就业信息管理%系统,基于idea,html,layui,java,springboot,mysql。
java·前端·spring boot·后端·intellij-idea
多多*21 小时前
牛客周赛 Round 117 ABCDE 题解
java·开发语言·数据结构·算法·log4j·maven
baviya21 小时前
一文彻底搞懂 Maven 依赖——从 <dependency> 到依赖冲突,带你看懂 Maven 的“江湖规矩”
java·maven