我的Java Web之路47 - 使用Maven改造租房网工程
本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人。
目录
- 介绍
- 原来的租房网工程结构
- 改造思路
- 将原有工程改造为Maven工程
- 使用Maven引入依赖
- 验证
- 将Java源码目录改为 src/main/java
- 总结
介绍
既然已经知道了如何使用Maven,为了以后更好的添加其他第三方依赖库,我们先把原来的租房网工程改造成使用Maven来管理依赖库。
原来的租房网工程结构
我们目前版本的租房网工程是使用过Spring MVC和Spring IoC改造后的,可以参考这篇文章。它的工程结构现在是这样的:
现在租房网工程所依赖的第三方库都是手动下载,然后拷贝到 WebContent/WEB-INF/lib 目录下的,Eclipse会自动生成一个 Web App Libraries 用户库:
我们现在就继续基于这个版本来改造它吧。
改造思路
实际上,我们可以使用三种方式来改造租房网工程:
- 第一种方式是直接使用我们独立安装的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 :
执行该命令之后,会弹出 Create new POM 的对话框,需要你输入一些参数:
这里,我直接使用默认的,实际可以修改成符合我们需要的,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 按钮即可,可能转换过程需要等待一段时间,最后转换后的工程结构变成:
最大的变化就是,原来的 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文件的内容是这样的:
4.0.0
house-renter
house-renter
0.0.1-SNAPSHOT
war
src
maven-compiler-plugin
3.8.0
1.8
1.8
maven-war-plugin
3.2.1
WebContent
可以看到,转换过来的Maven工程的POM文件中并没有
还有,Java的源码目录是 src ,而不是标准的 src/main/java ,也没有 src/test/java 等目录,当然,这些都是可以修改的。
最后,可以看到
使用Maven引入依赖
这篇文章我们提到过,我们可以在POM文件中的
我们在该网站中输入 spring 关键字,得到如下搜索结果:
可以看到,Spring Framework 几个JAR包都被搜索出来,我们先选择 Spring Context 这个JAR包:
然后,选择它的截止到撰写本文时的最新版本 5.2.1.RELEASE :
底下文本框中会有 Spring Context 这个JAR包的Maven依赖配置的样板,直接复制到我们工程的POM文件中即可,当然我们先要添加一个
org.springframework
spring-context
5.2.1.RELEASE
然后,保存POM文件,这时候,奇迹发生了,Eclipse自然生成了一个 Maven Dependencies 节点,Java源码中的错误也少了许多,但还有一些错误,是关于Spring MVC的:
为什么我只添加了一个 spring-context 的JAR包,该 Maven Dependencies 节点下回有 spring-core 等JAR包呢?答案很简单,就是 spring-context 这个JAR包依赖于 spring-core 等JAR包啊,所以Maven会把这些JAR包都下载下来,这可以在POM文件的 Dependency Hierarchy 视图中看得更清楚:
实际上,Maven必须进行这种依赖的解析,因为可能有多个库依赖于同一个但不同版本的库,这就需要用户来决定最终使用哪个版本的库。
好,现在我们再用同样的步骤添加 Spring MVC 的JAR包即可:
org.springframework
spring-context
5.2.1.RELEASE
org.springframework
spring-webmvc
5.2.1.RELEASE
这时候,我们的Java源码的错误已经全部消失,但JSP页面还有一个警告,是关于JSTL标签库的,我们需要引入JSTL相关的JAR包:
org.apache.taglibs
taglibs-standard-impl
1.2.5
org.apache.taglibs
taglibs-standard-spec
1.2.5
现在,我们可以把 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 配置,可以从工程的右键菜单中打开:
弹出工程的属性对话框,可以看到这个 Java Build Path 配置的 Source 页内的源码目录只有一个 src :
现在,点击右端的 Add Folder.. 按钮,可以添加新的源码目录:
选中 src 目录,然后再点击底部的 Create New Folder... 按钮,然后在弹出的对话框中输入目录名,比如 main 。
然后再选中刚创建的 main 目录,在其下创建 java 目录。
最后,只勾选 java 目录:
点击底部的 OK 按钮:
此时, Java Build Path 这个配置对话框顶部会出现错误提示,说是源码目录不能是嵌套的,而底部的 Apply 按钮和 Apply and Close 按钮也是灰色的,不能点击。
现在,我们可以选中 src 这个源码目录,然后点击右端的 Remove 这个按钮,这样就把它删除掉了,最后点击 Apply and Close 按钮,我们的工程结构变成:
但是,目前 src/main/java 目录中还没有任何源代码,所以也导致了一些错误,我们需要把原来 src 目录下的 Java源码复制到此目录下才行,复制后是这样的:
现在,可以把原来的 src 目录下的 houserenter 删除了。
然而,在Eclipse中的租房网工程中仍然没有任何变化,只需要刷新一下该项目即可,选中该项目并按 F5 键,或使用该项目的右键菜单 -> Refresh :
现在,src/main/java 这个节点变成可以展开的,展开它即可看到实际上是由我们拷贝过去的Java源码,错误也随之消失了。
但是我们还差最后一步,就是在POM文件中的
src
这行代码删除,否则,Maven -> Update Project... 会报如下错误:
删除POM文件中的关于源码目录的该行配置之后,Java Build Path 这个配置对话框变成:
会提示 src/test/java 不存在,所以我们需要在 src 目录下再建立该目录,我们直接在文件系统中建立并刷新工程即可。
总结
现在,我们的租房网工程就变成比较标准的Maven工程了。
实际上,原来的 build 目录也可以删除了,现在的构建输出目录是 target 目录了。
执行 Maven build... 命令,输入目标 package ,运行即可构建我们的租房网工程了,输出目录 target 下面也有我们以后部署应用需要的WAR包:
我们可以使用压缩/解压缩工具,比如RAR,打开该WAR包,可以看到里面的内容主要是 WebContent 节点的内容,而生成的Java类的字节码文件会自动拷贝到 WEB-INF/classes 目录下。