Jvm 卡夫卡无法识别的虚拟机选项';打印邮票';

Jvm 卡夫卡无法识别的虚拟机选项';打印邮票';,jvm,apache-kafka,Jvm,Apache Kafka,我在远程服务器上安装了Kafka,当我尝试运行 ~/kafka/bin/zookeeper-server-start.sh ~/kafka/config/zookeeper.properties 我收到一个错误 Unrecognized VM option 'PrintGCDateStamps' 卡夫卡服务器无法启动。这不是在虚拟机中运行的,而是直接在Ubuntu服务器16.04上运行,并正确安装了Java。有什么方法可以简单地纠正这个问题吗?所以我找到了一个答案,想把它贴出来,以防其他人有

我在远程服务器上安装了Kafka,当我尝试运行

~/kafka/bin/zookeeper-server-start.sh ~/kafka/config/zookeeper.properties
我收到一个错误

Unrecognized VM option 'PrintGCDateStamps'

卡夫卡服务器无法启动。这不是在虚拟机中运行的,而是直接在Ubuntu服务器16.04上运行,并正确安装了Java。有什么方法可以简单地纠正这个问题吗?

所以我找到了一个答案,想把它贴出来,以防其他人有这个问题。在kafka/bin/kafka-run-class.sh的最底部有一个部分

exec $JAVA $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH $KAFKA_OPTS "$@"

删除$KAFKA\u GC\u LOG\u OPTS选项。可能是黑客攻击,但至少它让卡夫卡动物园管理员服务器启动了

在安装了oracle jdk 9的Ubuntu 16.04上也出现了同样的问题,我也尝试了openjdk 1.9,但也出现了同样的错误。但当我尝试其他版本的jdk时,我发现oracle jdk 8和openjdk 1.8都可以

因此,只需查看您使用的java版本,或许您可以通过以下方式安装或切换到其他版本的jdk:

update-alternatives --display java
update-alternatives --config java
java -version

@Mitchell Tracy,我知道这是一个有点老的思路,只是把我的发现放在那里,如果有人遇到同样的问题,我会遇到同样的问题

我让jdk-9(早期访问)指向我的$java_主页,我本身就有各种各样的错误,
无法识别的VM选项“PrintGCDateStamps”,-loggc deprecreated,-cp需要指定的类路径
,等等

用一个命令(sudo mv jdk1.8.0.jdk~/Documents)将jdk-9从$java_home移到一边,然后重新启动终端,它就像一个魔咒一样工作!我可以启动zookeeper服务器启动和kafka。
我希望这会有所帮助。

到目前为止,Kafka的默认包在Java 9中有错误。最简单的解决方案是回滚到java8

sudo add-apt-repository ppa:webupd8team/java
sudo apt update; sudo apt install oracle-java8-installer
sudo apt install oracle-java8-set-default

事实上,卡夫卡可以很好地与较新版本的Java配合使用。我也遇到了同样的问题,并在
kafka/bin/kafka run class.sh
脚本中发现了一个错误,其中Java版本被错误地解析

此行获取的版本字符串太多:

JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([^.-]*).*"/\1/p')
这使得
if[[“$JAVA\u MAJOR\u VERSION”-ge“9”]
条件无法识别正确的JAVA版本,并添加了一些不受支持的GC选项

将上面的行更改为此解决了我的问题:

JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([^.-]*).*/\1/p')
我已经向卡夫卡报告了这一问题。问题可在此处找到:


编辑:对此有一个已提交的修复程序:

我正在使用java 10和kafka_2.11-0.10.1.0,我遇到了相同的问题。我在kafka-run-class.sh中没有找到java_MAJOR_版本,所以我检查了错误。它说“无法识别的VM选项‘PrintGCDateStamps’”,这意味着Java 10 GC相关VM选项已更改,Kafka配置与之不兼容。也证实了我的想法

因此,切换到Java版本<9是一种解决方案,但是如果您想继续使用新的Java版本,那么您可以删除指定的选项,而不是删除包含该参数的整行代码。我这么做了,“打印时间戳”成了一个问题。我也把它去掉了。因此,我最终得出以下结论: KAFKA\u GC\u LOG\u OPTS=“-Xloggc:$LOG\u DIR/$GC\u LOG\u FILE\u NAME-verbose:GC-XX:+PrintGCDetails”因此仍将打印GC详细信息,但不会指定时间戳。 动物园管理员开始没有任何问题

像其他答案一样——我得到这个是为了在Java 9上工作。必须进行以下更改:

  • 编辑文件
    bin/kafka run class.sh

  • 在文件末尾(第248行附近)找到以下块:

  • if[“x$GC_LOG_ENABLED”=“xtrue”];然后
    GC\u LOG\u FILE\u NAME=$DAEMON\u NAME$GC\u FILE\u后缀
    KAFKA_GC_LOG_OPTS=“-Xloggc:$LOG_DIR/$GC_LOG_FILE_NAME-verbose:GC-XX:+PrintGCDetails-XX:+PrintGCDateStamps-XX:+PrintGCTimeStamps”
    fi

  • 删除两个标志:
    -XX:+PrintGCDateStamps-XX:+PrintGCTimeStamps
    并保存文件

  • 卡夫卡应该可以在Java9上开始


  • 我使用的是windows,所以我只是运行了bat文件而不是shell脚本

    您可能不应该删除$KAFKA_GC_LOG_OPTS变量,而是找出它的设置位置,然后在那里更改值。PrintGCDateStamps可能来自比您安装的版本更新的Java,但您可能希望启用某种形式的GC日志记录。运行
    java-XX:+PrintFlagsFinal
    查看您特定版本的java所理解的所有标志。对于我现在的JDK 9发行版也是如此。你是否在卡夫卡等中制造了一个问题?删除了我的答案,支持这一个。谢谢卡夫卡实际上可以与较新版本的Java配合使用。该问题是由于版本检测脚本中的错误造成的,该问题目前正在解决中。查看我的答案。JDK 9中的GC日志记录已更改。作为这项工作的一部分被删除的遗留XX标志列表记录在jdk9发行说明中,请参阅:我更新了上述行。还是不适合我。我有Ubuntu 16.04的Java版本:Java 10.0.1 2018-04-17 Java(TM)SE运行时环境18.3(构建10.0.1+10)Java热点(TM)64位服务器VM 18.3(构建10.0.1+10,混合模式)。错误为:::类路径为空。请首先构建项目,例如运行“/gradlew jar-PscalaVersion=2.11.12”,这与原始问题中的错误不同,@NeerajKumar您的类路径可能也有其他错误。NeerajKumar:查看目录路径中是否有空格。尝试在没有任何空间的情况下移动到另一条路径。(希望你下载了二进制文件)。顺便说一句,这个问题与原来的问题不同。谢谢Anders,这解决了我的Java版本问题。现在动物园管理员运行良好。我增加了答案,谢谢你。非常好:)卡夫卡在Java9和Java10中工作得很好。这只是脚本版本检测部分的一个小错误。你绝对不应该因此而回滚Java版本。此PPA已被弃用。当我执行nano-bin/kafka-run-class.sh Ctrl W查找以转到该行时,这对我很有用