如何将Python脚本与Jar文件整合打包 实现Java应用运行时正常调用
Java Jar包与Python脚本整合打包方案
核心实现思路
直接将Python脚本作为资源文件打入Jar包内部,运行时动态从Jar中读取脚本内容生成临时文件执行,完全不需要依赖系统固定目录配置。
具体操作步骤
- 调整项目结构
将所有需要用到的Python脚本统一放在项目的src/main/resources/python目录下,打包时这类资源文件会被自动打入Jar包内部,SpringBoot项目会存放在BOOT-INF/classes/python路径下,普通Jar项目会存放在根目录的python路径下。 - 运行时读取资源生成临时脚本
应用运行时通过类加载器读取Jar内的Python脚本资源,写入系统临时目录生成可执行的临时Python文件,可设置JVM退出时自动删除临时文件,无需人工清理。参考代码如下:import java.io.InputStream; import java.io.File; import java.nio.file.Files; import java.nio.file.StandardCopyOption; // 读取Jar包内的Python脚本资源 InputStream scriptInputStream = getClass().getResourceAsStream("/python/your_target_script.py"); // 生成后缀为.py的临时文件 File tempPythonScript = Files.createTempFile("runtime_python_", ".py").toFile(); // 配置JVM退出时自动删除临时文件 tempPythonScript.deleteOnExit(); // 将资源流写入临时文件 Files.copy(scriptInputStream, tempPythonScript.toPath(), StandardCopyOption.REPLACE_EXISTING); - 调用临时脚本执行
拿到临时脚本的绝对路径,直接通过ProcessBuilder调用执行即可:ProcessBuilder processBuilder = new ProcessBuilder("python3", tempPythonScript.getAbsolutePath()); // 可按需配置工作目录、环境变量等 Process runningProcess = processBuilder.start();
可选优化项
- 如果Python脚本存在互相引用的情况,可以在应用启动时一次性将所有关联的Python脚本都解压到同一个临时目录下,避免相对路径引用报错。
- 对于调用频率很高的脚本,只需在应用启动时解压一次重复使用即可,无需每次调用都生成新的临时文件,降低IO开销。
- 可以给临时目录添加应用唯一标识,避免同一服务器上多实例运行时出现文件冲突。
轻量场景替代方案
如果使用的Python脚本逻辑很短、没有复杂的依赖和特殊字符,也可以直接读取脚本内容为字符串,通过python -c "脚本内容"的方式直接传给解释器执行,不需要生成临时文件,但该方案不适合长脚本和存在转义字符的场景。
内容的提问来源于stack exchange,提问作者Harsh Pensi
相关产品推荐
相关产品推荐

