【问题标题】:java.lang.NoSuchMethodException when executing jar in code在代码中执行 jar 时出现 java.lang.NoSuchMethodException
【发布时间】:2014-03-30 14:56:39
【问题描述】:

尝试在代码中执行特定 jar 文件时遇到问题。我的目标是创建 GUI 应用程序(向导),用户可以在其中选择各种 xml 文件,选择要执行的 jar 文件并为其提供输入 xml。

要执行 jar,我使用以下代码: 1: URL[] urls = fillUrls(); 2: loader = new URLClassLoader(urls); 3: Class<?> cls = loader.loadClass(className); 4: Method execute = cls.getDeclaredMethod(methodName, Properties.class, StringBuffer.class, StringBuffer.class, IContext.class); // method name is declared as: // private final String methodName = "execute";

第 1 行的

fillUrls 方法返回已执行 jar 和已执行 jar 运行所需的其他库的 URL。如果省略,第 3 行将抛出异常。当方法到达第 4 行时,抛出 java.lang.NoSuchMethodException。

奇怪的是,jar 中执行的类实现了一个接口,所以不可能没有这样的方法。为了让它更有趣,我用于测试的 jar 文件完美运行,其他人提供的 jar 不...

那么可能是我的代码有问题,或者是如何导出 jar 文件的问题?有什么方法可以证明吗?导出的 jar 来自 maven2 项目。

【问题讨论】:

    标签: java jar maven-2 classloader


    【解决方案1】:

    这可能会有所帮助:

    loader = new URLClassLoader.newInstance(urls);

    【讨论】:

    • 这应该有什么帮助?它只会产生“URLClassLoader.newInstance 无法解析为类型”错误。此外,我想我的问题的原因在第 4 行。
    • newInstance 是 URLCLassloader 的静态方法,如果您安装了安全管理器,则会调用 securityManager.checkPackageAccess。
    【解决方案2】:
    cls.getDeclaredMethod(methodName, Properties.class, 
                         StringBuffer.class, StringBuffer.class, IContext.class);
    

    如果找不到匹配的方法,则抛出 NoSuchMethodException

    Class(您提供的类名)中没有这样的方法,具有给定的方法名称和方法的形参类型 (Properties.class,StringBuffer.class, StringBuffer.class, IContext.class) 按声明顺序。

    【讨论】:

    • 嗯,方法应该在连接器中,但我不太确定形参的顺序。
    • 你能检查一下方法的类源吗?
    • 我刚刚发现,他们重做了这门课。现在它扩展了另外两个类而不是实现资源。但是这两个类都被添加到类加载器中。它会改变我执行该方法的方式吗?
    • 这不会是问题,除非对方法签名有影响
    • 嗯,它现在可以工作了,问题出在 getDeclaredMethod() 中。使用 getMethod() 它可以工作。据此:link getDeclardedMethod() 不适用于继承的方法,这是我的情况......
    猜你喜欢
    • 2020-09-28
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多