JavaWeb和MavenJavaWeb项目部署到Tomcat的三种方法
JavaWeb和MavenJavaWeb项目部署到Tomcat
- Tomcat 的目录结构
- 手动打包成 WAR 文件并部署
- 部署一个基于 sevlet 技术栈的JavaWeb项目
- 部署一个基于 SSM 技术栈的MavenJavaWeb项目
- 修改 conf/server.xml 文件
- conf/Catalina 方式
Tomcat 的目录结构
Tomcat 的目录结构如下图
- bin目录:二进制执行脚本目录,存放windows或Linux平台上启动和关闭Tomcat的脚本文件,可以直接开启关闭tomcat服务;
- conf目录:存放Tomcat服务器的各种全局配置文件,其中包括 :server.xml(Tomcat的主要配置文件)和web.xml等配置文件;
- lib目录:存放Tomcat服务器以及所有web应用都可以访问的jar文件;
- logs目录:存放Tomcat执行时的日志文件,记录tomcat的运行状态和运行信息;
- temp目录:存放Tomcat运行时所产生的临时文件;
- webapps:Tomcat 的默认应用部署目录,将 Web 项目放入此目录,Tomcat 会自动部署并运行(支持 WAR 包、解压后的项目文件夹两种形式);
- work:Tomcat将JSP生成的Servlet源文件和字节码文件放到这个目录下;
- 其他文件:许可证和说明文件。
手动打包成 WAR 文件并部署
部署一个基于 sevlet 技术栈的JavaWeb项目
在 Eclipse 的 Project Explorer 中,右键点击需要部署的 JavaWeb 项目,选择 Export,在弹出的对话框中点击 WAR file
在 Web project 下拉菜单中,确认是需要打包的项目,在 Destination 处点击 Browse,选择一个你希望保存 .war 文件的位置,确保 Export source files 选项没有被勾选(除非你需要部署源码),点击 Finish,Eclipse 会开始打包,完成后会在指定位置找到生成的 .war 文件。
如果你的 Tomcat 正在运行请先将其停止(进入 Tomcat 的 bin 目录点击 Windows:shutdown.bat 或 Linux/macOS: ./shutdown.sh),再将上一步生成的 web.war 文件复制到本地 Tomcat 安装目录下的 webapps 文件夹中,如下
进入 Tomcat 的 bin 目录点击 Windows: startup.bat 或 Linux/macOS: ./startup.sh 运行启动脚本,当 Tomcat 启动时,它会自动检测到 webapps 目录下的新 .war 文件,并将其解压成一个同名的文件夹,web.war 会被解压成 web 文件夹,如下
打开浏览器,通过 http://localhost:8080/项目名/访问的文件名 即可访问该项目
部署一个基于 SSM 技术栈的MavenJavaWeb项目
这种部署项目的方式对于这两种技术栈的步骤只有打包方式不同,其余操作均相同
该基于 SSM 技术栈的MavenJavaWeb项目内容在我之前的博客中详细介绍过,博客地址如下:ssm整合项目
此处我们需要注意的是在 pom.xml 文件中 packaging 标签用于设置打包方式
执行 package或 install 命令,执行成功控制台输出 BUILD SUCCESS
执行成功后 Maven 会在项目根目录下创建一个 target 文件夹,在 target 目录下找到打包项目 WAR 文件,文件名通常是 项目名-版本号.war
将打包好的文件复制到 Tomcat 安装目录下的 webapps 文件夹下
Tomcat 在启动时会自动检测 webapps 目录下的新 WAR 文件,并将其解压成一个同名文件夹,然后部署它
打开浏览器,通过 http://localhost:8080/项目名/访问的文件名 即可访问该项目
需要注意的是这里可能会需要一个非常常见的部署问题,测试的时候正常,但部署之后再点击页面里的超链接可能会报404,还需要在地址栏中加上项目路径才可以访问成功,这是因为开发环境和部署环境的上下文路径不一致导致的。
在 IDE(如 IDEA/Eclipse)中测试时,如上图项目被部署在根上下文路径,此时项目的访问根路径是 http://localhost:8080/。部署到独立 Tomcat 后,解压后的WAR文件夹名会被 Tomcat 直接作为项目的默认上下文路径,所以该项目访问地址是 http://localhost:8080/ssmDemo-1.0-SNAPSHOT,浏览器解析 /account/findAll.do 时,/ 开头的路径是浏览器级别的绝对路径,它的解析规则是从 域名 / IP对应的最顶层地址 开始拼接,而不是从项目根目录开始,依然拼成 http://localhost:8080/account/findAll.do,并不是 http://localhost:8080/项目名/访问的文件名,找不到 account/findAll.do 对应的项目,所以返回 404。
解决方式:不要在代码中硬编码上下文路径,而是让程序在运行时动态获取上下文路径
使用 JSTL 的 <c:url> 标签
确保 JSP 页面顶部引入了 JSTL 标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
修改超链接和表单提交地址,将原来的相对路径用 <c:url> 标签包裹起来:<a href="<c:url value='/account/findAll.do' />">查询所有账户</a>
修改 conf/server.xml 文件
打开 tomcat 下 conf/server.xml 文件,在 <Host>
标签内输入项目配置信息,这种方法无需将项目复制到 Tomcat 的 webapps 目录,灵活性更高
Tomcat 的 server.xml 是核心配置文件,负责定义服务器的端口、引擎、虚拟主机(Host)等核心组件。其中 Host 标签代表一个虚拟主机(默认是 localhost),所有 Web 项目的部署配置都需嵌套在 <Host>
内。
<Context path="/web" docBase="C:/Users/HP/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/web" reloadable="true" />
通过添加 <Context>
元素,我们告诉 Tomcat 当浏览器访问 http://主机名:端口/[path] 时,实际去 docBase 指定的路径加载 Web 项目资源。
path:浏览器访问时的路径名
docBase:Web 项目的根目录在磁盘上的实际位置,即编译后的项目路径
reloadble: 项目文件修改后,Tomcat 是否自动重新加载项目
启动 Tomcat 后打开浏览器,通过 http://localhost:8080/项目名/访问的文件名 即可访问该项目
部署前面那个基于 SSM 技术栈的JavaWeb项目使用的是
<Context path="/ssm" docBase="D:/javacode/ssmDemo/target/ssmDemo-1.0-SNAPSHOT" reloadable="false" />
打开浏览器,通过 http://localhost:8080/项目名/访问的文件名 即可访问该项目
由于使用了 JSTL 的 <c:url> 标签,访问地址不再出错
conf/Catalina 方式
进入到 apache-tomcat-7.0.52\conf\Catalina\localhost 目录,新建一个 项目名.xml 文件 ,在这个新建的 xml 文件中,增加下面配置语句
<Context path="/web" docBase="C:/Users/HP/eclipse-workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/web" reloadable="true" />
在这种部署方式下,path 属性可以省略,因为 Tomcat 会自动使用 XML 文件名作为 path,如果同时指定了文件名和 path 属性,path 属性会覆盖文件名。
这种方法的本质是将每个 Web 项目的部署配置(<Context>
元素)从 Tomcat 的核心配置文件 server.xml 中分离出来,每个项目使用一个独立的 XML 文件进行配置。
配置文件存放位置为 Tomcat安装目录/conf/Catalina/localhost/,配置文件内部只包含该项目的 <Context>
元素,当 Tomcat 启动时,它会自动扫描 conf/Catalina/localhost/ 目录下的所有 .xml 文件,每找到一个文件,它就会根据文件名和文件内的配置来部署一个 Web 应用。
启动 Tomcat 后打开浏览器,通过 http://localhost:8080/项目名/访问的文件名 即可访问该项目
部署前面那个基于 SSM 技术栈的JavaWeb项目使用的是
<Context docBase="D:/javacode/ssmDemo/target/ssmDemo-1.0-SNAPSHOT" reloadable="false" />
由于使用了 JSTL 的 <c:url> 标签,访问地址不再出错