java.lang.NoSuchMethodError:org.json.JSONObject.getNames异常

问题描述 投票:0回答:2

我已经包含了从此处下载的必需JAR:www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm,位于项目的构建路径中。

但是,无法解决此错误。还有什么可能导致该问题?

我的堆栈跟踪如下所示:

java.lang.NoSuchMethodError: org.json.JSONObject.getNames(Lorg/json/JSONObject;)[Ljava/lang/String;
at com.comp.cloud.portal.zRPCEngine.zCompRPC(zRPCEngine.java:641)
at com.comp.cloud.portal.zCompManager.CompSubscribe(zCompManager.java:1480)
at com.comp.cloud.portal.zCompManager.AddCompHD(zCompManager.java:310)
at com.comp.cloud.portal.zCompManager.LoadInventory(zCompManager.java:96)
at com.comp.cloud.portal.zCompCloudPortalUI.Login(zCompCloudPortalUI.java:333)
at com.comp.cloud.portal.portlets.Login.ExecuteLogin(Login.java:333)
at com.comp.cloud.portal.portlets.Login$button_login_clicked.buttonClick(Login.java:234)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:198)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161)
at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:984)
at com.vaadin.ui.Button.fireClick(Button.java:393)
at com.vaadin.ui.Button$1.click(Button.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:168)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:295)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:188)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:93)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1408)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:237)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:744)
java json jsonobject
2个回答
1
投票

可能是您将jar添加到了项目的构建路径,但没有将其捆绑到部署在Tomcat上的war中。编辑:您捆绑了Jar的较旧版本,或者从应用程序类路径中可以看到Jar的较旧版本。


1
投票

关于java.lang.NoSuchMethodError:

此错误是运行时错误,是由于在ClassPath中可用的类中缺少方法定义而导致的。在classLoader加载类之后,链接阶段无法链接该方法调用,因为在ClassPath类中不存在所请求的方法当您在一个环境(通常是本地计算机)中编译和测试代码,并在另一环境中部署代码时,通常会发生此错误。我们将为用例考虑以下示例:java.lang.NoSuchMethodError:org.json.JSONTokener

为什么创建了超级jar却无法在ClassPath中使用这些类? :

这是因为类是在运行时加载的,并且如果加载器找到多个具有相同签名的类,它将加载遇到的第一个类。如果该类没有必需的方法,我们将收到NoSuchMethodError。要点是classLoader无法找到我们要加载的确切类。

如何查找正在加载的类?

我们可以在main方法中使用以下代码片段来找出要加载的类。

ClassLoader classloader = org.json.JSONTokener.class.getClassLoader();
URL res = classloader.getResource("org/json/JSONTokener.class");
String path = res.getPath();
System.out.println("Core JSONTokener came from " + path)

找到要从中加载的类的路径后该怎么办?

如果发现正在加载的库来自机器中的其他路径,则必须确保已加载所需的库。最好的方法是遮盖jar并重命名项目中的引用。

如何在Jar中着色罐子并重命名引用?

在Scala中],您可以添加

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.7")

到./project/plugins.sbt,然后使用sbt commandbt程序集生成一个胖jar文件。现在将罐子着色,在您的sbt中使用以下代码:

assemblyShadeRules in assembly := Seq(
ShadeRule.rename(“org.json.**” -> “shadedJson.@1”)
.inLibrary(“org.json” % “json” % “20180813”)
.inAll
)

这将是,重命名正则表达式的所有引用将org.json。**更改为shadedJson。**,并将其包含在依赖项中包含的库中,并通过更改对jar进行着色。现在,当您运行程序时,它将在classPath中找到这两个jar,但是由于您已在代码和jar中重命名了引用,因此它将是由classLoader加载的,而不是由其他加载的。

在Java中

,您可以使用maven-jar-plugin和maven-shade-plugin在Java中创建一个有阴影的jar。https://examples.javacodegeeks.com/enterprise-java/maven/maven-jar-plugin-example/
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
</plugin>
</plugins>
</build>

现在要重命名Java中的引用,您必须在maven-shade-problem中使用重定位模式,如以下链接所述:http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html如何检查罐子是否有阴影?很简单,只需炸开jar并根据您的重命名搜索类名。例如,在我们的情况下,您可以搜索shadedJson爆炸命令:jar -tf*将输出重定向到文件并在该文件中搜索。

© www.soinside.com 2019 - 2024. All rights reserved.