将 ChronicleMap 与泛型一起使用:java.lang.NoSuchMethodException: sun.nio.ch.FileChannelImpl.map0(int,long,long)
Using ChronicleMap with generics: java.lang.NoSuchMethodException: sun.nio.ch.FileChannelImpl.map0(int,long,long)
我有以下 class:
public class ChronicleMapIndex<K, V> implements Index<K, V> {
private ChronicleMap<K, V> index;
private Map<String, String> characteristicsMap;
public void buildIndex(String name, Map<String, String> characteristicsMap, Path indexPath, Class<?> keyType, Class<?> valueType){
this.characteristicsMap = characteristicsMap;
String filename = name + ".bin";
Path indexFilePath = Paths.get(indexPath + filename);
try {
index = (ChronicleMap<K, V>) ChronicleMap
.of(keyType, valueType)
.name(name)
.entries(Long.parseLong(characteristicsMap.get("entries")))
.averageValueSize(Double.parseDouble(characteristicsMap.get("averageValueSize")))
.averageKeySize(Double.parseDouble(characteristicsMap.get("averageKeySize")))
.createOrRecoverPersistedTo(indexFilePath.toFile(), true);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public V get(K key) {
return index.get(key);
}
@Override
public void put(K key, V value) {
index.put(key, value);
}
}
我基本上想在包装函数中存储编年史地图。这里,K
和 V
与传递的 keyType
和 valueType
值相同。所以我希望 ChronicleMap 地图具有与 K
和 V
.
相同的键和值类型
但是,当我创建它时,出现以下错误:
net.openhft.chronicle.hash.ChronicleHashRecoveryFailedException: java.lang.AssertionError: java.lang.NoSuchMethodException: sun.nio.ch.FileChannelImpl.map0(int,long,long)
at net.openhft.chronicle.map.ChronicleMapBuilder.openWithExistingFile(ChronicleMapBuilder.java:1877)
at net.openhft.chronicle.map.ChronicleMapBuilder.createWithFile(ChronicleMapBuilder.java:1701)
at net.openhft.chronicle.map.ChronicleMapBuilder.recoverPersistedTo(ChronicleMapBuilder.java:1655)
at net.openhft.chronicle.map.ChronicleMapBuilder.createOrRecoverPersistedTo(ChronicleMapBuilder.java:1638)
at net.openhft.chronicle.map.ChronicleMapBuilder.createOrRecoverPersistedTo(ChronicleMapBuilder.java:1629)
at edu.upf.taln.indexer.index.chroniclemap.ChronicleMapIndex.buildIndex(ChronicleMapIndex.java:27)
在这一行中:
.createOrRecoverPersistedTo(indexFilePath.toFile(), true);
我想知道这个错误是不是因为我对泛型做错了什么。
我在 Windows 10 中使用 ChronicleMap 3.19.4 和 JNA 5.5.0。
这是您可以 运行 轻松进行的个人测试:
Map<String, String> characteristicsMap = new HashMap<>();
characteristicsMap.put("entries", Long.toString(123));
characteristicsMap.put("averageKeySize", Integer.toString(5));
characteristicsMap.put("averageValueSize", Integer.toString(5));
String name = "test";
Path indexPath = Paths.get("D:/trabajo"); // substitute this as needed
ChronicleMapIndex<String, String> index = new ChronicleMapIndex<>();
index.buildIndex(name, characteristicsMap, indexPath ,String.class, String.class);
这与泛型无关。您使用的是 Java 12+,它不受支持。内部 sun.nio.ch.FileChannelImpl 在版本 11 到 14 之间发生了变化,并且不向后兼容。
我们的支持政策是仅支持 Java 的 LTS 版本。我们目前支持的最高版本是 Java 11。下一个 LTS 版本 (TBC) 是 17,这是我们接下来计划支持的版本。
我有以下 class:
public class ChronicleMapIndex<K, V> implements Index<K, V> {
private ChronicleMap<K, V> index;
private Map<String, String> characteristicsMap;
public void buildIndex(String name, Map<String, String> characteristicsMap, Path indexPath, Class<?> keyType, Class<?> valueType){
this.characteristicsMap = characteristicsMap;
String filename = name + ".bin";
Path indexFilePath = Paths.get(indexPath + filename);
try {
index = (ChronicleMap<K, V>) ChronicleMap
.of(keyType, valueType)
.name(name)
.entries(Long.parseLong(characteristicsMap.get("entries")))
.averageValueSize(Double.parseDouble(characteristicsMap.get("averageValueSize")))
.averageKeySize(Double.parseDouble(characteristicsMap.get("averageKeySize")))
.createOrRecoverPersistedTo(indexFilePath.toFile(), true);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public V get(K key) {
return index.get(key);
}
@Override
public void put(K key, V value) {
index.put(key, value);
}
}
我基本上想在包装函数中存储编年史地图。这里,K
和 V
与传递的 keyType
和 valueType
值相同。所以我希望 ChronicleMap 地图具有与 K
和 V
.
但是,当我创建它时,出现以下错误:
net.openhft.chronicle.hash.ChronicleHashRecoveryFailedException: java.lang.AssertionError: java.lang.NoSuchMethodException: sun.nio.ch.FileChannelImpl.map0(int,long,long)
at net.openhft.chronicle.map.ChronicleMapBuilder.openWithExistingFile(ChronicleMapBuilder.java:1877)
at net.openhft.chronicle.map.ChronicleMapBuilder.createWithFile(ChronicleMapBuilder.java:1701)
at net.openhft.chronicle.map.ChronicleMapBuilder.recoverPersistedTo(ChronicleMapBuilder.java:1655)
at net.openhft.chronicle.map.ChronicleMapBuilder.createOrRecoverPersistedTo(ChronicleMapBuilder.java:1638)
at net.openhft.chronicle.map.ChronicleMapBuilder.createOrRecoverPersistedTo(ChronicleMapBuilder.java:1629)
at edu.upf.taln.indexer.index.chroniclemap.ChronicleMapIndex.buildIndex(ChronicleMapIndex.java:27)
在这一行中:
.createOrRecoverPersistedTo(indexFilePath.toFile(), true);
我想知道这个错误是不是因为我对泛型做错了什么。
我在 Windows 10 中使用 ChronicleMap 3.19.4 和 JNA 5.5.0。
这是您可以 运行 轻松进行的个人测试:
Map<String, String> characteristicsMap = new HashMap<>();
characteristicsMap.put("entries", Long.toString(123));
characteristicsMap.put("averageKeySize", Integer.toString(5));
characteristicsMap.put("averageValueSize", Integer.toString(5));
String name = "test";
Path indexPath = Paths.get("D:/trabajo"); // substitute this as needed
ChronicleMapIndex<String, String> index = new ChronicleMapIndex<>();
index.buildIndex(name, characteristicsMap, indexPath ,String.class, String.class);
这与泛型无关。您使用的是 Java 12+,它不受支持。内部 sun.nio.ch.FileChannelImpl 在版本 11 到 14 之间发生了变化,并且不向后兼容。
我们的支持政策是仅支持 Java 的 LTS 版本。我们目前支持的最高版本是 Java 11。下一个 LTS 版本 (TBC) 是 17,这是我们接下来计划支持的版本。