编程语言 / 计算机技术 · 2021年2月16日 0

学习JavaWeb(十一)——系列终章——Maven

前言

这个系列课追了这么久,现在是最后一点部分了——Maven

 

 

 

 


概述与安装

什么是Maven

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

 

核心功能

依赖管理

maven工程对jar包的管理过程。

将jar包放在一个仓库之中,编译和运行的时候去仓库中读取需要的jar包

一键构建

我们不再需要复杂的各种部署,我们可以直接用maven自带的tomcat插件来进行构建项目

 

下载安装

下面我们来进行下载安装,我们打开maven的官网

然后点击Download,找到一个合适的版本下载即可,下载下来是一个安装包。

我们将这个安装包解压到某个没有中文和空格的目录下。

解压后,一般会有如下几个目录:

  1. bin目录:放置这可运行程序
  2. boot目录:自身运行所需要的类加载器
  3. conf目录:一些配置文件
  4. lib目录:maven自身运行所需要的jar包

这里将bin目录配置一下环境变量,相信这个应该难不住你

 

仓库的种类和彼此关系

在conf/settings.xml中,我们可以看到:

  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>

${user.home}/.m2/repository,这个地址就是默认的maven的本地仓库。

当一个maven项目运行起来后,会自动来这个本地仓库找需要的jar包,如果本地仓库找不到,则在联网状态下,则会去互联网上一个中央仓库去找jar包,同时下载到本地仓库。

而在一些公司中,会在局域网里安排一个远程仓库(私服),方便本机去直接访问,不必再去maven大仓库了。

承接上面,我们不希望本地仓库在系统盘,则我们可以直接在下面写:

  <localRepository>E:\MavenLocalRepository</localRepository>

这个目录下就成了本地仓库。

 

标准目录结构

下面我们介绍一下maven的标准目录结构:

  1. src/main/java目录:核心代码部分
  2. src/main/resources:配置文件部分
  3. src/test/java目录:测试代码部分
  4. src/test/resources:测试配置文件
  5. src/main/webapp:页面资源(js、css、图片等)

 

 


入门知识

常用命令

  • mvn compile       编译项目
  • mvn clean      清理(删除target目录下的编译内容)
  • mvn test     项目单元测试的编译  (test和main下的代码都会编译)
  • mvn dependency:tree    查看依赖树
  • mvn package      项目打包(根据pom.xml进行打包)
  • mvn install       发布项目并提交到本地仓库

Maven生命周期

在默认生命周期中,五个命令是一个继承关系,即运行test会自动运行compile;运行packet会自动运行test和compile,以此类推。

Maven概念模型图


IDEA与项目

IDEA集成maven插件

打开我们的IDEA,在打开界面中,我们选择Configure,然后选择Settings。

在settings中我们搜索maven,找到下面的maven配置项,我们就可以配置maven。

让IDEA来接手我们本地安装的maven。

  • 在Maven  home  directory上选择本地Maven的安装目录。
  • 在User  setting  file中选上你的Maven安装目录下的conf目录下的settings.xml文件
  • 在Local  repository中选上你的本地仓库路径(如果上一项配置文件里写过了,这里就会自动填上)

然后我们点开下面的Runner,在VM  option中添加:

-DarchetypeCatalog=internal

这使得在IDEA利用Maven骨架创建Maven工程时,对于一些插件可以直接使用本地的(前提是以前联网创建过),不必再去联网下载。

使用骨架创建Maven的Java工程

打开IDEA,选择创建一个新工程。

在左侧找到Maven,点击,然后右边就会展示出n多骨架。

我们勾选上“Create  from  archetype”,然后就可以选择一个心仪的骨架了。

我们先来创建一个Java工程,在下面找到QuikeStart

然后我们需要构建坐标(依赖管理模型里的坐标,对本地仓库的索引):

然后可能会让你添加那些目录、配置文件位置那些,就简单填写即可。

大功告成。

使用骨架创建Maven的Web工程

双击打开IDEA,创建新项目,和上面一样在左侧找到Maven,然后选择骨架——maven-archetype-webapp。

然后选择下一步,填写坐标、填写路径信息等等,和上面一样。

创建好之后需要稍等一会,稍等一会之后就构建好目录了。

这里是没有Java目录的,我们可以手动在main下面创建一个Java目录,需要注意我们要右击然后标记此目录为“源码 根”

Web项目的一些操作

指定web资源包

