DDD架构Maven项目打包上传云服务器启动全流程(问题汇总+解决方案)

一、前期准备

1. 项目:DDD架构多模块Maven项目,核心启动模块为app层(application模块,含启动类)

2. 环境:云服务器(Ubuntu系统)已安装JDK(与本地版本一致),可通过SSH连接,已开放对应端口(如8091)

3. 工具:IDEA(打包项目)、终端/SSH工具(连接服务器)、文件传输工具(拖传jar包,可选)

二、全流程操作+问题汇总+解决方案

步骤1:IDEA打包DDD多模块项目

核心需求

打包整个DDD多模块项目,最终获取可运行的jar包(DDD架构中仅app层可生成可运行jar)

常见问题

问题1:执行mvn clean package显示BUILD SUCCESS,但找不到jar包

问题2:误以为多模块项目需给每个模块单独打包,担心其他模块(domain、infrastructure等)不生成jar影响运行

解决方案

1. 明确DDD多模块打包规则(关键):

  • 父工程:pom.xml中<packaging>pom</packaging>;,仅管理依赖,不生成jar包

  • 启动模块(app层):pom.xml中pom.xml中<packaging>jar</packaging>;,必须添加SpringBoot打包插件(否则无可用jar)

  • 其他模块(domain、infrastructure、interfaces):pom.xml中<packaging>jar</packaging>;,无需添加打包插件,打包app层时会自动将其代码聚合到app的jar中

2. 正确打包操作:

  • 打开IDEA右侧Maven面板,找到最顶层父工程

  • 依次双击Lifecycle下的clean(清理旧包)、package(打包整个项目)

  • jar包位置:仅在app模块的target文件夹下(路径:app模块目录/target/xxx.jar),父工程和其他模块的target无可用jar,属于正常现象

3. 疑问解答:其他模块不生成单独jar不影响运行,因为Maven打包app层时,会自动将所有依赖模块的代码、class文件聚合到app的jar中,最终仅需部署app层的jar即可。

步骤2:上传jar包到云服务器

核心需求

将app层target下的jar包,上传到云服务器指定目录(本文以/dev-ops/lz-project为例)

常见问题

问题1:创建目录时报错:mkdir: cannot create directory ‘lz-project’: Permission denied(无权限创建目录)

问题2:将jar包拖到服务器目录时,提示“没有写权限”

解决方案

1. 解决目录创建权限问题(二选一):

  • 临时提权创建:sudo mkdir lz-project(输入服务器密码即可)

  • 切换root用户(一劳永逸):sudo -i,切换后可直接执行mkdir lz-project,无需反复提权

2. 解决jar包上传权限问题(二选一):

  • 给目录开最大权限:sudo chmod 777 lz-project(简单高效,适合测试/个人项目)

  • 修改目录归属用户:sudo chown -R $USER:$USER lz-project(更安全,适合生产环境)

3. 上传操作:权限设置完成后,直接将app层的jar包(group-buy-market-lizhuang-app.jar)拖到服务器的/dev-ops/lz-project目录即可。

步骤3:云服务器启动jar包

核心需求

在服务器上启动上传的jar包,确保项目正常运行

常见问题

问题1:执行java -jar group-buy-market-lizhuang-app.jar报错:Error: Unable to access jarfile group-buy-market-lizhuang-app.jar(找不到jar包)

问题2:启动时提示SLF4J: Class path contains multiple SLF4J bindings(SLF4J多绑定警告)

问题3:启动报错:Port 8091 was already in use(端口被占用)

问题4:前台启动项目后,关闭终端项目停止

解决方案

1. 解决“找不到jar包”问题:

  • 第一步:执行pwd命令,确认当前所在目录是否为jar包所在目录(本文为/dev-ops/lz-project)

  • 第二步:执行ls命令,查看当前目录下的jar包真实名称(避免手动输入时拼写错误)

  • 第三步:正确执行启动命令,可使用Tab键自动补全jar包名称(避免拼写错误)

2. 解决SLF4J多绑定警告:

  • 原因:项目依赖的多个jar包(如logback-classic、xfg-wrench相关starter)都包含SLF4J绑定,导致冲突

  • 说明:该警告不影响项目运行,SLF4J会自动选择一个绑定(本文中实际绑定为ch.qos.logback.classic.util.ContextSelectorStaticBinder),无需额外处理;若需消除警告,可在pom.xml中排除多余的SLF4J绑定依赖(参考SLF4J官方文档)。

3. 解决端口8091被占用问题:

  • 第一步:查看占用8091端口的进程:sudo lsof -i :8091(输出结果中PID即为进程号)

  • 第二步:杀死占用进程:sudo kill -9 进程号(本文中进程号为2050572,命令为sudo kill -9 2050572)

  • 第三步:验证端口是否释放:sudo lsof -i :8091(无输出即为释放成功)

4. 解决“关闭终端项目停止”问题(后台常驻启动):

  • 第一步:按Ctrl + C停止当前前台运行的项目

  • 第二步:执行后台启动命令:nohup java -jar group-buy-market-lizhuang-app.jar &gt; app.log 2&gt;&amp;1

  • 说明:该命令会将项目后台常驻运行,日志输出到app.log文件,关闭终端不影响项目运行

步骤4:项目启动验证与常用运维命令

1. 验证项目是否启动成功

执行命令:ps -ef | grep java,若能看到group-buy-market-lizhuang-app.jar相关进程,说明启动成功

补充:启动日志查看(实时):tail -f app.log,可看到Redis、RabbitMQ、Tomcat均启动成功,端口8091正常监听

2. 常用运维命令(必记)

  • 查看指定端口占用:sudo lsof -i :端口号(如sudo lsof -i :8091)

  • 杀死进程:sudo kill -9 进程号

  • 后台启动项目:nohup java -jar jar包名称.jar &amp;gt; 日志文件名.log 2&amp;gt;&amp;amp;1 &amp;amp;

  • 停止后台项目:先通过ps -ef | grep java找到进程号,再执行sudo kill -9 进程号

  • 查看实时日志:tail -f 日志文件名.log(如tail -f app.log)

  • 访问项目:浏览器输入http://云服务器公网IP:8091(需确保服务器安全组开放8091端口)

三、最终状态总结

✅ DDD多模块项目打包成功(仅app层生成可运行jar)

✅ jar包成功上传到云服务器指定目录(/dev-ops/lz-project)

✅ 所有权限问题、端口问题、jar包查找问题均已解决

✅ 项目后台常驻启动成功,Redis、RabbitMQ、Tomcat均正常运行

✅ 可通过浏览器访问项目(http://服务器公网IP:8091)

更多推荐