news 2026/8/1 22:28:30

SSM聚合工程部署介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SSM聚合工程部署介绍

我们以哈米音乐为例介绍SSM聚合工程的部署

父工程 (ham-parent):

不写任何业务代码,主要用于统一管理所有子模块的版本、依赖和插件,打包方式是pom包

子模块:

ham-portal:前台模块,负责控制层和表现层,打包方式是war包

ham-core:底层公用的模块,负责dao和service的访问,打包方式是jar包

ham-console:后台模块,负责控制层和表现层,打包方式是war包

ham-file:文件服务器模块,打包方式是war包

子模块要继承父模块,父模块要聚合子模块

找到 ham-parent 的右侧 maven 视图,打包父工程执行 install

父工程打包成功后,所有子模块的打包也会自动全部打包好,将这三个war包复制到 tomcat 的webapps目录下,公共模块的jar包不用复制过来

这是因为在 ham-portal 的 pom.xml 文件中,声明了对 ham-core 的依赖

<dependency> <groupId>com.qcby</groupId> <version>1.0-SNAPSHOT</version> <artifactId>ham-core</artifactId> </dependency>

当使用 Maven 对 ham-portal 进行package打包时,Maven 会去本地 Maven 仓库里找到 ham-core-1.0-SNAPSHOT.jar 这个文件,自动把 ham-core-1.0-SNAPSHOT.jar 文件复制到 ham-portal.war 包内部的 WEB-INF/lib/ 目录下。Tomcat 启动后,会加载 ham-portal.war,并自动识别 WEB-INF/lib 目录下的所有 Jar 包,这样 ham-portal 中的代码就可以顺利调用 ham-core 中的内容了。

下面需要修改 tomcat 目录/conf/server.xml 文件,在同一台物理服务器上,用一个 Tomcat 进程运行多个独立的 Web 服务,它们互不干扰,拥有自己的端口和应用。

<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- Note: A "Server" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/server.html --> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" /> --> <!--APR library loader. Documentation at /docs/apr.html --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html --> <GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <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> <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/service.html --> <Service name="Catalina"> <!--The connectors can use a shared executor, you can define one or more named thread pools--> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- A "Connector" using the shared thread pool--> <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 This connector uses the NIO implementation. The default SSLImplementation will depend on the presence of the APR/native library and the useOpenSSL attribute of the AprLifecycleListener. Either JSSE or OpenSSL style configuration may be used regardless of the SSLImplementation selected. JSSE style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/localhost-rsa.jks" type="RSA" /> </SSLHostConfig> </Connector> --> <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2 This connector uses the APR/native implementation which always uses OpenSSL for TLS. Either JSSE or OpenSSL style configuration may be used. OpenSSL style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeyFile="conf/localhost-rsa-key.pem" certificateFile="conf/localhost-rsa-cert.pem" certificateChainFile="conf/localhost-rsa-chain.pem" type="RSA" /> </SSLHostConfig> </Connector> --> <!-- Define an AJP 1.3 Connector on port 8009 --> <!-- <Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="8443" /> --> <!-- An Engine represents the entry point (within Catalina) that processes every request. The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host). Documentation at /docs/config/engine.html --> <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> <Engine name="Catalina" defaultHost="localhost"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <!-- Use the LockOutRealm to prevent attempts to guess user passwords via a brute-force attack --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> </Host> </Engine> </Service> <!-- 后台项目服务 --> <Service name="Catalina1"> <Connector port="8086" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina1" 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 &quot;%r&quot; %s %b" /> <Context docBase="ham-console-1.0-SNAPSHOT" path="/" reloadable="true"/> </Host> </Engine> </Service> <!-- 前台项目服务 --> <Service name="Catalina2"> <Connector port="8087" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8011" protocol="AJP/1.3" redirectPort="8443" /> <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="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 &quot;%r&quot; %s %b" /> <Context docBase="ham-portal-1.0-SNAPSHOT" path="/" reloadable="true"/> </Host> </Engine> </Service> <!-- 图片服务器 --> <Service name="Catalina3"> <Connector port="8085" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8012" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina3" 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 &quot;%r&quot; %s %b" /> <Context docBase="ham-file-1.0-SNAPSHOT" path="/" reloadable="true"/> </Host> </Engine> </Service> </Server>