创建好项目之后,可能会出现webapp没有被标记的情况,这是因为没有指定web资源包,我们打开文件-》项目结构-》模块-》然后点击上面的加号创建一个web模块,然后修改两个路径。

修改“Name”为“webapp”,接下来配置web的路径,上方的路径选择到“web.xml”为止,下方的路径选择到“webapp”为止,最后保存就可以了。

这样在webapp上右击就可以直接创建jsp文件。

导入依赖包

下面我们在Java目录下创建一个包,然后在包下面创建一个Servlet——MyServlet.java,这个时候在web.xml中没有写路径映射,我们手动添加一下:

  <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>cn.luoluo.servlet.MyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
  </servlet-mapping>

添加之后,Servlet中还是有很多报错,那是因为我们还没有添加对应的一些包,下面我们打开pom.xml,准备添加需要的包。

首先,初次配置的话,点击文件-》设置-》Maven-》Repositories,点击第一行,然后点击update,更新一下这个,这样我们写配置的时候就会有提示了。

然后,打开pom.xml,例如我们要导入servlet的包,就如下写:

  <!--放置项目运行所需要的jar包-->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
  </dependencies>

再写上我们需要的jsp包:

  <!--放置项目运行所需要的jar包-->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
    </dependency>
  </dependencies>

我们也可以在网上——Maven中央仓库找对应的jar包的坐标。

 

测试web项目

我们来创建一个hello.jsp,在刚刚的MyServlet.java中,我们写如下处理代码:

public class MyServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        request.getRequestDispatcher("/hello.jsp").forward(request,response);
    }
}

好的,下面,我们创建一个对应的hello.jsp,然后我们就来启动web项目看看效果。

如何启动项目呢?

在我们的IDEA右侧,我们可以看到一个Maven的工具栏,点开之后就可以看到很多生命周期命令,双击即可执行。

那么,对于我们的要使用tomcat插件部署的命令,该怎么弄?但就命令行的maven而言,我们是指定参数来实现,那么这里,我们点击上图中右上角的那个m符号,即“excute maven goal”,然后输入maven命令执行即可:

mvn   tomcat:run

光这样下来访问路径的话是会报错的,因为我们的一些jar包的作用域发生了冲突(在本地tomcat的安装目录lib中你可以看到servlet、jsp的包,而我们又导入了这个包,故在运行起来项目的时候相同的包会发生冲突),解决方法是在配置文件中指定好作用域,让我们自己导的包在写代码的时候起作用,运行的时候不起作用:

  <!--放置项目运行所需要的jar包-->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

再运行后,我这里又出现了一个报错,真是恼人,错误:org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException

Maven默认的Tomcat是6.0.29版本,而我的Java环境是JDK1.8,因为Tomcat 6不支持JDK 1.8,编译错误也正常,从报错信息里也可以看出来。

前往Apache的官网找Maven的插件,我们要将Maven的默认Tomcat改成支持JDK1.8的Tomcat插件。

Maven插件官网:http://maven.apache.org/plugins/

在 Misc 一栏里找到 Apache Tomcat,点进去。

Apache提供了四个版本的Tomcat。

每个版本里面都分Tomcat 6 和 Tomcat 7 两种插件。

我们选择tomcat7,在pom.xml的plugin里加入:

        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
        </plugin>

如果要修改端口:

        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <port>8888</port>
          </configuration>
        </plugin>

然后用mvn  tomcat7:run运行即可

运行起来后,直接访问http://localhost:8888/mavenWeb/MyServlet,可以看到跳转到了webapp的hello.jsp中。

IDEA快速编辑模板(小技巧,可跳过)

我们可以编辑一个快速模板,方便我们写代码,在文件-》设置中搜索live,就可以找到一个“代码模板”,点击右边的加号,选择第二项,创建一个模板组,我们可以命名自定义(custom)

然后我们再点击加号,选择第一项,创建一个模板。

在下面给模板起一个缩写,例如tomcat7,然后模板文本写刚才的那一堆:

        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <port>8888</port>
          </configuration>
        </plugin>

然后选择应用场合为XML,点击确定。

OK,当你在IDEA中想要写这么一大段的时候直接写tomcat7即可快速生成。

 

IDEA使用Maven的坑

如果导包突然导入失败(报错:Cannot resolve commons-fileupload:commons-fileupload:1.3),请检查设置中,Maven的配置信息是否正确,特别注意一个选项“Work  Offline”,这个要取消勾选才能联网。

 


这个系列就到此结束了,谢谢各位。

 

 

 

 

 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

是的,我就是计算机界的枭雄!