NoSuchMethodError:com.google.common.base.Stopwatch.createStarted()Lcom / google / common / base / Stopwatch

我的应用程序正在抛出NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch错误。 不知道为什么,因为16.0.1确实包含那个类,我已经检查了。 根据我的研究,看起来这是一个错误?

我也有这个代码用于引用,但我认为这不是问题:

  FirewallRule rule = new PeriodicFirewallCounterRule(60, TimeUnit.SECONDS, new IpAddressCountingPolicy()); ((PeriodicFirewallCounterRule)rule).addHandler(new RateLimitationHandler(new UniqueLimitPolicy(10))); FirewallFilter firewallFiler = new FirewallFilter(getContext(), list(rule)); firewallFiler.setNext(ma); 

我的应用程序正在使用Restlet APISpark:

   org.restlet.gae org.restlet.ext.apispark ${version.restlet}  

运行并访问应用程序的REST API时,会抛出此错误:

 [INFO] Caused by: java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch; [INFO] at org.restlet.ext.apispark.internal.firewall.rule.counter.PeriodicCounter.(PeriodicCounter.java:65) [INFO] at org.restlet.ext.apispark.internal.firewall.rule.PeriodicFirewallCounterRule$1.load(PeriodicFirewallCounterRule.java:86) [INFO] at org.restlet.ext.apispark.internal.firewall.rule.PeriodicFirewallCounterRule$1.load(PeriodicFirewallCounterRule.java:84) [INFO] at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3599) [INFO] at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2379) [INFO] at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2342) [INFO] at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2257) [INFO] ... 74 more 

使用扩展名org.restlet.ext.apispark ,检索到的guava依赖项的版本为16.0.1

 Downloading: http://maven.restlet.com/com/google/guava/guava/16.0.1/guava-16.0.1.jar Downloading: http://repo.maven.apache.org/maven2/com/google/guava/guava/16.0.1/guava-16.0.1.jar Downloaded: http://repo.maven.apache.org/maven2/com/google/guava/guava/16.0.1/guava-16.0.1.jar (2176 KB at 711.7 KB/sec) 

它位于从头开始创建的应用程序中,具有以下maven配置:

  4.0.0 org.restlet restlet-apispark-firewall ${project.artifactId} jar 1.0.0-snapshot  1.7 2.3.1    org.restlet.jse org.restlet ${restlet-version}   org.restlet.jse org.restlet.ext.apispark ${restlet-version}     maven-restlet Public online Restlet repository http://maven.restlet.com    

我整合了你的代码,它在我身边很好用。 没有例外被抛出……

我认为Guava的旧版本来自另一个依赖。 如果你使用Maven,你应该确定这个旧的番石榴版本来自哪里,并且可能在相应的依赖项中添加一个排除。 我希望它能解决你的问题……

希望能帮到你,蒂埃里

这是修复错误的解决方案:

首先排除旧的Guava依赖性:

   org.restlet.gae org.restlet.ext.apispark ${version.restlet}   com.fasterxml.jackson.core jackson-databind     com.fasterxml.jackson.core jackson-databind 2.5.1  

由ClassLoader加载的类秒表不包含该方法,不确定是否由Jens所说的多个不兼容的jar引起,或仅仅因为16.0.1没有真正拥有该方法。 一个简单的检查是使用javap或反编译器解析类:

 javap -p Stopwatch.class 

然后检查是否列出了该方法。

编辑:那个方法从15.0开始就存在,所以我也检查你的类路径的内容。

参考NoSuchMethodError Oracle文档

如果应用程序试图调用类的指定方法(静态或实例),并且该类不再具有该方法的定义,则抛出NoSuchMethodError: .

通常,编译器会捕获此错误; 如果类的定义不兼容地更改,则此错误只能在运行时发生

我认为你有这个例外,因为你的类路径中有这个jar的多个版本,并且因为15.0版本中的createStarted()方法可用,我会说你有一个其他旧版本,可能是因为依赖问题。

转移到最新版本的Guava为我做了

在我的情况下,我的一个Maven依赖项是拿起一个新版本的Guava(16.0.1),显然没有这个方法。 当我在我的pom.xml为该依赖项添加了一个排除项时,我的另一个依赖项中拾取了一个较旧(正确)的Guava版本,然后它就可以了。

您可以通过mvn dependency:tree打印您的依赖mvn dependency:tree ,然后查看正在拾取较新版本的番石榴的内容。 您可能需要添加多个排除项才能使其正确。

Interesting Posts