目录
项目主要分为单体项目和聚合项目(多模块项目,它会把应用拆分成多个独立的模块,每个模块都有其特定的职责。这些模块通过依赖管理进行协作,最终组合成一个完整的应用)
部署的方式有本地和远程部署(云服务器)
Tomcat目录结构
Tomcat目录结构:
bin目录:存放tomcat的命令,主要两大类,.sh结尾(Linux命令),.bat结尾(windows命令)
conf目录:主要存放tomcat的配置文件,主要有:
1、server.xml可以设置端口号、设置域名或IP、默认加载的项目、请求编码格式
2、web.xml可以设置tomcat支持的文件类型
3、context.xml可以用来配置数据源之类的
lib目录:主要用来存放tomcat运行需要加载的jar包
logs目录:用来存放tomcat在运行过程中产生的日志文件,非常重要的是在控制台输出的日志
在windows环境中,控制台的输出日志在catalina.xxxx-xx-xx.log文件中
在linux环境中,控制台的输出日志在catalina.out文件中
webapps目录:用来存放应用程序,当Tomcat启动时会加载webapps目录下的应用程序,可以以文件夹、war包、jar包的形式发布应用。
当然,你也可以把应用程序放置在磁盘的任意位置,在配置文件中映射好就行。
work目录:是tomcat运行时的工作区,主要用于存放 Servlet 容器 处理 JSP和编译其后的 Servlet 类文件,还有其他一些临时生成的文件。清空work目录,然后重启tomcat,可以达到清除缓存的作用
ROOT目录:ROOT
目录属于 Web 应用目录,它是 Tomcat 默认的 Web 应用上下文。当访问 Tomcat 服务器的根路径(http://localhost:8080/
)时,实际上访问的就是这个目录下的资源。(我图片中把它删除了,其实是有的)
1、本地部署项目
单体项目
先打包项目为war包,对于单体项目,在项目中导入依赖
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml> <!-- 适用于 Servlet 3.0+ -->
</configuration>
</plugin>
</plugins>
</build>
<packaging>war</packaging>
打包好后,在target目录下找到.war包,然后将其部署到tomcat目录下的webapps下,这样启动tomcat后,便可以访问到了
如果要同时部署多个项目,这样就不能使用一个端口号,会冲突。因此需要在conf/server.xml文件中,进行如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!-- 修改位置1:这里配置第一个服务 -->
<Service name="Catalina">
<!-- 修改位置2:需要在这里修改端口号-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
/>
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 修改位置3:path资源目录上下文,docBase:在webapps下导入的war包的位置-->
<Context path="/" docBase="/root/tomcat/apache-tomcat-8.5.85/webapps/web-1.0-SNAPSHOT" reloadable="true"></Context>
</Host>
</Engine>
</Service>
<!-- 这里配置第二个服务,name不能重复 -->
<Service name="Catalina2">
<!-- 确保端口号不和其他服务端口号重复 -->
<Connector port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
/>
<Engine name="Catalina2" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps1"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 这里修改docBase的路径 -->
<Context path="/" docBase="/root/tomcat/apache-tomcat-8.5.85/webapps/testDemo2-1.0-SNAPSHOT" reloadable="true"></Context>
</Host>
</Engine>
</Service>
</Server>
聚合项目
对于聚合项目:
模块之间会有依赖,比如这个项目SimpleDemo有两个模块:service模块和web模块,web模块依赖于service模块 ,因此需要在web的pom.xml文件中,导入service的依赖。因此需要对service进行打包(package)。任何模块只要package后,都会在本地仓库中存储。因此可以直接坐标导入service依赖:
整体项目架构:
然后将web项目(根据实际情况)打包,打包成war包后,再将war包放到webapps目录下,然后访问对应的资源即可。
2、远程部署项目
在官网下载tomcat.tar.gz包,并将该包上传到云服务器上,解压好后,进入里面的webapp目录
将本地打包好的war包导入,通过在终端输入rz进行选择并导入(无论单体项目还是聚合项目,只要把war包导入即可)
导入好后,修改tomcat目录下的conf/server.xml文件,修改方式和上面的本地部署一样,注意docBase的路径(在云服务器上的绝对路径),在server.xml文件中修改了端口号,也要注意在云服务器控制台中开放端口号(关了防火墙也得开放)!
同时也要注意 tomcat版本和代码中servlet版本的兼容性 (重要!),以下是所注意的一些事项:
注意事项
一、将Tomcat项目部署到云服务器上后,可以正常显示首页,但是访问一些接口时出错;但本地是正常的
原因:Tomcat版本和servlet版本不兼容,云服务器上是Tomcat10+版本,不再支持javax-servlet,将 Servlet API 的包名从 javax.servlet
改为了 jakarta.servlet
。
所以解决方法方案有两种:1.降级Tomcat版本 2.升级项目依赖包(需将项目中的 javax.servlet
依赖迁移至 jakarta.servlet
)
Tomcat 版本 |
支持的 Servlet 规范 |
包名前缀 |
兼容的 Jakarta/Java EE 版本 |
Tomcat 10.x+ |
Servlet 5.0+ |
|
Jakarta EE 9+ |
Tomcat 9.x |
Servlet 4.0 |
|
Java EE 8 |
Tomcat 8.5.x |
Servlet 3.1 |
|
Java EE 7 |
Tomcat 7.x |
Servlet 3.0 |
|
Java EE 6 |
总结就是:Tomcat9.0以下的版本无法使用Jakarta包,如果是Tomcat10版本以上必须使用Jakarta包