代码改变世界

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

2025-12-10 23:04  tlnshuju  阅读(7)  评论(0)    收藏  举报

一、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、修改本地仓库地址(以实际为准)

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

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

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

3、配置jdk,在profiles中配置

<!--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 包进行统一管理

<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

messageClass com.oneHeart.Servlets.HelloServlet is not a Servlet

descriptionThe 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包作用范围为编译,只在编译时候生效。

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的命令。

<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文件

<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