要让maven打出bin/conf/lib/logs四级分层结构,必须自定义assembly descriptor xml文件,通过fileset映射源目录、dependencyset分离依赖,并绑定maven-assembly-plugin到package阶段。

要让 Maven 打出符合生产部署要求的目录结构(比如 bin/conf/lib/logs 四级分层),不能依赖 jar-with-dependencies 这类通用模板,必须从零编写 assembly descriptor XML 文件精确控制每个子目录的来源、路径和权限。
准备自定义装配描述文件
在项目根目录下新建 src/assembly/dist.xml,这是整个定制化打包的唯一控制入口。文件名可自定,但路径必须与 pom.xml 中引用位置一致。
文件开头必须声明完整命名空间:【-Pdist 或 -Dassembly.id=dist 显式触发,否则 Maven 会跳过此配置。
每个 <format></format> 行决定输出包类型,至少写一个:<format>tar.gz</format>(Linux 环境首选)或 <format>zip</format>(Windows 兼容)。多个格式可并列,Maven 会生成对应多个归档文件。
【${project.artifactId}-${project.version} 目录,这是运维安全底线。
用 fileSet 映射源目录到目标结构
这是控制目录骨架的核心机制。每个 <fileset></fileset> 块负责一组文件的“源→目标”映射,可重复定义多个。
第一步:把启动脚本放进 bin/ 目录
写法:<directory>src/main/scripts</directory><outputdirectory>bin/</outputdirectory><filemode>0755</filemode>。
注意 <outputdirectory></outputdirectory> 结尾必须带斜杠,否则 Maven 会当成文件名而非目录。
第二步:把配置模板放进 conf/ 目录<directory>src/main/config</directory><outputdirectory>conf/</outputdirectory>。
无需 <filemode></filemode>,因为配置文件在 Linux 下通常只需读权限(0644),Maven 默认即为此值。
第三步:把 Web 静态资源放进 webapp/ 目录<directory>src/main/webapp</directory><outputdirectory>webapp/</outputdirectory>。
若项目不含 webapp 目录,这行可直接删除,不报错也不影响其他 fileSet 生效。
白名单过滤只保留 .sh 文件:<includes><include>*.sh</include></includes>;黑名单排除开发用脚本:<excludes><exclude>dev.sh</exclude></excludes>。二者可共存,exclude 优先级高于 include。
用 dependencySet 分离运行时依赖
方法一:把所有 runtime 作用域的 JAR 放进 lib/<dependencyset><scope>runtime</scope><outputdirectory>lib/</outputdirectory></dependencyset>。
这是最常用方式,确保只有真正运行时需要的依赖被打包,编译期依赖(如 test、provided)被自动剔除。
方法二:排除当前项目主 JAR(避免 lib/ 下出现重复的 demo-1.0.jar)
加一行:<useprojectartifact>false</useprojectartifact>。
这一步容易漏掉,漏掉会导致最终包里 lib/ 和顶层各有一份主程序 JAR,启动脚本很可能加载错版本。
方法三:按 groupId 分组打到不同子目录(高级用法)
例如把所有 org.springframework 的依赖放进 lib/spring/:<outputdirectory>lib/spring/</outputdirectory><includes><include>org.springframework:*</include></includes>。
这种写法需配合 <dependencyset></dependencyset> 多次声明,每个块处理一类依赖。
绑定插件到 Maven 生命周期
打开 pom.xml,在 <build><plugins></plugins></build> 节点内添加 maven-assembly-plugin 配置块。
关键字段必须写全:<groupid>org.apache.maven.plugins</groupid><artifactid>maven-assembly-plugin</artifactid>,版本建议用 3.4.0 或更高(旧版对 fileMode 支持不完善)。
execution 块中 <phase>package</phase> 不可省略——只有绑定到 package 阶段,执行 mvn clean package 时才会触发打包;若绑到 install 阶段,本地调试时无法及时看到 dist 包生成结果。
【../ 开头。Maven 不会报路径错误,而是静默跳过装配,最终只生成默认的 jar 包。











