Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NoSuchMethodError:com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch_Java_Guava_Restlet_Apispark - Fatal编程技术网

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

Java NoSuchMethodError:com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch,java,guava,restlet,apispark,Java,Guava,Restlet,Apispark,我的应用程序正在抛出NoSuchMethodError:com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch错误。不知道为什么,因为16.0.1确实包含那个类,我已经检查过了。根据我的研究,这看起来像是一个bug 我也有参考代码,但我认为这不是问题所在: FirewallRule rule = new PeriodicFirewallCounterRule(60, TimeUni

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

我也有参考代码,但我认为这不是问题所在:

    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:

  <dependency>
      <groupId>org.restlet.gae</groupId>
      <artifactId>org.restlet.ext.apispark</artifactId>
      <version>${version.restlet}</version>
  </dependency>

org.restlet.gae
org.restlet.ext.apispark
${version.restlet}
当运行和访问应用程序的RESTAPI时,它抛出 错误:

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

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

javap -p Stopwatch.class
然后检查是否列出了该方法

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

指的是:

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

通常,编译器会捕获此错误只有在类的定义发生不兼容的更改时,才会发生此错误


我认为您得到这个异常是因为您的类路径中有这个jar的多个版本,而且
createStarted()
方法在
15.0
版本中可用,我可以说您有它的另一个旧版本,可能是由于相关性问题。

使用扩展名
org.restlet.ext.apispark
时,检索到的番石榴相关性版本为
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配置从头创建的应用程序中:

<project (...)>
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.restlet</groupId>
    <artifactId>restlet-apispark-firewall</artifactId>
    <name>${project.artifactId}</name>
    <packaging>jar</packaging>
    <version>1.0.0-snapshot</version>

    <properties>
        <java-version>1.7</java-version>
        <restlet-version>2.3.1</restlet-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.restlet.jse</groupId>
            <artifactId>org.restlet</artifactId>
            <version>${restlet-version}</version>
        </dependency>

        <dependency>
            <groupId>org.restlet.jse</groupId>
            <artifactId>org.restlet.ext.apispark</artifactId>
            <version>${restlet-version}</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>maven-restlet</id>
            <name>Public online Restlet repository</name>
            <url>http://maven.restlet.com</url>
        </repository>
    </repositories>
</project>

4.0.0
org.restlet
restlet apispark防火墙
${project.artifactId}
罐子
1.0.0-snapshot
1.7
2.3.1
org.restlet.jse
org.restlet
${restlet版本}
org.restlet.jse
org.restlet.ext.apispark
${restlet版本}
maven restlet
公共在线Restlet存储库
http://maven.restlet.com
我集成了你的代码,在我这方面效果很好。没有引发异常

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

希望对你有帮助,
Thierry

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

首先排除旧的
Guava
依赖项,然后:

  <dependency>
      <groupId>org.restlet.gae</groupId>
      <artifactId>org.restlet.ext.apispark</artifactId>
      <version>${version.restlet}</version>
      <exclusions>
          <exclusion>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
          </exclusion>
      </exclusions>
  </dependency>
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.5.1</version>
  </dependency>

org.restlet.gae
org.restlet.ext.apispark
${version.restlet}
com.fasterxml.jackson.core
杰克逊数据绑定
com.fasterxml.jackson.core
杰克逊数据绑定
2.5.1

移动到最新版本的Guava为我做到了这一点

在我的案例中,我的一个Maven依赖项选择了一个新版本的Guava(16.0.1),它显然没有这种方法。当我在我的
pom.xml
中为该依赖项添加了一个排除项时,我的另一个依赖项选择了一个旧的(正确的)番石榴版本,然后它就工作了


您可以通过
mvn dependency:tree
打印依赖关系树,然后查看更新版本的guava。您可能需要添加多个排除项才能正确操作。

看起来您的类路径中有不兼容的JAR。selenium 2.54.0也存在类似问题,他们使用的是guava,但guava版本14中存在不匹配是的,我现在从目标WEB-INF/lib文件夹中看到两个guava一个是14,一个是16.0。这是多么奇怪的问题!14是导致此异常的原因之一。您使用的是org.restlet.jse。org.restlet.gae会是什么样子?另外,我已经排除了另一个guava依赖项,但APISpark库不能与gae一起使用。这里是一个示例错误日志:我在Java gae开发服务器上工作。。。在这个层次上对你有用吗?或者它只是在GAE平台本身上?我确实尝试了一个与我粘贴在这里的错误相关的“解决方法”,现在我得到了这个错误:我希望你能检查一下我在我的测试项目中尝试了你的maven配置,它在GAE开发服务器中对我有效。我使用GAE 1.9.18。你能给我提供一个小项目(例如在github存储库中)让我重现你的问题并调试它吗?谢谢您正在使用的最新版本是什么?
  <dependency>
      <groupId>org.restlet.gae</groupId>
      <artifactId>org.restlet.ext.apispark</artifactId>
      <version>${version.restlet}</version>
      <exclusions>
          <exclusion>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
          </exclusion>
      </exclusions>
  </dependency>
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.5.1</version>
  </dependency>