我正在尝试使用python构建需要调用现有Java程序的应用程序。我决定使用Py4J作为我的python / java桥。
如Py4J“入门”页面中所示,我需要一个在其主要方法中启动GatewayServer
的类,称为EntryPoint
。
这是我要实现的EntryPoint
类的存根:
package base;
import py4j.GatewayServer;
public class MyEntryPoint {
private MyClass myClass;
public MyEntryPoint(String... params) {
myClass = new MyClass(params);
}
public MyClass getMyClass() {
return myClass;
}
public static void main(String[] args) {
GatewayServer server = new GatewayServer(new MyEntryPoint(args));
server.start();
}
}
这是我要实现的MyClass
类的存根:
package base; // Yes, same package as MyEntryPoint
import external.core.RandomObj;
import external.specific.SpecificObj;
public class MyClass extends SpecificObj {
private String[] args = new String[] {};
public MyClass(String... params) {
super();
this.args = params;
}
@Override
protected RandomObj createObj(String name) {
return new RandomObj(name);
}
}
现在,我使用gradle对其进行编译,并且可以正常编译。但是,当我尝试从命令行执行MyEntryPoint
类时,出现以下错误:
$> java base.MyEntryPoint
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: external/core/RandomObj
经过研究,我意识到尝试运行类时必须指定类路径,所以我做到了:
$> java -cp .:/correct/path/for/external/project/java/build/base/classes/java/main:/installation/path/for/Python-3.6.5/share/py4j/py4j0.10.7.jar base.MyEntryPoint
这时,我得到NoClassDefFoundError
和RandomObj
的依赖项之一上的SpecificObj
。
因此,现在要解决一个实际问题:如何避免手动指定每个依赖项,并将外部应用程序视为黑匣子?
批处理文件和CLASSPATH
env变量的定义将意味着,如果外部项目中发生某些更改,我将必须对其进行维护,并且在应用程序规模扩大后,这将是一个很大的负担。另外,如果已经编译了外部项目,则意味着所有依赖项都应该知道。是否可以通过某种方式自动找到它们?