简体   繁体   English

在实现的方法上获取 java.lang.AbstractMethodError

[英]Getting java.lang.AbstractMethodError on implemented method

As the title states, I get a java.lang.AbstractMethodError on a method that is definitively implemented by my class.正如标题所述,我在我的类明确实现的方法上得到了java.lang.AbstractMethodError The complete error message is:完整的错误信息是:

java.lang.AbstractMethodError: htmlexport.HTMLExport.getParameterFormDescriptor()Ljava/util/List;

I have an interface that defines the method as follows:我有一个定义方法的接口,如下所示:

List<ParamFormElement> getParameterFormDescriptor();

And as I said this method is implemented by the implementing class.正如我所说,这个方法是由实现类实现的。

The interface is included in a jar that is in my local Maven repository.该接口包含在我本地 Maven 存储库中的 jar 中。 I already tried mvn clean and mvn install and bumping the version number, but this does not solve the problem.我已经尝试过mvn cleanmvn install并修改版本号,但这并不能解决问题。

The implementing class is in another jar file which I create using an ANT-script.实现类位于我使用 ANT 脚本创建的另一个 jar 文件中。 The file is then loaded via a ClassLoader in the main application.然后通过主应用程序中的 ClassLoader 加载该文件。

Any clues why I get this error?为什么我收到此错误的任何线索? All other methods defined by the interface are working.接口定义的所有其他方法都在工作。

Here comes the code代码来了

I have a Wicket WebPage where I make the call to this method:我有一个 Wicket WebPage ,可以在其中调用此方法:

public class AddJobPage extends BasePage {

    public AddJobPage(final PageParameters params) {
        super(params);

        final Workable w =
                WorkableManager.getInstance().findWorkableByName(params.get("workableName").toString());
        w.getParameterFormDescriptor();
    }

}

The WorkableManager internally loads the jar-file which includes the implementing class using an URLClassLoader . WorkableManager使用URLClassLoader在内部加载包含实现类的 jar 文件。 This is working fine and I get an instance of the needed class.这工作正常,我得到了所需类的实例。

The interface that defines the method is:定义方法的接口是:

public interface Workable {

    List<ParamFormElement> getParameterFormDescriptor();

}

And the implementing class looks like this ( Module extends Workable ):实现类看起来像这样( Module extends Workable ):

public class HTMLExport implements Module {

    @Override
    public final List<ParamFormElement> getParameterFormDescriptor() {
        final List<ParamFormElement> form = new ArrayList<>();
        form.add(new ParamFormElement(ParamFormElement.Type.TEXT, "Bitte eingeben:", "test"));
        return form;
    }

}

The interface is in a separate project and assembled as a jar-file in my local Maven repository.该接口位于一个单独的项目中,并在我的本地 Maven 存储库中组装为 jar 文件。 The HTMLExport class is in a different project, too and compiled and assembled using Ant. HTMLExport类也位于不同的项目中,并使用 Ant 进行编译和组装。 The resulting jar-file is in a folder next to my main application and as I said loading the class works.生成的 jar 文件位于我的主应用程序旁边的文件夹中,正如我所说,加载类是有效的。 The main application is a Maven project and has the interface added as a dependency.主应用程序是一个 Maven 项目,并将接口添加为依赖项。 In Eclipse I do not have any errors or warnings.在 Eclipse 中,我没有任何错误或警告。

The stacktrace is following:堆栈跟踪如下:

Root cause:

java.lang.AbstractMethodError: htmlexport.HTMLExport.getParameterFormDescriptor()Ljava/util/List;
    at web.pages.AddJobPage.<init>(AddJobPage.java:30)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:171)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:99)
    at org.apache.wicket.DefaultMapperContext.newPageInstance(DefaultMapperContext.java:137)
    at org.apache.wicket.core.request.handler.PageProvider.resolvePageInstance(PageProvider.java:268)
    at org.apache.wicket.core.request.handler.PageProvider.getPageInstance(PageProvider.java:166)
    at org.apache.wicket.request.handler.render.PageRenderer.getPage(PageRenderer.java:78)
    at org.apache.wicket.request.handler.render.WebPageRenderer.isPageStateless(WebPageRenderer.java:300)
    at org.apache.wicket.request.handler.render.WebPageRenderer.shouldRenderPageAndWriteResponse(WebPageRenderer.java:342)
    at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:203)
    at org.apache.wicket.core.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:175)
    at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:837)
    at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
    at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:265)
    at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:222)
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:293)
    at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:261)
    at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:203)
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:284)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1631)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:549)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:568)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1111)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:478)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1045)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:199)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:462)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:279)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:232)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:534)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536)
    at java.lang.Thread.run(Thread.java:722)

