python subprocess 调jar包

这篇博客介绍了如何使用Java的Fastjson库将ArrayList转换为JSON字符串,展示了在命令行中通过-jar运行Java程序的基本操作,并解析了输出结果。

这个不是很常用,但是有些接口提供java sdk会用到,所以记录一下:
java 打jar不说了,注意命令行java版本和idea一致

package wq;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
public class test {
    public static void main(String[] args){
        ArrayList name = new ArrayList<String>();
        name.add("adf");
        System.out.print("Hello,World!");
        String jsonString = JSON.toJSONString(name);
        System.out.println(jsonString);
    }
}
    cmd = ["java", "-jar", "D://project/zjxg-server/loader/a.jar"]
    a = subprocess.run(cmd, capture_output=True, encoding="utf-8")
    b=a.stdout.replace('Hello,World!','')
    import json
    c=json.loads(b)
    print (c,type(c))
    >>>['adf'] <class 'list'>
Python 中使用 Java 的 `.jar` ,可以通过 **JPype1** 或 **Py4J** 等工具实现。下面以最常用且直接的方式 —— `JPype1` 为例,详细介绍如何加载并用一个外部 `.jar` 文件中的类和方法。 --- ### ✅ 步骤一:安装 JPype1 ```bash pip install JPype1 ``` > 注意:确保系统已安装 JDK 或 JRE,并配置好环境变量(`JAVA_HOME`)。 --- ### ✅ 步骤二:准备一个示例 `.jar` 文件 假设你有一个 Java 编写的 JAR 文件:`mylib.jar`,其中含如下结构: ```java // com.example.Calculator.java package com.example; public class Calculator { public int add(int a, int b) { return a + b; } public String greet(String name) { return "Hello, " + name + "!"; } } ``` 编译打为 `mylib.jar`,放在当前目录下。 --- ### ✅ 步骤三:Python 用 `.jar` 中的类 ```python import jpype import jpype.imports # 启用导入支持 from jpype.types import * # 设置 JVM 类路径,含你的 jar 文件 jar_path = "mylib.jar" if not jpype.isJVMStarted(): jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.class.path=" + jar_path) try: # 导入 Java 类(名.类名) Calculator = jpype.JClass("com.example.Calculator") # 创建实例 calc = Calculator() # 用方法 result = calc.add(5, 7) print(f"5 + 7 = {result}") # 输出: 5 + 7 = 12 greeting = calc.greet("Alice") print(greeting) # 输出: Hello, Alice! finally: # 关闭 JVM if jpype.isJVMStarted(): jpype.shutdownJVM() ``` --- ### 🔍 解释说明: - `"-Djava.class.path=" + jar_path`:告诉 JVM 在启动时将指定的 `.jar` 文件加入类路径。 - `jpype.JClass("全限定类名")`:动态加载 Java 类。 - `jpype.startJVM()`:启动 JVM,必须在使用任何 Java 类前用。 - `jpype.shutdownJVM()`:可选,用于显式关闭 JVM(注意某些平台限制)。 --- ### ✅ 多个 JAR 文件处理 如果依赖多个 `.jar`,可以用 `os.pathsep` 分隔(Windows 是 `;`,Linux/macOS 是 `:`): ```python import os classpath = os.pathsep.join(["mylib.jar", "dependency1.jar", "utils.jar"]) jpype.startJVM(jpype.getDefaultJVMPath(), f"-Djava.class.path={classpath}") ``` --- ### ✅ 处理 Java 异常 Java 抛出的异常可以在 Python 中捕获: ```python try: invalid_obj = jpype.JClass("com.nonexistent.Class") except jpype.JavaException as e: print(f"捕获 Java 异常: {e}") except Exception as e: print(f"其他错误: {e}") ``` --- ### ⚠️ 常见问题与注意事项 1. **类路径错误**:确保 `.jar` 路径正确,类名是完整名(如 `com.example.Calculator`)。 2. **JVM 只能启动一次**:不能重复用 `startJVM()`。 3. **性能开销**:启动 JVM 较慢,适合长期运行任务。 4. **类型自动转换**:基本类型(int、str)会自动映射;复杂对象需注意序列化或封装。 --- ### 替代方案:使用 `subprocess` 执行 `.jar` 如果你只需要运行 `.jar` 并获取输出,不需要交互式用: ```python import subprocess result = subprocess.run( ["java", "-jar", "mylib.jar", "arg1", "arg2"], capture_output=True, text=True ) print(result.stdout) ``` 适用于命令行工具型 `.jar`。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值