Connector 标签用于连接器,负责监听来自客户端的网络请求,并将响应返回给客户端;

HTTP 连接器的port配置监听对应端口,AJP 连接器的port配置监听对应端口;

Context 是Web 应用的具体配置,它将一个 Web 应用映射到一个 URL 路径上,

docBase用于指定 Web 应用的物理路径,path用于指定浏览器访问时的路径名,reloadable用于指定是否自动重载。

进入 Tomcat 的 bin 目录点击 Windows: startup.bat 或 Linux/macOS: ./startup.sh 运行启动脚本,当 Tomcat 启动时,它会自动检测到 webapps 目录下的新 .war 文件,并将其解压成一个同名的文件夹,web.war 会被解压成 web 文件夹,如下

conf 目录下也会生成名为Catalina1、Catalina2、Catalina3 的服务创建专属的工作目录和日志文件,这是因为 Tomcat 需要为每个独立的服务提供一个隔离的运行环境,以防止它们之间相互干扰

tomcat 启动成功后就可以访问该项目了,该项目的后台路径为:http://localhost:8086/index,前台路径为:http://localhost:8087/index,图片服务器路径为:http://localhost:8085/。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 9:28:00

数字化转型实践:SRM系统,如何提升采购团队的整体执行力?

在现代供应链体系中&#xff0c;采购执行环节的高效与否&#xff0c;已成为影响企业运营成本和市场响应速度的关键因素。然而&#xff0c;如今许多企业仍深陷效率陷阱&#xff1a;跨部门数据不一致、供应商沟通耗时长、人工核对易出错、以及合规性难以追溯。传统的线下管理方式…

作者头像 李华
网站建设 2026/7/28 3:14:47

[Script] 添加网格属性脚本

[Script] 添加网格属性脚本 引言 正文 调用方法 添加 np density 并导入数据 Author: JiJi \textrm{Author: JiJi} Author: JiJi Created Time: 2025.12.12 \textrm{Created Time: 2025.12.12} Created Time: 2025.12.12

作者头像 李华
网站建设 2026/8/1 7:08:59

千万不能忽视!外卖点单小程序最新排名,选错损失大了!

千万不能忽视&#xff01;外卖点单小程序最新排名&#xff0c;选错损失大了&#xff01;随着移动互联网的快速发展&#xff0c;外卖行业已经成为人们日常生活中不可或缺的一部分。为了更好地满足消费者的需求&#xff0c;许多餐饮商家纷纷推出了自己的外卖点单小程序。然而&…

作者头像 李华
网站建设 2026/7/31 10:33:00

14、Linux 文件操作全解析

Linux 文件操作全解析 1. 文件内容比较 在 Linux 中,我们可以使用 diff 命令对文件内容进行比较。使用 -i 选项可以进行不区分大小写的内容比较,示例如下: $ diff -i comparison_file1.txt comparison_file2.txt 2,4c2 < < This line should be removed. &l…

作者头像 李华
网站建设 2026/7/25 12:26:11

亲测靠谱!分享AI数字员工算法公司

亲测靠谱&#xff01;AI数字员工算法公司深度剖析行业痛点分析在AI数字员工领域&#xff0c;当前面临着诸多技术挑战。一方面&#xff0c;数据处理能力不足是一大难题&#xff0c;大量复杂的数据难以高效精准地分析和处理&#xff0c;导致决策的科学性和及时性受到影响。测试显…

作者头像 李华
网站建设 2026/7/31 17:43:10

Llama-Factory + 云GPU:构建企业级AI模型的黄金组合

Llama-Factory 云GPU&#xff1a;构建企业级AI模型的黄金组合 在大语言模型席卷各行各业的今天&#xff0c;越来越多企业意识到——拥有一个懂自己业务的“专属AI助手”&#xff0c;不再是锦上添花&#xff0c;而是提升效率、巩固竞争力的关键一步。然而&#xff0c;现实却很骨…

作者头像 李华