Complete stack:

org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor 'public web.pages.AddJobPage(org.apache.wicket.request.mapper.parameter.PageParameters)' and argument 'workableName=[HTML Export]'. An exception has been thrown during construction!
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:194)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:99)
    at org.apache.wicket.DefaultMapperContext.newPageInstance(DefaultMapperContext.java:137)
    at org.apache.wicket.core.request.handler.PageProvider.resolvePageInstance(PageProvider.java:268)
    at org.apache.wicket.core.request.handler.PageProvider.getPageInstance(PageProvider.java:166)
    at org.apache.wicket.request.handler.render.PageRenderer.getPage(PageRenderer.java:78)
    at org.apache.wicket.request.handler.render.WebPageRenderer.isPageStateless(WebPageRenderer.java:300)
    at org.apache.wicket.request.handler.render.WebPageRenderer.shouldRenderPageAndWriteResponse(WebPageRenderer.java:342)
    at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:203)
    at org.apache.wicket.core.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:175)
    at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:837)
    at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
    at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:265)
    at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:222)
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:293)
    at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:261)

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:171)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:99)
    at org.apache.wicket.DefaultMapperContext.newPageInstance(DefaultMapperContext.java:137)
    at org.apache.wicket.core.request.handler.PageProvider.resolvePageInstance(PageProvider.java:268)
    at org.apache.wicket.core.request.handler.PageProvider.getPageInstance(PageProvider.java:166)
    at org.apache.wicket.request.handler.render.PageRenderer.getPage(PageRenderer.java:78)
    at org.apache.wicket.request.handler.render.WebPageRenderer.isPageStateless(WebPageRenderer.java:300)
    at org.apache.wicket.request.handler.render.WebPageRenderer.shouldRenderPageAndWriteResponse(WebPageRenderer.java:342)
    at org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:203)
    at org.apache.wicket.core.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:175)
    at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:837)
    at org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
    at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:265)
    at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:222)
    at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:293)
    at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:261)

Make sure you have the latest jar file in your class path not a older copy.确保您的类路径中有最新的 jar 文件,而不是旧的副本。 If you are seeing this at run time this happens due to incompatible binaries如果您在运行时看到这种情况,这是由于二进制文件不兼容造成的

From Oracle java site来自 Oracle Java 站点

Thrown when an application tries to call an abstract method.当应用程序尝试调用抽象方法时抛出。 Normally, this error is caught by the compiler;通常,这个错误是由编译器捕获的; this error can only occur at run time if the definition of some class has incompatibly changed since the currently executing method was last compiled .如果自上次编译当前执行的方法以来某些类的定义发生了不兼容的更改,则此错误只会在运行时发生

Link to Class AbstractMethodError 链接到 AbstractMethodError 类

Also try the -U flag forces to update dependencies.还可以尝试使用 -U 标志强制更新依赖项。

mvn clean install -U

The problem was that the implementing class was not compiled correctly and the Ant script did not copy the correct class into the jar-file.问题是实现类没有正确编译,Ant 脚本没有将正确的类复制到 jar 文件中。 I converted it to a maven project and now the method can be found.我将其转换为maven项目,现在可以找到该方法。

if your implementing class's jar is not in the classpath or not sure如果您的实现类的 jar 不在类路径中或不确定

try like below code尝试像下面的代码

    YourInterfaceName obj = (YourInterfaceName)Class.forName
("yourPackageName.YourInterfaceImplClassName").newInstance();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM