本项目(excel2mysql)Java 侧的能力选型纪律:需要实现解析、编码、压缩、协议、格式转换等非平凡能力时,先评估能否用 pom 里的第三方 jar 解决,禁止默认万事自研;引入依赖必须过稳定版、仍在维护、Java 8、许可、离线胖 jar、体积、安全与可验证性七道闸。适用于准备手写切句/解析/编解码之前,或准备往 pom 加依赖、升级依赖时。
Instal·la
npx skillscat add levfan/excel2mysql/java-dependency-selection Instal·la des del registre de SkillsCat.
Java 侧依赖选型:先选型,再动手
核心规则
默认先找现成的。 引入一个维护良好的第三方 jar 是正常工程手段,不是失败;
手写解析器、编解码器、协议实现之前,必须先证明“没有候选过闸”。
但依赖也不能随手加:本项目交付形态特殊,候选必须同时过下面七道闸。
依赖来源:只走国内阿里云镜像
不查、不连国外仓库。 依赖、插件、版本元数据一律走阿里云 Maven 镜像:
推荐在本机
~/.m2/settings.xml配全局镜像(对 Maven 透明,任何模块都生效):<settings> <mirrors> <mirror> <id>aliyun</id> <name>Aliyun Public</name> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> </settings>项目内
java/pom.xml已声明aliyun-public的<repositories>与<pluginRepositories>;本机没有 settings.xml 时也走国内,不回落国外。
需要 spring / google 等专用仓时,加https://maven.aliyun.com/repository/spring、.../google,不要直接写国外地址。版本与发布时间只查阿里云镜像的元数据:
https://maven.aliyun.com/repository/public/<groupId路径>/<artifactId>/maven-metadata.xml,
或阿里云仓库的目录页;不访问 Maven Central、GitHub Releases、JitPack 等国外站点。国内镜像查不到某个版本/构件,本身就是淘汰信号(目标机离线、镜像不全的依赖不进交付)。
CVE 与安全公告优先查阿里云漏洞库/镜像页;国内源查不到就写“待核实”,
禁止把“没查到”写成“没有漏洞”,也禁止编造发布日期。
决策顺序(每一步都要留下结论)
先盘点已有能力:JDK 8 标准库、已打包的依赖、Python 侧对应实现是否构成
“必须逐用例对齐”的规范。已有库能覆盖的,不新增第二个同类库。列候选,至少两个(含“自研”这一项),逐个填表:
列 填什么 坐标与版本 groupId:artifactId:version,只写具体版本最近稳定版时间 阿里云镜像 maven-metadata.xml里的lastUpdated/ 版本目录,写年月Java 8 支持到哪个版本;class major 必须 ≤ 52 许可证 Apache-2.0 / MIT / BSD / EPL 可用 传递依赖与体积 mvn dependency:tree,新增 jar 总增量离线胖 jar 有无 native、运行时下载、 META-INF/services冲突可验证性 能否用现有金标准/真实语料逐用例比对 淘汰理由/选定理由 一句话 过闸(硬性条件,缺一即淘汰):
- 稳定版:只认 GA/stable;禁止 alpha、beta、RC、M1、SNAPSHOT、
LATEST、RELEASE、版本区间。 - 仍在维护:最近 18 个月内有稳定版发布;安全相关库收紧到 12 个月。
“多年没更新”默认淘汰;只有“功能已完成、无未修 CVE、源码可接手、使用者面大”
三条同时成立才可例外,并把例外理由写进 pom 注释。 - Java 8 兼容:必须能在
C:\Program Files\Java\jdk1.8.0_202下编译运行;
“支持 Java 8 的最后一个版本”要写清,别让下次升级时误升。 - 许可证:单 jar 分发属于静态合并,禁止 GPL / AGPL / LGPL 及许可不明;
只用 Apache-2.0、MIT、BSD、EPL 这类可再分发许可。 - 离线与形态:不得有 native
.dll/.so、不得运行时联网下载、不得写注册表、
不得起守护线程;所有传递依赖必须能 shade 进一个 jar,并在 Win7 + 绿色 JRE 8 上可跑。 - 体积:新增依赖连同传递依赖的 jar 增量超过约 2 MB 要单独写理由;
用不到的可选依赖(典型如 protobuf 之于经典 JDBC)显式<exclusion>。 - 安全与行为:查一遍 OSV / GitHub Advisory / CVE;无遥测、无后台外联;
行为必须能被现有用例或真实语料钉住。
- 稳定版:只认 GA/stable;禁止 alpha、beta、RC、M1、SNAPSHOT、
双栈对齐条款:Python 与 Java 输出要逐项一致的功能,库只能当“参考实现”
或“探针”;进产品路径前必须包一层,并在 Python 侧金标准语料上全绿。
库的输出与本项目既定语义冲突时,改库的用法或换库,不许悄悄改 Python 语义去迁就库。先做探针:在 verify 模块或临时分支写最小可运行用例(半天到一天),
喂真实语料(用户现场文件、边界样例、异常样例),与基线比输出。
探针不过就换候选或自研,不把“README 说支持”当验证。落地:版本属性与版本号进父 pom
dependencyManagement;app pom 只引用不带版本;
pom 注释写“为什么选它、淘汰了谁、体积/许可/Java 8 的结论”。mvn dependency:tree输出与探针结论进提交说明。验收:跑
java\构建验证.bat十步闸门、java\界面双端对撞.bat、两栈用例;
涉及执行/导入语义的,再跑真库 G 组。任何一步红都不算落地。
什么时候可以自研
必须至少满足一条,并把理由写进提交说明:
- 所有候选都没过上面的闸;
- 能力小且边界清楚(例如纯词法状态机、十分钟能穷举的规则),并且双栈要求逐字节一致;
- 引进来会破坏交付形态(native、Java 8 不兼容、许可不可分发、体积失控);
- 库的行为不可观测/不可控,现有金标准覆盖不了它。
“自己写更放心”“加依赖显得不专业”“先写起来再说”都不算理由。
反模式(出现即停)
| 说法 | 现实 |
|---|---|
| “这个只能自己写” | 先列候选再下结论;没查过 Maven Central 不算查过 |
| “用最新版总没错” | 最新版可能是 RC;只认稳定版并钉死版本 |
| “三年没更新也没事” | 默认淘汰;例外要三条证据 |
| “SNAPSHOT 和正式版一样” | 不可复现构建,禁止 |
| “License 以后再说” | 打包前必须清楚;copyleft 不能进单 jar |
| “有 CVE 但没用到那个类” | 需要可达性证据与记录,不能拍脑袋 |
| “胖 jar 大一点无所谓” | 绿色 JRE 交付对体积敏感,超预算要写理由 |
| “库说它对,Python 那边改一下” | 双栈语义由金标准定,不由库定 |
本项目锚点
- JDK 8:
C:\Program Files\Java\jdk1.8.0_202;class 主版本闸门在java\构建验证.bat第 3 步。 - 交付:
maven-shade-plugin打单 jar,随包 JRE 8u202,目标机离线、可能 Win7。 - 依赖版本统一定义在
java\pom.xml的<properties>与<dependencyManagement>;
模块 pom 不写版本。 - 仓库同样写在
java\pom.xml(aliyun-public的 repositories / pluginRepositories),
本机~/.m2/settings.xml配了同一镜像的<mirrorOf>*</mirrorOf>;两处都不指向国外。 - 现有依赖示例:
cn.idev.excel:fastexcel:1.3.0、com.mysql:mysql-connector-j:8.0.33、com.github.stuxuhai:jpinyin:1.1.8、org.slf4j:slf4j-nop:1.7.36(须与 slf4j-api 同版本)。