记录一个老项目Java Web+maven是如何跑起来的

最近因为工作需要,需要拓展一个很久以前别人开发的web系统的功能。笔者是一个从业多年的Android工程师,很久没接触Java Web了。Java Web曾经在大学学过,SSH框架当时也算是很熟悉了,不过多年未碰过了。笔者接触的是一个java+struts2+mybatis+maven结构的项目。

折腾了几天才把这个项目跑起来,在这里把这个艰辛的过程记录下来。

首先说明一下我的电脑配置:
Windows 10家庭版 AMD处理器 64位操作系统 内存8G。

首先下载Intellij IDEA,下载的是2019.3最新的,开发java web项目需要下载旗舰版。安装后需要破解。

从仓库将代码克隆下来,结果就有点懵了,不知道哪个是project的根目录。根据经验的判断,pom.xml文件所在目录应该是根目录,而且src也和它同级。结果也证明是对的。

前期先安装好jdk和tomcat。笔者的版本是jdk8和tomcat 9.0.31。

先要测试tomcat是否正常,将tomcat安装目录的bin目录下的startup.bat文件,拖到命令行窗口,可以启动tomcat。笔者这样做提示未设置catalina_base环境变量。安装完tomcat后还需要设置几个环境变量:CATALINA_BASE、CATALINA_HOME、PATH。

在浏览器中输入http://localhost:8080 测试tomcat是否正常。

使用idea将项目open后,查看控制台日志有中文乱码。乱码问题参考这篇文章可以解决:

解决IntelliJ IDEA控制台输出中文乱码问题

打开idea的Project Structure,配置好Artifacts和Facets。
记录一个老项目Java Web+maven是如何跑起来的_第1张图片

检查运行设置是否正确:
记录一个老项目Java Web+maven是如何跑起来的_第2张图片记录一个老项目Java Web+maven是如何跑起来的_第3张图片

经过build后,发现Event Log报了一个错:unable to import maven project

本地需要安装一个与idea匹配的maven,参考这篇文章可以解决:

No implementation for org.apache.maven.model.path.PathTranslator was bound

后来又发现编译出现错误,基本上每个java文件都提示找不到引入的类,而且第一行的package都会报错。发现package路径与源码路径不一致。需要设置源码的路径。参考如下记录一个老项目Java Web+maven是如何跑起来的_第4张图片
IDEA默认是将项目打包到操作系统的用户目录,这里我们可以将项目打包到tomcat安装目录的webapps目录下,这样比较方便。
记录一个老项目Java Web+maven是如何跑起来的_第5张图片

解决编译问题后,并且tomcat也正常启动了,访问项目主页发现是报404错误,静态页面也是404,查看idea输出的日志显示这个错误:

org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到
org.apache.catalina.core.StandardContext.startInternal Context [/open_pkg] startup failed due to previous errors

这是因为打包出的项目“WEB-INF”目录下没有lib目录。lib目录是放项目需要依赖的jar包。tomcat项目的目录是这样的:
记录一个老项目Java Web+maven是如何跑起来的_第6张图片
在WEB-INF下面有一个lib目录:
记录一个老项目Java Web+maven是如何跑起来的_第7张图片
如果没有这个lib目录或者lib目录下是空的,那么就会报上面的错误。
解决办法:
记录一个老项目Java Web+maven是如何跑起来的_第8张图片
这样重新部署后,就会发现在lib目录下有依赖的jar包。

如果发现还是报404错误,并且idea里显示启动日志报这个错:

org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD

那么很可能就是项目部署到tomcat后,静态页面找不到,先去看看tomcat的webapps里自己项目的目录有没有index.jsp或index.html页面。然后看一下Artifacts配置是否正确。参考这面这个博文。

解决方案:org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD

解决这些问题后,项目能正常访问了。

2020年3月3日补充:

最近发现项目虽然跑起来了,jsp页面可以打开,但是一些http接口无法访问,提示structs配置中Action找不到,报错是这样的:

There is no Action mapped for namespace [/] and action name [xxx] associated with context path[xxx]

尝试将项目改成域名直接访问(http://localhost:8080)也不行。而且项目启动需要5分钟以上, 查看项目部署到tomcat后的大小有1GB多。猜测是artifacts和facets那些配置有问题,可能是错误的循环打包了。

干脆就将module和facets以及artifacts删除重新配置了,最后发现其实很简单,正确地一键导入工程,根本就不需要自己进行额外的配置。

先将已经配置的module、artifacts、facets删除。如下图:
记录一个老项目Java Web+maven是如何跑起来的_第9张图片
点击减号删除:
记录一个老项目Java Web+maven是如何跑起来的_第10张图片
三个都删除后,项目就变成什么都没有了。不要着急,下面的操作很关键。

按下图步骤操作:
记录一个老项目Java Web+maven是如何跑起来的_第11张图片
接下来,弹出如下对话框,按提示操作:记录一个老项目Java Web+maven是如何跑起来的_第12张图片
点击 OK后,弹出如下图,按提示操作:
记录一个老项目Java Web+maven是如何跑起来的_第13张图片
完成后,发现Project Struture窗口中的Module、Facets、Artifacts都已经配置好了。我们什么都不要改动。重新部署后,发现项目能正常访问了。

如果是新建一个JavaWeb+Maven+Tomcat结构的项目,可以参考这篇文章:
IDEA+Maven+JavaWeb+tomcat项目搭建(图文并茂,详细)

你可能感兴趣的:(java)