Cassandra 无法初始化类 com.sun.jna.Native

问题描述 投票:0回答:5

我在 CentOS 7 上使用的是 Cassandra 3.9 版。 启动 Cassandra Server 时,我收到如下错误::

TRACE [MemtableFlushWriter:1] 2017-05-15 04:25:49,735 LogTransaction.java:264 - 关闭事务日志 [mc_txn_flush_3f6a46f0-3961-11e7-87b4-0728ea39fb0d.log in /var/lib/cassandra/data/system/本地-7ad54392bcdd35a684174e047860b377]
错误 [主要] 2017-05-15 04:25:49,745 CassandraDaemon.java:747 - 启动时遇到异常java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError:无法初始化类 com.sun.jna.Native 位于 org.apache.cassandra.utils.FBUtilities.waitOnFuture(FBUtilities.java:403) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.db.SystemKeyspace.forceBlockingFlush(SystemKeyspace.java:793) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.db.SystemKeyspace.removeTruncationRecord(SystemKeyspace.java:639) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.db.ColumnFamilyStore.invalidate(ColumnFamilyStore.java:541) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.db.ColumnFamilyStore.invalidate(ColumnFamilyStore.java:517) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.schema.LegacySchemaMigrator.lambda$unloadLegacySchemaTables$341(LegacySchemaMigrator.java:137) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.schema.LegacySchemaMigrator$$Lambda$93/1308179535.accept(未知 来源)~[na:na] at java.lang.Iterable.forEach(Iterable.java:75) 〜[na:1.8.0_45] 在 org.apache.cassandra.schema.LegacySchemaMigrator.unloadLegacySchemaTables(LegacySchemaMigrator.java:137) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.schema.LegacySchemaMigrator.migrate(LegacySchemaMigrator.java:83) 〜[apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:254) [apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:601) [apache-cassandra-3.9.0.jar:3.9.0] 在 org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:730) [apache-cassandra-3.9.0.jar:3.9.0]

这个问题有一个解决方案(Cassandra在ARM64机器上启动失败(java.lang.NoClassDefFoundError:无法初始化类com.sun.jna.Native) ),Soultion 建议对 cassandra-env.sh 进行更改。我尝试过,但它对我不起作用。

我在 cassandra-env.sh

中(单独)检查了这些选项
JVM_OPTS="$JVM_OPTS -Djava.io.tmpdir=/home/tech/cassandra/tmp"
JVM_OPTS="$JVM_OPTS -Djava.io.tmpdir=/home/cassandra/tmp"
JVM_OPTS="$JVM_OPTS -Djava.io.tmpdir=/var/lib/cassandra/tmp"

甚至尝试过

JVM_OPTS="$JVM_OPTS -Dcassandra.boot_without_jna=true"

但问题没有改变。

我将 cassandra 记录器更改为 TRACE,但它显示的错误日志与之前没有 TRACE 的错误日志相同。文件(jna-4.0.0.jar)位于 lib 文件夹(/usr/share/cassandra/lib)中。我无法找到真正的原因是什么。

不为我工作的原因如下:

  1. cassandra-env.sh 由服务器加载。 (如果加载了如何检查是否加载)

  2. 可能还有其他问题。

有人,请让我摆脱困境。

java cassandra jna
5个回答
5
投票

最后是jna-4.0.0.jar的问题。

lib 中的文件 jna-4.0.0.jar 未初始化,因此我通过创建 jna.jar 的符号链接来更改该文件。

sudo yum install jna

sudo ln -s (JAVA_PATH)/usr/share/java/jna.jar (CASSANDRA_PATH)/usr/share/cassandra/lib

然后它产生了一些关于 tmp 的错误,用以前的解决方案解决了。

关于JNA,那边已经有一些问题了,但是不具体。


1
投票

我也遇到了同样的问题。清理(rm -rf *) /tmp 文件夹或“-Djava.io.tmpdir”指向的文件夹


0
投票

升级Java后,Cassandra无法启动。我修好了。

1. mkdir -p /var/lib/cassandra/tmp chown cassandra:cassandra /var/lib/cassandra/tmp

2. 将以下参数添加到文件 /cassandra-env.sh 的末尾 JVM_OPTS =“$ JVM_OPTS -Djava.io.tmpdir = / var / lib / cassandra / tmp”

然后重新启动 Cassandra。


0
投票

对于未来的人们...

我在 system.log 文件中看到 NoClassDefFound。

我尝试了 tmp 更改,但无济于事。然后我看了

sudo journalctl -u cassandra.service

我明白了

/etc/cassandra/cassandra-env.sh: Syntax error: Unterminated quoted string

这样我的浏览会有所帮助。


0
投票

我面临同样的错误:

java.lang.NoClassDefFoundError: Could not initialize class com.sun.jna.Native

我是这样解决的:

删除旧的 JNA JAR:

I deleted the old JNA JAR file that came with Cassandra. The file is located in the lib directory of your Cassandra installation:

rm $CASSANDRA_HOME/lib/jna-*.jar

下载最新的 JNA JAR: 我从官方 JNA GitHub 存储库下载了最新的 JNA JAR。您可以在这里找到最新版本。

或者,您可以直接从 Maven Central 下载它。例如,要下载 JNA 版本 5.8.0,请使用以下 URL:

https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar

将新的 JNA JAR 放入 Cassandra lib 目录中: 下载新的 JNA JAR 后,将其放入 Cassandra 安装的 lib 目录中:

cp /path/to/downloaded/jna-5.8.0.jar $CASSANDRA_HOME/lib/

重新启动卡桑德拉: 最后,重新启动 Cassandra 实例以应用更改。

通过更新 JNA 库,解决了 NoClassDefFoundError,Cassandra 成功启动。

© www.soinside.com 2019 - 2024. All rights reserved.