我已经从这里下载了所需的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)
答案 0 :(得分:2)
关于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并重命名项目中的引用。
如何在Scala / Java中为jar着色并重命名引用?
在Scala 中,您可以添加
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.7")
到./project/plugins.sbt,然后使用sbt命令bt程序集生成一个胖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 *将输出重定向到文件并在该文件中搜索。
答案 1 :(得分:1)
可能是您将jar添加到项目构建路径中,但是您没有将它捆绑到Tomcat上部署的war中。编辑:您可以捆绑旧版本的jar,也可以从应用程序类路径中看到旧版本的jar。