本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考,希望能帮助更多码农和想成为码农的人。


文章目录

  • 介绍
  • 原来的租房网工程结构
  • 改造思路
  • 将原有工程转换为Maven工程
  • 使用Maven引入依赖
  • 验证
  • 将Java源码目录改为 src/main/java
  • 总结


介绍

既然已经知道了如何使用Maven,为了以后更好的添加其他第三方依赖库,我们先把原来的租房网工程改造成使用Maven来管理依赖库。

原来的租房网工程结构

我们目前版本的租房网工程是使用过Spring MVC和Spring IoC改造后的,可以参考这篇文章。它的工程结构现在是这样的:

如何更改maven模块名 maven改造_如何更改maven模块名


现在租房网工程所依赖的第三方库都是手动下载,然后拷贝到 WebContent/WEB-INF/lib目录下的,Eclipse会自动生成一个 Web App Libraries 用户库:

如何更改maven模块名 maven改造_java_02


我们现在就继续基于这个版本来改造它吧。

改造思路

实际上,我们可以使用三种方式来改造租房网工程:
• 第一种方式是直接使用我们独立安装的Maven,在命令行工具中使用 archetype:generate 这个插件和目标新建一个Maven工程(可以参考这篇文章,不过,我们可以选择 maven-archetype-webapp 这个模板),然后用Eclipse导入该Maven工程(可以参考这篇文章),最后将我们的Java源码、JSP页面、各种基于XML的配置文件拷贝到相应位置,并在POM文件中添加依赖。
• 第二种方式当然就是在Eclipse中使用集成好的Maven直接创建Maven工程,不过,任然需要把原有的Java源码、JSP页面、各种基于XML的配置文件拷贝到相应位置,并在POM文件中添加依赖。
• 第三种方式是最省事的,在Eclipse中可以直接将原有工程转换为Maven工程,我们就介绍这种方式吧。

将原有工程转换为Maven工程

如何将原有工程转换为Maven工程呢?很简单,Eclipse中有相应的命令菜单。

注意,我这里使用的是我自己独立安装的Maven,关于如何集成独立安装的Maven,可以参考这篇文章。

大家可以选中要转换的工程,弹出其右键菜单,里面既有该命令:Configure -> Convert to Maven Project :

如何更改maven模块名 maven改造_web_03


执行该命令之后,会弹出 Create new POM 的对话框,需要你输入一些参数:

如何更改maven模块名 maven改造_maven_04


这里,我直接使用默认的,实际可以修改成符合我们需要的,Maven的POM模型将所有项目/工程都视为一个构件,使用英文单词 artifact :

n.人工制品; (尤指具有历史或文化价值的) 手工制品,手工艺品;

可以看到此单词的含义也很有人文气息,把软件看成是一种工艺品,也是挺恰当的。事实上,好的软件的确看起来令人赏心悦目。当然,目前国内能够称得上软件艺术品和软件艺术大师的真的是凤毛麟角!

下面的几个参数就是对一个 artifact 的描述,其中,前三个唯一标识了一个 artifact ,简称 GAV:

• Group Id:相当于描述这个工艺品是出自谁的手笔。一般都会是一个团队,通常用URL的逆序,好像Java包名一样,比如 com.xxx.yyy;

• Artifact Id:相当于工艺品的名称;

• Version:很明显是版本的意思,Maven中把那种尚在开发中,未正式发布的版本视作 SNAPSHOT 版本,即快照版本,以后再详细介绍;

• Packaging:这相当于是该工艺品的存在形式,一般 Web 工程/项目是打成 war 包的形式,Java工程/项目是打成 jar 包的形式。它们实际上都是压缩包,可以使用压缩/解压缩工具比如RAR等打开查看里面的内容。还有其他形式比如 pom 等,以后再详细介绍;

• 后面的名称和描述可以不填,属于一般描述性信息。

输入参数之后,点击 Finish 按钮即可,可能转换过程需要等待一段时间,最后转换后的工程结构变成:

如何更改maven模块名 maven改造_web_05


最大的变化就是,原来的 Web App Libraries 这个用户库不见了,从而使得我们的Java源码出现找不到Spring相关类的错误,尽管 WebContent/WEB-INF/lib 目录下还有Spring的各个JAR包。

还有就是多了 Deployed Resources 节点和 target 节点,以及最重要的POM文件 pom.xml 。

Deployed Resources 节点实际上是Eclipse专门为Maven工程解析出来而形成的,可以看到其下包含了 WebContent 的内容。

target 目录实际上是Maven工程默认的构建输出目录。

而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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>house-renter</groupId>
  <artifactId>house-renter</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

可以看到,转换过来的Maven工程的POM文件中并没有 这个标签,我们需要自己添加。
还有,Java的源码目录是 src ,而不是标准的 src/main/java ,也没有 src/test/java 等目录,当然,这些都是可以修改的。
最后,可以看到 标签下有编译器和打war包的插件,以及它们的配置参数,这些都是Maven执行构建、打包等动作的时候要用到的插件。

使用Maven引入依赖

这篇文章我们提到过,我们可以在POM文件中的 标签下添加依赖库,而依赖的groupId和artifactId可以在 https://mvnrepository.com/ 这个网站中搜索到。

我们在该网站中输入 spring 关键字,得到如下搜索结果:

如何更改maven模块名 maven改造_eclipse_06


可以看到,Spring Framework 几个JAR包都被搜索出来,我们先选择 Spring Context 这个JAR包:

如何更改maven模块名 maven改造_如何更改maven模块名_07


然后,选择它的截止到撰写本文时的最新版本 5.2.1.RELEASE :

如何更改maven模块名 maven改造_maven_08


