JAVA-如何运行具有嵌套依赖项的类

时间:2018-08-16 15:19:30

标签: java python py4j

我正在尝试使用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

这时,我得到NoClassDefFoundErrorRandomObj的依赖项之一上的SpecificObj

因此,现在要解决一个实际问题:如何避免手动指定每个依赖项,并将外部应用程序视为黑匣子?

批处理文件和CLASSPATH env变量的定义将意味着,如果外部项目中发生某些更改,我将必须对其进行维护,并且在应用程序规模扩大后,这将是一个很大的负担。另外,如果已经编译了外部项目,则意味着所有依赖项都应该知道。是否可以通过某种方式自动找到它们?

0 个答案:

没有答案