1

使用 one-jar 或 sbt-assembly 之类的东西,从 fat jar 动态加载类的正确方法是什么?单罐示例:

val loader = new  URLClassLoader(Array(new File(jarName).toURI.toURL), this.getClass().getClassLoader())
var classToLoad = Class.forName (pluginName, true, loader)
var method = classToLoad.getDeclaredMethod (methodName)
var instance = classToLoad.newInstance ()
var result = method.invoke (instance)
Console.println("Result: " + result)

这适用于我的包制作 jar,但如果我通过一个 jar 或程序集创建它,它会出现 java.lang.ClassNotFoundException异常。我是否需要自定义类加载器(如果需要,它在哪里?)或者类或包名称是否需要特殊语法?

谢谢!

-格雷格

(Scala 中的示例,但对 Java 示例非常满意!)

4

1 回答 1

2

jar 路径可能有错误。如果你想加载类foo.bar.Clazz,你应该能够foo/bar/Clazz.class在 fat jar 文件中找到文件。

我可以使用上面的方法从使用 sbt-assembly 创建的胖 jar 中加载任何类,而不会出现问题。

尝试使用绝对文件路径。验证new File(jarName).isFile返回true.

URLClassLoader要求类可以在 jar 中直接访问。不支持嵌套 jar。

于 2014-03-12T10:34:26.077 回答