脂肪罐的动态负荷

时间:2014-03-08 03:08:55

标签: java scala jar classloader uberjar

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

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,但如果我通过one-jar或assembly创建它,它会得到java.lang.ClassNotFoundException异常。我是否需要自定义类加载器(如果是,它在哪里?)或者类或包名称是否需要特殊语法?

谢谢!

-Greg

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

1 个答案:

答案 0 :(得分:1)

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

我可以使用上面的方法从没有问题的sbt-assembly创建的胖jar加载任何类。

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

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