gpt4 book ai didi

java - CacheBuilder 中的 NoSuchMethodError (checkState)

转载 作者:行者123 更新时间:2023-11-29 06:53:30 60 4
gpt4 key购买 nike

我已经创建了一个 Guava(一个包含有用的东西的库,几乎可以在任何 Java 项目中使用,包括用于不可变集合、函数式编程、I/O 等等的库)基于 CacheBuilder 的缓存

 LoadingCache<String, Byte[]> companyDevicesCache = 
CacheBuilder.newBuilder()
.maximumSize(1000) // maximum 100 records can be cached
.expireAfterAccess(24, TimeUnit.HOURS) // cache will expire after 30 minutes of access
.build(new CacheLoader<String, Byte[]>(){ // build the cacheloader

@Override
public Byte[] load(String companyId) throws Exception {
//make the expensive call
return getFromServletContext (companyId);
}


});

我也试过

CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(1000)
.build(new CacheLoader<String, List<String>>() {
@Override
public List<String> load(String queryKey) throws Exception {
return null;
}
});

还有

CacheLoader loader = new CacheLoader()
{
public String load(String key) throws Exception
{
return null;
}

@Override
public Object load(Object arg0) throws Exception {
// TODO Auto-generated method stub
return null;
}
};

LoadingCache<String, String> persons = CacheBuilder.newBuilder()
.initialCapacity(30)
.maximumSize(40)
.recordStats()
.build(loader);

final LoadingCache<String, Optional<Product>> cache =


CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.DAYS)
.refreshAfterWrite(1, TimeUnit.SECONDS)
.build( new CacheLoader<String, Optional<Product>>() {
@Override
public Optional<Product> load( String productId ) throws Exception {
return null;
}
}
);

但是当我初始化 CacheBuilder 时,我得到了这个错误:

]] Root cause of ServletException.
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState(ZLjava/lang/String;J)V
at com.google.common.cache.CacheBuilder.maximumSize(CacheBuilder.java:409)

这是库的版本:guava-20.0-rc1.jar

这里是 ear 中包含的库

enter image description here

我还尝试为这个 guava-19.0.jar 替换库,但后来我得到了

]] Root cause of ServletException.
java.lang.IncompatibleClassChangeError: Found interface com.google.common.base.Equivalence, but class was expected
at com.google.common.cache.LocalCache$Strength$1.defaultEquivalence(LocalCache.java:393)
at com.google.common.cache.CacheBuilder.getKeyEquivalence(CacheBuilder.java:297)
at com.google.common.cache.LocalCache.<init>(LocalCache.java:246)
at com.google.common.cache.LocalCache$LocalLoadingCache.<init>(LocalCache.java:4868)
at com.google.common.cache.CacheBuilder.build(CacheBuilder.java:786)

最佳答案

看起来您在类路径上确实有多个版本的 com.google.common.base.Preconditions 类(可能来自非常旧的 google-collections jar?),或者损坏的 jar。

没有找到的 method overload 已经是 added in Guava 20.0 :

public static void checkState(boolean b, @Nullable String errorMessageTemplate, long p1)

基于 NoSuchMethodError 中的签名:

checkState(ZLjava/lang/String;J)V
|| | |
|| | returns void
|| |
|| long
|String
|
boolean

您可以通过在调用 CacheBuilder.maximumSize() 之前添加以下代码来找到类定义的来源:

System.out.println(com.google.common.base.Preconditions.class
.getProtectionDomain()
.getCodeSource()
.getLocation()
.toExternalForm());

您将获得 jar 的 URL。

我已经从 Maven Central 下载了 guava-20.0-rc1.jar,提取了它的内容并使用 Preconditions.class 检查了 javap 的内容,方法肯定在那里:

$ javap Preconditions.class
Compiled from "Preconditions.java"
public final class com.google.common.base.Preconditions {
// ...
public static void checkState(boolean, java.lang.String, long);
// ...
}

在你的ant snippet中,有多个通配符include,比如:

<include name="**/spring/*.jar"/>

那里可能有一个额外版本的 Guava,特别是考虑到切换到 guava-19.0 时遇到的另一个错误:Equivalence 在 9.0 之前是一个 interface,并且在 2011 中更改为 10.0 的 class

关于java - CacheBuilder 中的 NoSuchMethodError (checkState),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40305005/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com