Я пытаюсь запустить JavaGateway со стороны Python, используя py4j. Вот минимальный набор файлов, необходимых для воспроизведения проблемы, с которой я столкнулся.
py4j.Py4JException: Target Object ID does not exist for this gateway :t
A.java
public class A {
}
EntryPoint.java
import py4j.GatewayServer;
public class EntryPoint {
public A getA() {
return new A();
}
public static void main(String[] args) {
GatewayServer gatewayServer = new GatewayServer(new EntryPoint());
gatewayServer.start();
System.out.println("server started");
}
}
Я использую IntelliJ для создания файла .jar, где основным классом является EntryPoint, а py4j.jar включен в качестве зависимости.
Теперь я пытаюсь запустить шлюз, указав путь к созданному файлу .jar в python.
test.py
from py4j.java_gateway import JavaGateway
gateway = JavaGateway.launch_gateway(classpath = '../out/artifacts/debugPy4j_jar/debugPy4j.jar')
a = gateway.entry_point.getA()
Будем очень признательны за любые советы по решению этой проблемы.




Вы не можете указать собственный основной класс с launch_gateway, что означает, что вы не можете указать точку входа. Вы можете указать только путь к классам, который добавляется к пути к файлу jar Py4J.
«t» - это имя точки входа на стороне Java: поскольку точки входа нет, Py4J не может найти объект «t». Эта деталь реализации, вероятно, не должна попадать в исключительную ситуацию, с которой сталкивается пользователь.
launch_gateway жестко запрограммирован на использование py4j.GatewayServer в качестве основного класса, поскольку он ожидает, что сторона Java будет вести себя определенным образом.
В вашем случае вы все равно можете создать экземпляр EntryPoint из Python после запуска GatewayServer:
from py4j.java_gateway import JavaGateway
gateway = JavaGateway.launch_gateway(classpath='../out/artifacts/debugPy4j_jar/debugPy4j.jar')
a = gateway.jvm.A()
Я добавил пример
Поправьте меня, если я ошибаюсь, но это не запускает сам сервер шлюза, верно? Как это до сих пор работает?
Кроме того, означает ли это, что EntryPoint.java не нужен? Разве я не могу просто создать артефакт с A.java и использовать его в качестве пути к классам?
launch_gateway запускает JVM и GatewayServer. EntryPoint.java не нужен, да.
Как пройти callback_server_parameters?
Не могли бы вы привести пример? Я не слишком знаком с py4j