1. 项目背景与核心需求最近在整理公司遗留的老项目时遇到一个典型的Java EE系统——采用多模块Maven结构开发包含web模块、service模块和dao模块。当需要将这个系统部署到云服务器时发现传统的单模块打包方式完全行不通。经过两周的踩坑实践终于梳理出一套可靠的多模块Maven项目云端部署方案。这种项目结构在现代Java开发中非常普遍父POM管理公共依赖子模块各司其职。但正是这种优雅的设计在打包部署时却带来了特殊挑战模块间存在复杂的依赖关系需要确保依赖传递的正确性必须生成可独立运行的部署包云服务器环境与本地开发环境存在差异2. 环境准备与工具选型2.1 基础环境配置在开始之前需要确保以下环境就绪开发端JDK 1.8建议与生产环境保持一致Maven 3.6.3新版本对多模块支持更好Git用于代码版本管理服务器端CentOS 7.6其他Linux发行版也可相同版本的JDKTomcat 9根据项目需求可选其他容器Nginx用于静态资源服务和反向代理重要提示开发环境和生产环境的JDK版本必须严格一致否则可能引发兼容性问题。曾经因为开发机用JDK11而服务器用JDK8导致NoSuchMethodError异常。2.2 Maven插件选择对于多模块打包关键插件包括maven-compiler-plugin统一编译版本plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.8.1/version configuration source1.8/source target1.8/target encodingUTF-8/encoding /configuration /pluginmaven-war-pluginweb模块必备plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-war-plugin/artifactId version3.3.2/version configuration failOnMissingWebXmlfalse/failOnMissingWebXml /configuration /pluginspring-boot-maven-pluginSpring Boot项目plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId version2.7.0/version executions execution goals goalrepackage/goal /goals /execution /executions /plugin3. 多模块项目结构解析3.1 典型项目结构一个标准的多模块Maven项目通常如下parent-project/ ├── pom.xml (父POM) ├── module-web/ │ ├── pom.xml │ └── src/ ├── module-service/ │ ├── pom.xml │ └── src/ └── module-dao/ ├── pom.xml └── src/3.2 父POM关键配置父pom.xml需要声明packagingpom/packaging modules modulemodule-web/module modulemodule-service/module modulemodule-dao/module /modules dependencyManagement dependencies !-- 统一管理所有依赖版本 -- dependency groupIdorg.springframework/groupId artifactIdspring-core/artifactId version5.3.20/version /dependency /dependencies /dependencyManagement3.3 子模块依赖关系子模块间的依赖通过dependencies声明!-- module-web的pom.xml -- dependencies dependency groupIdcom.company/groupId artifactIdmodule-service/artifactId version${project.version}/version /dependency /dependencies4. 完整打包部署流程4.1 本地打包测试在父目录执行mvn clean package -DskipTests检查各模块target目录web模块应生成war包其他模块生成jar包常见问题如果发现某些依赖找不到可能是子模块编译顺序问题。可以尝试mvn clean install -DskipTests先install到本地仓库再package4.2 云服务器环境准备安装JDKyum install -y java-1.8.0-openjdk-devel验证安装java -version javac -version配置环境变量/etc/profileexport JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk export PATH$PATH:$JAVA_HOME/bin4.3 部署包上传与运行使用scp上传scp module-web/target/*.war userserver:/opt/tomcat/webapps/对于Spring Boot项目nohup java -jar module-web/target/app.jar app.log 21 配置Nginx反向代理server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; } }5. 高级配置与优化5.1 分环境打包使用Maven profiles实现profiles profile iddev/id properties envdev/env /properties /profile profile idprod/id activation activeByDefaulttrue/activeByDefault /activation properties envprod/env /properties /profile /profiles打包时指定profilemvn package -Pprod5.2 资源过滤处理不同环境的配置文件build resources resource directorysrc/main/resources/directory filteringtrue/filtering includes include**/*.properties/include include**/*.xml/include /includes /resource /resources /build5.3 构建Docker镜像可选添加DockerfileFROM openjdk:8-jre COPY target/module-web.war /app/ WORKDIR /app CMD [java, -jar, module-web.war]构建并运行docker build -t myapp . docker run -d -p 8080:8080 myapp6. 常见问题排查6.1 ClassNotFound异常可能原因依赖没有正确传递子模块编译顺序错误解决方案检查父POM的dependencyManagement确保所有模块都已install到本地仓库使用mvn dependency:tree分析依赖6.2 配置文件加载失败典型表现生产环境配置未生效资源文件找不到解决方法确认资源过滤已开启检查src/main/resources目录结构使用绝对路径加载资源getClass().getResourceAsStream(/config.properties);6.3 端口冲突问题处理方案检查服务器端口占用netstat -tulnp | grep 8080修改Tomcat端口conf/server.xmlConnector port8081 protocolHTTP/1.1/7. 性能优化建议7.1 构建速度优化并行构建mvn -T 4 clean package跳过测试mvn package -DskipTests只构建指定模块mvn -pl module-web -am package7.2 部署包瘦身排除不需要的依赖dependency groupIdcom.example/groupId artifactIdunused-lib/artifactId scopeprovided/scope /dependency使用Maven shade插件plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version3.2.4/version executions execution phasepackage/phase goals goalshade/goal /goals /execution /executions /plugin7.3 部署流程自动化建议方案使用Jenkins CI/CD流水线编写Shell脚本自动部署#!/bin/bash mvn clean package -Pprod scp target/*.war userserver:/opt/tomcat/webapps/ ssh userserver systemctl restart tomcat经过多次实践验证这套方案能稳定支持包含10模块的大型项目部署。关键是要理解Maven的多模块构建机制并在云服务器上建立与开发环境一致的运行环境。
阅读完成 · 觉得有帮助?