在 Windows 环境下使用 JEP(Java Embedded Python)时,很多旅人会被满屏的红字击退:要么 pip install jep 编译报错,要么 Java 启动时报 init_fs_encoding 崩溃、UnsatisfiedLinkError。
网上的教程往往会让你在 Java 代码里疯狂修改 sys.path,或者配置一大堆复杂的 JVM 参数。但经历过无数次试错后,我发现剥去所有复杂的表象,真正的解决办法只有极其干净利落的五步:
核心总结
- 使用 Visual Studio Installer 安装「Windows 10 SDK」和「使用 C++ 的桌面开发」。
- 创建一个干净的 Python 3.8 venv(虚拟环境)。
- 激活虚拟环境,通过 pip 安装 jep。
- 在 Maven 的
pom.xml中引入 jep 依赖。 - 在操作系统中指定
PYTHONHOME和PYTHONPATH环境变量。
第一步:准备 C++ 编译环境(防 pip install 报错)
JEP 在 Windows 下安装时需要编译 C 扩展。如果你直接 pip install,大概率会因为缺少编译器而光速白给。
- 下载并打开 Visual Studio Installer。
- 勾选 「使用 C++ 的桌面开发」(Desktop development with C++)。
- 在右侧的安装细节中,确保勾选了 「Windows 10 SDK」(这是为了提供
rc.exe等核心构建工具)。 - 安装完成后,重启电脑。
第二步:创建一个 Python 3.8 的 venv
为了不被系统中各种历史 Python 版本污染,我们需要给 JEP 准备一个独立的小天地。
在你的项目目录下,打开命令行执行:
# 使用你电脑上干净的 Python 3.8 创建虚拟环境
"C:\Program Files\python\python.exe" -m venv venv38
第三步:安装 Python 侧的 jep
有了第一步的编译器护航,现在你可以安心施放魔法了:
# 激活虚拟环境
venv38\Scripts\activate
# 更新 pip 并安装 jep
python -m pip install --upgrade pip
pip install jep
(注:如果后续你需要用到 requests、beautifulsoup4 等爬虫库,也一并在这里安装即可。)
第四步:安装 Java 侧的 jep (Maven 依赖)
Python 准备好了,Java 这边也得接应。在你的 Spring Boot/Java 项目的 pom.xml 中,加入与你通过 pip 安装的 jep 版本一致的依赖(例如 4.2.2):
<dependency>
<groupId>black.ninia</groupId>
<artifactId>jep</artifactId>
<version>4.2.2</version> <!-- 请确保与 pip install jep 的版本一致 -->
</dependency>
第五步:在操作系统中指定环境变量
这是破除所有初始化崩溃(如 Fatal Python error)的终极解法。我们需要亲手为嵌入的 CPython 指路。
在启动你的 Java 程序(或执行 Maven 运行命令)之前,必须在系统中注入这两个环境变量:
- PYTHONHOME:指向你的全局 Python 安装目录(让嵌入的 Python 能找到底层的标准库
encodings等)。 - PYTHONPATH:指向你的虚拟环境包目录(让 Python 醒来后能第一时间找到
jep模块和你自己写的 Python 脚本)。
命令行配置示例(CMD):
set PYTHONHOME=C:\Program Files\python
set PYTHONPATH=D:\你的项目路径\SpiderModule\venv38\Lib\site-packages
IntelliJ IDEA 配置示例:
在 Run/Debug Configurations -> Environment variables 中填入:
PYTHONHOME=C:\Program Files\python;PYTHONPATH=D:\你的项目路径\SpiderModule\venv38\Lib\site-packages
见证奇迹的时刻
完成以上五步后,风的轨道就已经彻底理顺。你在 Java 里只需要极其简短的代码,就能唤醒 Python:
import jep.SharedInterpreter;
import jep.MainInterpreter;
public class JepConfig {
public static void main(String[] args) {
// 1. 强行指定 JEP 的 DLL 绝对路径,防止 Windows 下路径迷失
// 路径通常在你的 venv 目录下的 Lib/site-packages/jep/ 里
String jepDllPath = "D:/你的项目路径/SpiderModule/venv38/Lib/site-packages/jep/jep.dll";
MainInterpreter.setJepLibraryPath(jepDllPath);
// 2. 拥抱 Python!
try (SharedInterpreter interp = new SharedInterpreter()) {
interp.exec("import sys");
interp.exec("message = 'Hello from Python! 版本: ' + sys.version");
// 将 Python 的变量平滑地取回 Java
String pythonMessage = interp.getValue("message", String.class);
System.out.println("Java 收到了传书: " + pythonMessage);
// 注意:Python 的数字在传回 Java 时,默认是 java.lang.Long 类型
interp.exec("x = 1 + 2");
int x = ((Number) interp.getValue("x")).intValue();
System.out.println("Java 计算结果: " + x);
} catch (Exception e) {
e.printStackTrace();
}
}
}


5384

被折叠的 条评论
为什么被折叠?