底下文本框中会有 Spring Context 这个JAR包的Maven依赖配置的样板,直接复制到我们工程的POM文件中即可,当然我们先要添加一个 标签:

<dependencies>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.1.RELEASE</version>
</dependency>
  </dependencies>

然后,保存POM文件,这时候,奇迹发生了,Eclipse自然生成了一个 Maven Dependencies 节点,Java源码中的错误也少了许多,但还有一些错误,是关于Spring MVC的:

如何更改maven模块名 maven改造_eclipse_09


为什么我只添加了一个 spring-context 的JAR包,该 Maven Dependencies 节点下回有 spring-core 等JAR包呢?答案很简单,就是 spring-context 这个JAR包依赖于 spring-core 等JAR包啊,所以Maven会把这些JAR包都下载下来,这可以在POM文件的 Dependency Hierarchy 视图中看得更清楚:

如何更改maven模块名 maven改造_eclipse_10


实际上,Maven必须进行这种依赖的解析,因为可能有多个库依赖于同一个但不同版本的库,这就需要用户来决定最终使用哪个版本的库。

好,现在我们再用同样的步骤添加 Spring MVC 的JAR包即可:

<dependencies>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.1.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.1.RELEASE</version>
</dependency>
  </dependencies>

这时候,我们的Java源码的错误已经全部消失,但JSP页面还有一个警告,是关于JSTL标签库的,我们需要引入JSTL相关的JAR包:

<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl -->
<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-impl</artifactId>
    <version>1.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-spec -->
<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-spec</artifactId>
    <version>1.2.5</version>
</dependency>

现在,我们可以把 WebContent/WEB-INF/lib 目录下的所有第三方依赖库都删掉了。

验证

我们可以在Eclipse中执行Maven工具的相关命令,比如 mvn package 这个命令即可执行项目的构建、打包等动作,参考这篇文章。
然后,在Eclipse中新建一个Server,它指向我们安装的 Tomcat,在该Server中添加我们的租房网应用,然后发布它,启动Tomcat,这些内容可以参考这篇文章。
我们在浏览器中尝试访问登录页面:

http://localhost:8080/house-renter/login.html

然后,访问其他链接,应该没有什么问题,改造成功!

将Java源码目录改为 src/main/java

其实,现在已经把租房网工程改为Maven工程了,以后添加依赖就可以直接在POM文件中进行了,而不必再手动去下载和配置依赖了。

但是,直接转换过来的Maven工程有一个不足,就是它的Java源码目录仍然是之前Java Web工程默认的 src 目录,而不是Maven工程的标准目录 src/main/java 。

这个源码目录其实是可以修改的,这就需要用到 Java Build Path 这个配置了。

可以有多种方式打开这个 Java Build Path 配置,可以从工程的右键菜单中打开:

如何更改maven模块名 maven改造_web_11


弹出工程的属性对话框,可以看到这个 Java Build Path 配置的 Source 页内的源码目录只有一个 src :

如何更改maven模块名 maven改造_web_12


现在,点击右端的 Add Folder… 按钮,可以添加新的源码目录:

如何更改maven模块名 maven改造_eclipse_13


选中 src 目录,然后再点击底部的 Create New Folder… 按钮,然后在弹出的对话框中输入目录名,比如 main 。

然后再选中刚创建的 main 目录,在其下创建 java 目录。

最后,只勾选 java 目录:

如何更改maven模块名 maven改造_java_14


点击底部的 OK 按钮:

如何更改maven模块名 maven改造_maven_15


此时, Java Build Path 这个配置对话框顶部会出现错误提示,说是源码目录不能是嵌套的,而底部的 Apply 按钮和 Apply and Close 按钮也是灰色的,不能点击。

现在,我们可以选中 src 这个源码目录,然后点击右端的 Remove 这个按钮,这样就把它删除掉了,最后点击 Apply and Close 按钮,我们的工程结构变成:

如何更改maven模块名 maven改造_web_16


但是,目前 src/main/java 目录中还没有任何源代码,所以也导致了一些错误,我们需要把原来 src 目录下的 Java源码复制到此目录下才行,复制后是这样的:

如何更改maven模块名 maven改造_eclipse_17


现在,可以把原来的 src 目录下的 houserenter 删除了。

然而,在Eclipse中的租房网工程中仍然没有任何变化,只需要刷新一下该项目即可,选中该项目并按 F5 键,或使用该项目的右键菜单 -> Refresh :

如何更改maven模块名 maven改造_java_18


现在,src/main/java 这个节点变成可以展开的,展开它即可看到实际上是由我们拷贝过去的Java源码,错误也随之消失了。

但是我们还差最后一步,就是在POM文件中的 <sourceDirectory>标签下的

<sourceDirectory>src</sourceDirectory>

这行代码删除,否则,Maven -> Update Project… 会报如下错误:

如何更改maven模块名 maven改造_maven_19


删除POM文件中的关于源码目录的该行配置之后,Java Build Path 这个配置对话框变成:

如何更改maven模块名 maven改造_web_20


会提示 src/test/java 不存在,所以我们需要在 src 目录下再建立该目录,我们直接在文件系统中建立并刷新工程即可。

总结

现在,我们的租房网工程就变成比较标准的Maven工程了。

实际上,原来的 build 目录也可以删除了,现在的构建输出目录是 target 目录了。

执行 Maven build… 命令,输入目标 package ,运行即可构建我们的租房网工程了,输出目录 target 下面也有我们以后部署应用需要的WAR包:

如何更改maven模块名 maven改造_java_21


我们可以使用压缩/解压缩工具,比如RAR,打开该WAR包,可以看到里面的内容主要是 WebContent 节点的内容,而生成的Java类的字节码文件会自动拷贝到 WEB-INF/classes 目录下。