【问题标题】:Dynamic load of fat jar's脂肪罐的动态负载
【发布时间】:2014-04-11 10:48:47
【问题描述】:

使用 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 示例非常满意!)

【问题讨论】:

  • 你确认你要加载的类确实包含在jar中了吗?
  • 当然 - 在一个 jar 中,所有部门的 jar + 我的项目都在那里。如果我提取罐子,我的课就在这里。对于组装,它也在那里。 ....这可能是答案?当我想使用它时,提取 fat jar 的内容,然后从那些提取的文件中加载。似乎拥有一个胖 jar-aware 类加载器会更有意义,我也可以这样做(但我试图找出正确的方法,而不仅仅是让它工作)
  • 那么最可能的解释就是你的jar路径有误。如果你想加载类foo.bar.Clazz,你应该能够在fat jar 文件中找到文件foo/bar/Clazz.class。我可以使用上面的方法从使用 sbt-assembly 创建的胖 jar 中加载任何类,而不会出现问题。所以你的路径一定是错误的。也许它是相对于错误的基础?尝试使用绝对文件路径。验证 new File(jarName).isFile 是否返回 true
  • 谢谢!对于大会,就是这样 - 我在路径的尽头有一个空间!关于github.com/sbt/sbt-onejar 制作的罐子有什么想法吗?我确实验证了那个路径是正确的(但得到了一个 ClassNotFound)。由于那个胖罐子里的所有东西都是罐子,我假设我需要一个特殊的类加载器?
  • 我从未使用过 sbt-onejar,但URLClassLoader 不会处理嵌套的 jar,所以如果是这种情况,您确实需要一个自定义类加载器。

标签: java scala jar classloader uberjar


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多