使用像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示例非常满意!)
答案 0 :(得分:1)
jar路径可能有误。如果要加载类foo.bar.Clazz
,您应该能够在胖jar文件中找到文件foo/bar/Clazz.class
。
我可以使用上面的方法从没有问题的sbt-assembly创建的胖jar加载任何类。
尝试使用绝对文件路径。确认new File(jarName).isFile
返回true
。
URLClassLoader
要求可以在jar中直接访问这些类。不支持嵌套jar。