4、开发环境搭建:Java/Python环境配置,Maven/Gradle/Pip依赖管理
环境配置这件事,说难不难,说简单也真容易踩坑。我带过不少新人,十有八九第一周都卡在环境上。不是 JDK 版本不对,就是 Maven 拉不到依赖。
我个人习惯是「先跑通一个最小 demo,再去理解细节」。你想想看,要是连 Hello World 都跑不起来,后面加密算法、字段过滤这些都无从谈起。所以这一章,我就带你把 Java 和 Python 的开发环境彻底搞定。
4.1 Java 环境配置
4.1.1 JDK 版本选择
我们这个字段级加密 SDK 底层依赖 Java 的 javax.crypto 包,对 JDK 版本没有特别苛刻的要求。JDK 8 往上都行。但我建议你至少用 JDK 11。
为什么?JDK 8 虽然还能跑,但很多新工具链(比如最新的 Maven 和 Gradle 插件)已经逐步放弃对 JDK 8 的支持了。我曾经在一个老项目里强制用 JDK 8,结果某个加密库的 Security.getProviders() 行为在 JDK 8 和 JDK 11 上有细微差异,排查了两天才发现是 Provider 顺序的问题。所以,能用新就不用旧。
| JDK 版本 | 支持情况 | 我的建议 |
|---|---|---|
| JDK 8 | 可用,但部分新插件不支持 | 仅用于维护老项目 |
| JDK 11 (LTS) | 主流,SDK 完整测试通过 | 推荐首选 |
| JDK 17+ | 完全兼容,性能略有提升 | 可选,需注意某些反射 API 限制 |
/opt/java 或 C:\Java 下按版本建目录,比如 jdk-11.0.21,这样切换版本时改 JAVA_HOME 就行,不用重新安装。
4.1.2 环境变量配置
这一步很简单,但最容易写错。说白了就是三个变量:
JAVA_HOME– 指向 JDK 根目录PATH– 追加%JAVA_HOME%\bin(Windows)或$JAVA_HOME/bin(Linux/macOS)CLASSPATH– 现代开发一般不需要手动设了,交给 Maven/Gradle 就好。
配置完后,打开终端运行 java -version 和 javac -version,两个命令都正常输出版本号才算成功。我见过有人只配了 java 没配 javac,结果编译报错还以为是 JDK 没装好。
4.2 Python 环境配置
Python 这边水更深一点——版本、虚拟环境、pip 源。我建议你统一用 Python 3.10 或 3.11,3.12 还太新,部分加密库(比如 pycryptodome)的 arm64 wheels 还没完全覆盖。
4.2.1 安装 Python
Windows 用户记住勾选「Add Python to PATH」。macOS 用户建议通过 brew install python@3.11 安装,系统自带的 Python 2 不要碰。Linux 用户用包管理器就好,但注意有些发行版(比如 Ubuntu)默认装的 python3 不带 pip,需要手动装 python3-pip。
4.2.2 虚拟环境工具
我强烈推荐 pyenv + virtualenv 的组合。pyenv 负责管理 Python 版本,virtualenv 负责隔离项目依赖。如果你用 PyCharm,它内置的 virtualenv 也很好用。不过我个人更喜欢 conda——尤其是做数据相关的项目时,conda 管理底层 C 库依赖更方便,但单纯做 SDK 开发用 venv 就够了。
# 创建虚拟环境
python3 -m venv venv
# 激活(Linux/macOS)
source venv/bin/activate
# 激活(Windows PowerShell)
.\venv\Scripts\Activate.ps1
# 退出
deactivate
venv/ 目录提交到 Git 仓库,结果换个 macOS 就炸了。记得在 .gitignore 里加一行 venv/。
4.3 依赖管理工具对比与配置
Java 生态里 Maven 和 Gradle 两分天下,Python 这边基本是 pip 一统江湖。但三者背后的理念其实相通:声明依赖 → 解析冲突 → 下载到本地仓库 → 打包时引入。
| 特性 | Maven | Gradle | Pip |
|---|---|---|---|
| 配置文件 | pom.xml | build.gradle / .kts | requirements.txt |
| 依赖来源 | Maven Central / 私有仓库 | Maven Central / Ivy / 自定义 | PyPI / 私有索引 |
| 依赖锁定 | maven-dependency-plugin 或 versions:display-dependency-updates | 天然支持 gradle.lockfile | pip freeze > requirements.txt |
| 构建速度 | 慢(串行执行阶段) | 快(增量编译 + 并行) | N/A(纯安装) |
| 学习曲线 | XML 有点啰嗦,但规则简单 | Groovy/Kotlin DSL 灵活,但坑多 | 极低,几行搞定 |
我的习惯是:团队项目用 Gradle,个人图书馆项目用 Maven。因为 Gradle 的增量编译在大型 SDK 里能省很多时间,但它的依赖缓存偶尔抽风,需要 --refresh-dependencies 强制刷新。
4.3.1 Maven 核心配置 (pom.xml)
我把加密 SDK 的 Maven 配置模板贴出来,你直接改 groupId 和 artifactId 就能用:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>field-level-encryption-sdk</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 加密核心库 -->
<dependency>
<groupId>com.github.javadev</groupId>
<artifactId>encrypt-core</artifactId>
<version>2.5.0</version>
</dependency>
<!-- 测试框架 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
settings.xml 里配置阿里云镜像:https://maven.aliyun.com/repository/public。这个操作能救你不少时间。
4.3.2 Gradle 核心配置 (build.gradle)
如果你选 Gradle,配置更简洁,还能用 Kotlin DSL 写类型安全配置:
plugins {
id 'java'
id 'java-library'
}
group 'com.example'
version '1.0.0'
repositories {
mavenCentral()
// 可以加私有仓库
// maven { url 'https://repo.mycompany.com/releases' }
}
dependencies {
implementation 'com.github.javadev:encrypt-core:2.5.0'
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}
test {
useJUnitPlatform()
}
Gradle 的 Wrapper(gradlew)是团队协作的命门——记得把它也提交到 Git 仓库,这样所有人用的 Gradle 版本统一,不会出现「我本地能跑,你那就报错」的尴尬。
4.3.3 Pip 依赖管理 (requirements.txt)
Python 的依赖管理我一般这么处理:
# 生产依赖
pycryptodome==3.19.1
pydantic==2.5.0
# 开发/测试依赖
pytest==7.4.3
pytest-cov==4.1.0
安装时执行 pip install -r requirements.txt。如果你需要区分环境,可以拆成 requirements-base.txt 和 requirements-dev.txt,然后用 -r 引用。
嗯,这里要注意一点:pip freeze 会把所有间接依赖也打进去,导致文件膨胀。我一般只用 pip freeze 生成锁定文件,但手动维护的 requirements.txt 只写直接依赖,版本号加个 >= 下限更灵活。
4.4 依赖管理流程图
搞了这么多配置,你可能有点晕。我画了一张图,把三种工具的核心流程统一出来——说白了都是两步:声明 → 解析并下载。
4.5 避坑指南(个人血泪史)
- JDK 多版本切换:我曾经把
JAVA_HOME配成了C:\Program Files\Java\jdk-11\bin,实际上应该配到根目录。结果java -version正常,但javac报错,因为javac不在bin的子目录里。正确的路径是C:\Program Files\Java\jdk-11,不带\bin。 - Gradle Daemon 内存溢出:如果你在低配笔记本上跑 Gradle,记得限制 Daemon 内存。在
~/.gradle/gradle.properties加一行org.gradle.jvmargs=-Xmx512m,否则构建时 IDE 可能直接卡死。 - pip 安装加密库失败:在 Windows 上装
pycryptodome如果缺 VC++ 编译环境,直接去 PyPI 下载对应 Python 版本的 wheel 文件手动安装。别浪费时间装 Visual Studio,一个 wheel 文件解决所有问题。 - Maven 私服认证:如果你公司有私有仓库,
settings.xml里不要明文写密码。用maven-encrypt-plugin加密,或者设环境变量MAVEN_PASSWORD在 CI/CD 流程里注入。
测试环境是否就绪:配置完所有环境后,我建议你先跑一个最小闭环测试——创建一个新的空项目,引入 SDK 核心依赖,写一个简单的加密/解密 main 方法,确保编译、测试、打包整个流程无报错。这一步能帮你筛掉 90% 的环境问题。
好啦,环境搭好了,依赖也拉下来了。下一步我们就可以写第一个字段级加密的 Demo 了。你先把本地环境跑通,回头遇到问题可以对照这张避坑清单排查。