{"id":23087629,"url":"https://github.com/exp-codes/release-project-plugin","last_synced_at":"2025-04-03T16:45:41.444Z","repository":{"id":49963600,"uuid":"148517007","full_name":"EXP-Codes/release-project-plugin","owner":"EXP-Codes","description":"（非 Spring）Maven 项目一键发布插件","archived":false,"fork":false,"pushed_at":"2023-01-16T18:04:26.000Z","size":3729,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-02-09T05:27:39.555Z","etag":null,"topics":["java","maven","mvn","plugin","programming"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EXP-Codes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":["https://lyy289065406.github.io/sponsor/"]}},"created_at":"2018-09-12T17:30:25.000Z","updated_at":"2023-05-03T14:56:30.000Z","dependencies_parsed_at":"2023-02-10T05:15:37.154Z","dependency_job_id":null,"html_url":"https://github.com/EXP-Codes/release-project-plugin","commit_stats":null,"previous_names":["lyy289065406/release-project-plugin"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EXP-Codes%2Frelease-project-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EXP-Codes%2Frelease-project-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EXP-Codes%2Frelease-project-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EXP-Codes%2Frelease-project-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EXP-Codes","download_url":"https://codeload.github.com/EXP-Codes/release-project-plugin/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247043235,"owners_count":20874084,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","maven","mvn","plugin","programming"],"created_at":"2024-12-16T19:59:22.297Z","updated_at":"2025-04-03T16:45:41.426Z","avatar_url":"https://github.com/EXP-Codes.png","language":"Java","readme":"# release-project-plugin\r\n\u003e （非 Spring）Maven 项目一键发布插件\r\n\r\n------\r\n\r\n## 运行环境\r\n\r\n![](https://img.shields.io/badge/Maven-3.2.5%2B-brightgreen.svg)  ![](https://img.shields.io/badge/JDK-1.8%2B-brightgreen.svg)\r\n\r\n\r\n## 软件介绍\r\n\r\n- 一键快速发布一个可运行于生成环境的应用程序\r\n- 支持混淆打包以避免被反编译\r\n- 自动集成依赖构件、配置文件、部署文档、数据库脚本、版本说明、运行脚本等\r\n\r\n\r\n\u003e **注**：\r\n\u003cbr/\u003e　　本插件的主要作用其实就是**生成运行脚本**与**组织应用程序的目录结构**\r\n\u003cbr/\u003e　　混淆打包是依赖第三方 `proguard-maven-plugin` 插件实现的\r\n\u003cbr/\u003e　　应用程序的部署文件复制（如配置文件、部署文档、数据库脚本等）是依赖第三方 `maven-antrun-plugin` 插件实现的\r\n\u003cbr/\u003e　　版本说明是依赖 [`经验构件库 exp-libs-refactor`](https://github.com/lyy289065406/exp-libs-refactor) 实现的\r\n\r\n\r\n## 使用说明\r\n\r\n在指定项目的 `pom.xml` 中添加本插件配置后，**通过 `Maven install` 指令触发**。\r\n\r\n本插件的完整参数配置如下：\r\n\r\n```xml\r\n\u003cplugin\u003e\r\n    \u003cgroupId\u003ecom.exp-blog\u003c/groupId\u003e\r\n    \u003cartifactId\u003erelease-project-plugin\u003c/artifactId\u003e\r\n    \u003cversion\u003e${rpp.version}\u003c/version\u003e\t\u003c!-- 根据实际情况设置版本号 --\u003e\r\n    \u003cexecutions\u003e\r\n        \u003cexecution\u003e\r\n            \u003cid\u003erpp\u003c/id\u003e\r\n            \u003cphase\u003einstall\u003c/phase\u003e\r\n            \u003cgoals\u003e\r\n                \u003cgoal\u003einstall\u003c/goal\u003e\r\n            \u003c/goals\u003e\r\n            \u003cconfiguration\u003e\r\n                \u003cdependMode\u003eSELF\u003c/dependMode\u003e\r\n                \u003cjarLibDir\u003e./libs\u003c/jarLibDir\u003e\r\n                \u003ccmpPathMode\u003eSTAND\u003c/cmpPathMode\u003e\r\n                \u003cmavenRepository\u003eD:\\mavenRepository\u003c/mavenRepository\u003e\r\n                \u003cversionClass\u003efoo.bar.prj.Version\u003c/versionClass\u003e\r\n                \u003cmainClass\u003efoo.bar.prj.Main\u003c/mainClass\u003e\r\n                \u003cmainArgs\u003e\u003c/mainArgs\u003e\r\n                \u003ccharset\u003eUTF-8\u003c/charset\u003e\r\n                \u003cjdkPath\u003ejava\u003c/jdkPath\u003e\r\n                \u003cxms\u003e32m\u003c/xms\u003e\r\n                \u003cxmx\u003e64m\u003c/xmx\u003e\r\n                \u003cjdkArgs\u003e\u003c/jdkArgs\u003e\r\n                \u003cthreadSuffix\u003e\u003c/threadSuffix\u003e\r\n                \u003cnoPrjVer\u003etrue\u003c/noPrjVer\u003e\r\n                \u003cnoVerJarRegex\u003eexp-?libs-.*\u003c/noVerJarRegex\u003e\r\n                \u003cproguard\u003efalse\u003c/proguard\u003e\r\n            \u003c/configuration\u003e\r\n        \u003c/execution\u003e\r\n    \u003c/executions\u003e\r\n\u003c/plugin\u003e\r\n```\r\n\r\n其中各个参数说明如下：\r\n\r\n| 参数 | 必填 | 取值范围/约束 | 作用 |\r\n|:----:|:--------:|:--------|:----|\r\n| dependMode | 否 | ○ SELF\u003cbr/\u003e○ MAVEN | 影响所发布项目的运行脚本中`-cp *.jar`所依赖构件的指向位置：\u003cbr/\u003e\u003cbr/\u003e**SELF（默认）** ： \u003cbr/\u003e把所有依赖构件都复制到`./lib`目录下，运行脚本直接指向`./lib`。\u003cbr/\u003e此方式所发布应用的体积较大，但是可放在任何环境中运行。\u003cbr/\u003e\u003cbr/\u003e**MAVEN** ： \u003cbr/\u003e对于通过pom依赖的构件，在运行脚本直接指向本地Maven仓库；\u003cbr/\u003e对于不是通过pom依赖的构件，则复制到`./lib`目录后再进行指向。\u003cbr/\u003e此方式所发布应用的体积较小，但是运行环境中需存在Maven仓库。 |\r\n| jarLibDir | 否 | ./libs（默认） | 复制依赖构件到所发布应用下的目录位置\u003cbr/\u003e（影响`dependMode`的复制目录，**一般无需修改**） |\r\n| cmpPathMode | 否 | ○ LEAST\u003cbr/\u003e○ STAND\u003cbr/\u003e○ MOST | 运行脚本中指向依赖构件路径的压缩模式。\u003cbr/\u003e若运行脚本中`-cp *.jar`的依赖构件都是绝对路径，则会导致命令\u003cbr/\u003e过长不易维护，因此本插件会提取相同前缀的路径并创建对应的路\u003cbr/\u003e径前缀变量。此配置项的作用仅仅是影响这些变量的多寡而已，无\u003cbr/\u003e需过于关注。\u003cbr/\u003e\u003cbr/\u003e**默认为STAND，即标准模式，一般无需修改** |\r\n| mavenRepository | 是 | 绝对路径 | 本地Maven仓库位置，必须与本地部署的 `apache-maven` 的配置文\u003cbr/\u003e件 `settings.xml` 中的配置项 `\u003clocalRepository\u003e` 取值一致。\u003cbr/\u003e\u003cbr/\u003ewin环境推荐值为`D:\\mavenRepository`\u003cbr/\u003eunix环境推荐值为`~/mavenRepository` |\r\n| versionClass | 是 | version 类路径 | 运行脚本打印应用版本信息的入口类路径。\u003cbr/\u003e版本信息的配置依赖 [`构件经验库 exp-libs`](https://github.com/lyy289065406/exp-libs) 实现，详见[`这里`](https://github.com/lyy289065406/exp-libs/tree/master/exp-libs/src/main/java/exp/libs/warp/ver) |\r\n| mainClass | 是 | main 类路径 | 运行脚本启动应用程序的入口类路径 |\r\n| mainArgs | 否 | \u0026nbsp; | 启动应用程序的main类参数表，按需填写即可 |\r\n| charset | 否 | \u0026nbsp; | 项目编码，**默认为UTF-8** |\r\n| jdkPath | 否 | java（默认） | JRE路径，亦即 `%JAVA_HOME%/bin/java` 路径。\u003cbr/\u003e由于配置了系统环境变量，一般无需修改。\u003cbr/\u003e但若生产环境下存在多个JRE版本，则可按需修改。 |\r\n| xms | 否 | 32m（默认） | 应用运行时的最小堆内存，按需填写即可 |\r\n| xmx | 否 | 64m（默认） | 应用运行时的最大堆内存，按需填写即可 |\r\n| jdkArgs | 否 | \u0026nbsp; | JVM参数表，按需填写即可 |\r\n| threadSuffix | 否 | \u0026nbsp; | 进程后缀名。\u003cbr/\u003e所发布的应用默认用项目名作为进程名，若指定了后缀则会自动\u003cbr/\u003e附加到进程名末尾，一般用于同一生产环境下部署多套应用时以\u003cbr/\u003e作区分。（实际上在使用本插件发布应用后，也可通过直接修改\u003cbr/\u003e`.threadname`文件达到同样目的） |\r\n| noPrjVer | 否 | true（默认） | 所发布应用的自身jar文件是否去掉版本号。\u003cbr/\u003e默认值为true（即去掉版本号），以便升级时无需调整运行脚本 |\r\n| noVerJarRegex | 否 | \u0026nbsp; | 命中**正则表达式**的\\*.jar依赖构件去掉版本号。\u003cbr/\u003e建议配置版本迭代较快的依赖构件，以便升级时无需调整运行脚本 |\r\n| proguard | 否 | false（默认） | 是否启用混淆打包，可有效防止应用被反编译。\u003cbr/\u003e需配置`proguard-maven-plugin`插件支持，但是proguard插件配置\u003cbr/\u003e项过于复杂，推荐使用[`Maven项目规范骨架 mojo-archetype`](https://github.com/lyy289065406/mojo-archetype)创建项\u003cbr/\u003e目，即可自动生成混淆配置。 |\r\n\r\n\r\n## 其他参考配置\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cb\u003e混淆打包插件 proguard-maven-plugin 的配置示例\u003c/b\u003e\u003c/summary\u003e\r\n\u003cbr/\u003e\r\n\r\n```xml\r\n\u003c!-- 混淆打包插件 --\u003e\r\n\u003cplugin\u003e\r\n    \u003cgroupId\u003ecom.github.wvengen\u003c/groupId\u003e\r\n    \u003cartifactId\u003eproguard-maven-plugin\u003c/artifactId\u003e\r\n    \u003cversion\u003e2.0.7\u003c/version\u003e\r\n    \u003cexecutions\u003e\r\n        \u003cexecution\u003e\r\n            \u003cphase\u003epackage\u003c/phase\u003e    \u003c!-- 触发混淆打包的maven周期 --\u003e\r\n            \u003cgoals\u003e\r\n                \u003cgoal\u003eproguard\u003c/goal\u003e\r\n            \u003c/goals\u003e\r\n        \u003c/execution\u003e\r\n    \u003c/executions\u003e\r\n    \u003cconfiguration\u003e\r\n        \u003c!-- attach 的作用是在 install/deploy 时, 将生成的 pg 文件也安装/部署 --\u003e\r\n        \u003cattach\u003efalse\u003c/attach\u003e\r\n        \u003cattachArtifactClassifier\u003epg\u003c/attachArtifactClassifier\u003e\r\n        \r\n        \u003c!-- 指定混淆处理所需要的库文件 --\u003e\r\n        \u003clibs\u003e\r\n            \u003clib\u003e${java.home}/lib/rt.jar\u003c/lib\u003e \u003c!-- 运行时库rt是必须的 --\u003e\r\n        \u003c/libs\u003e\r\n        \r\n        \u003c!-- 指定要做混淆处理的 应用程序jar、war、ear，或目录 --\u003e\r\n        \u003cinjar\u003e\u003c/injar\u003e\r\n        \r\n        \u003c!-- 指定混淆处理完后要输出的jar、war、ear，及其目录名称 --\u003e\r\n        \u003coutjar\u003e${project.build.finalName}-pg\u003c/outjar\u003e\r\n        \r\n        \u003c!-- 混淆规则: 详细配置方式参考 ProGuard 官方文档 --\u003e\r\n        \u003coptions\u003e\r\n            \u003coption\u003e-ignorewarnings\u003c/option\u003e         \u003c!-- 忽略混淆警告 --\u003e\r\n            \u003c!-- option\u003e-dontobfuscate\u003c/option --\u003e    \u003c!-- 不混淆输入的类文件 --\u003e\r\n            \u003coption\u003e-dontshrink\u003c/option\u003e               \u003c!-- 不压缩输入的类文件 --\u003e\r\n            \u003coption\u003e-dontoptimize\u003c/option\u003e             \u003c!-- 不做代码优化 --\u003e\r\n            \u003coption\u003e-dontskipnonpubliclibraryclasses\u003c/option\u003e        \u003c!-- 不跳过私有依赖的类库 --\u003e\r\n            \u003coption\u003e-dontskipnonpubliclibraryclassmembers\u003c/option\u003e    \u003c!-- 不跳过私有依赖的类库成员 --\u003e\r\n            \u003c!-- option\u003e-overloadaggressively\u003c/option --\u003e                \u003c!-- 混淆时应用侵入式重载 --\u003e\r\n            \u003c!-- option\u003e-obfuscationdictionary {filename}\u003c/option --\u003e    \u003c!-- 使用给定文件中的关键字作为要混淆方法的名称 --\u003e\r\n            \u003c!-- option\u003e-applymapping {filename}\u003c/option --\u003e            \u003c!-- 重用映射增加混淆 --\u003e\r\n            \u003c!-- option\u003e-useuniqueclassmembernames\u003c/option --\u003e            \u003c!-- 确定统一的混淆类的成员名称来增加混淆 --\u003e\r\n            \u003c!-- option\u003e-dontusemixedcaseclassnames\u003c/option --\u003e            \u003c!-- 混淆时不会产生形形色色的类名 --\u003e\r\n            \u003c!-- option\u003e-renamesourcefileattribute {string}\u003c/option --\u003e    \u003c!-- 设置源文件中给定的字符串常量 --\u003e\r\n            \u003c!-- option\u003e-flattenpackagehierarchy {package_name}\u003c/option --\u003e    \u003c!-- 重新包装所有重命名的包并放在给定的单一包中 --\u003e\r\n            \u003c!-- option\u003e-repackageclass {package_name}\u003c/option --\u003e            \u003c!-- 重新包装所有重命名的类文件中放在给定的单一包中 --\u003e\r\n\r\n\r\n            \u003c!--平行包结构（重构包层次），所有混淆的代码放在 pg 包下 --\u003e\r\n            \u003c!-- 最好不要随便放, 若有多个项目混淆，不同jar的混淆类可能重名 --\u003e\r\n            \u003c!-- 建议为{project.root.package}.pg （不存在此变量，此处仅为了说明） --\u003e\r\n            \u003coption\u003e-repackageclasses exp.libs.pojo.pg\u003c/option\u003e\r\n\r\n            \u003c!-- 保留[源码] --\u003e\u003c!-- 按实际项目切换 --\u003e\r\n            \u003c!-- option\u003e-keepattributes SourceFile\u003c/option --\u003e\r\n            \r\n            \u003c!-- 保留[行号] --\u003e\u003c!-- 按实际项目切换 --\u003e\r\n            \u003coption\u003e-keepattributes LineNumberTable\u003c/option\u003e\r\n            \r\n            \u003c!-- 保留[注释] --\u003e\u003c!-- 按实际项目切换 --\u003e\r\n            \u003c!-- option\u003e-keepattributes *Annotation*\u003c/option --\u003e\r\n            \r\n            \u003c!-- 保留[注解] --\u003e\u003c!-- 按实际项目切换 --\u003e\r\n            \u003c!-- option\u003e-keepattributes Signature\u003c/option --\u003e\r\n            \r\n            \u003c!-- 保持[入口类]不变 --\u003e\r\n            \u003c!-- 按实际项目修正 --\u003e\r\n            \u003coption\u003e-keep class \r\n                exp.libs.pojo.Version,\r\n                exp.libs.pojo.Main\r\n            \u003c/option\u003e\r\n            \r\n            \u003c!-- 保持[Bean类]不变（若框架对 Bean中的内容做了反射处理，则必须保持不变） --\u003e\r\n            \u003c!-- 按实际项目修正 --\u003e\r\n            \u003coption\u003e-keep class exp.libs.pojo.bean.** { *;}\u003c/option\u003e\r\n            \r\n            \u003c!-- 保持[所有入口方法]不变 --\u003e\r\n            \u003c!-- 固定不变 --\u003e\r\n            \u003coption\u003e-keepclasseswithmembers public class * { \r\n                        public static void main(java.lang.String[]);\r\n                    }\r\n            \u003c/option\u003e\r\n            \r\n            \u003c!-- 保持[对外API的类名和方法名]不变 --\u003e\r\n            \u003c!-- 按实际项目修正 --\u003e\r\n            \u003coption\u003e-keep class exp.libs.pojo.api.** { *;}\u003c/option\u003e\r\n            \r\n            \u003c!-- 保持[所有本地化方法]不变 --\u003e\r\n            \u003c!-- 固定不变 --\u003e\r\n            \u003coption\u003e-keepclasseswithmembernames class * {\r\n                        native \u0026lt;methods\u0026gt;;\r\n                    }\r\n            \u003c/option\u003e\r\n            \r\n            \u003c!-- 保持[所有类成员变量]不变 --\u003e\r\n            \u003c!-- 按实际项目修正 --\u003e\r\n            \u003c!-- option\u003e-keepclassmembers class * {\r\n                        \u0026lt;fields\u0026gt;;\r\n                    }\r\n            \u003c/option --\u003e\r\n            \r\n            \u003c!-- 保持[所有枚举类必须的方法]不变 --\u003e\r\n            \u003c!-- 固定不变 --\u003e\r\n            \u003coption\u003e-keepclassmembers class * extends java.lang.Enum {\r\n                        public static **[] values();\r\n                        public static ** valueOf(java.lang.String);\r\n                    }\r\n            \u003c/option\u003e\r\n            \r\n            \u003c!-- 保持[所有序列化接口]不变（若项目中不使用序列化，也可注释） --\u003e\r\n            \u003c!-- 固定不变 --\u003e\r\n            \u003coption\u003e-keepclassmembers class * implements java.io.Serializable {\r\n                        static final long serialVersionUID;\r\n                        static final java.io.ObjectStreamField[] serialPersistentFields;\r\n                        private void writeObject(java.io.ObjectOutputStream);\r\n                        private void readObject(java.io.ObjectInputStream);\r\n                        java.lang.Object writeReplace();\r\n                        java.lang.Object readResolve();\r\n                    }\r\n            \u003c/option\u003e\r\n        \u003c/options\u003e\r\n    \u003c/configuration\u003e\r\n\u003c/plugin\u003e\r\n```\r\n\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cb\u003e部署文件复制插件 maven-antrun-plugin 的配置示例\u003c/b\u003e\u003c/summary\u003e\r\n\u003cbr/\u003e\r\n\r\n```xml\r\n\u003c!-- Ant插件：项目部署文件复制 --\u003e\r\n\u003cplugin\u003e\r\n    \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\r\n    \u003cartifactId\u003emaven-antrun-plugin\u003c/artifactId\u003e\r\n    \u003cversion\u003e1.7\u003c/version\u003e\r\n    \u003cexecutions\u003e\r\n        \u003cexecution\u003e\r\n            \u003cid\u003eant-build\u003c/id\u003e\r\n            \u003cphase\u003einstall\u003c/phase\u003e\r\n            \u003cgoals\u003e\r\n                \u003cgoal\u003erun\u003c/goal\u003e\r\n            \u003c/goals\u003e\r\n            \u003cconfiguration\u003e\r\n                \u003ctarget\u003e\r\n                    \u003cecho\u003e拷贝数据库脚本\u003c/echo\u003e\r\n                    \u003ccopy todir=\"${release.dir}/script\"\u003e\r\n                        \u003cfileset dir=\"script\"\u003e\u003c/fileset\u003e\r\n                    \u003c/copy\u003e\r\n                    \u003cecho\u003e拷贝项目配置文件\u003c/echo\u003e\r\n                    \u003ccopy todir=\"${release.dir}/conf\"\u003e\r\n                        \u003cfileset dir=\"conf\" /\u003e\r\n                    \u003c/copy\u003e\r\n                    \u003cecho\u003e拷贝文档\u003c/echo\u003e\r\n                    \u003ccopy todir=\"${release.dir}/doc/04_维护文档\"\u003e\r\n                        \u003cfileset dir=\"doc/04_维护文档\" /\u003e\r\n                    \u003c/copy\u003e\r\n                    \u003ccopy todir=\"${release.dir}/doc/06_使用文档\"\u003e\r\n                        \u003cfileset dir=\"doc/06_使用文档\" /\u003e\r\n                    \u003c/copy\u003e\r\n                    \u003ccopy todir=\"${release.dir}/doc/07_演示文档\"\u003e\r\n                        \u003cfileset dir=\"doc/07_演示文档\" /\u003e\r\n                    \u003c/copy\u003e\r\n                \u003c/target\u003e\r\n            \u003c/configuration\u003e\r\n        \u003c/execution\u003e\r\n    \u003c/executions\u003e\r\n\u003c/plugin\u003e\r\n```\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n## 运行效果\r\n\r\n详见[这里](./Demo.md)\r\n","funding_links":["https://lyy289065406.github.io/sponsor/"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexp-codes%2Frelease-project-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexp-codes%2Frelease-project-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexp-codes%2Frelease-project-plugin/lists"}