Maven项目打包上传云服务器启动全流程
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 > app.log 2>&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 &gt; 日志文件名.log 2&gt;&amp;1 &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)
更多推荐


所有评论(0)