• Windows 下 Kafka 2.8.1 启动报错“输入行太长”问题解决方案


    问题描述

    在 Windows 下运行 Kafka 2.8.1 时有可能报错“输入行太长。命令语法不正确”。出现这个问题的原因是 Windows 命令长度最长支持 8192 个字符,Kafka 的启动脚本中有命令拼接 classpath 变量,classpath 的内容是每个 jar 包的绝对路径拼接的字符串。当 Kafka 的位置比较深,也就是目录比较长的时候,classpath 的长度就会超长。之前版本的 Kafka 没有问题是因为 2.8.1 版本的 Kafka 的 libs 目录下的 jar 包数量增加了,也就是说之前版本也是存在这个隐患的。

    解决方案

    既然知道了是 classpath 过长引起的,那么缩短其长度就可以了。

    在使用 IDEA 开发时已经遇到过这种情况了,IDEA 给出了三个方案:

    1. JAR manifest
    2. classpath file
    3. @argfile(Java 9+)

     犹豫 Kafka 的位置是不固定,所以需要动态生成 classpath,所以选择了 @argfile 方案。

    方案一

    以下方案在 JDK 11 上验证

    指定 classpath 时直接指定文件夹,kafka-run-class.bat 需要做以下修改:

    1. 注释或删除 93 ~ 95 行,这三行的作用是拼接 classpath。↓

     2. 注释或删除 174 ~ 177 行,这四行的作用是判断 classpath 是否定义,如果未定义则退出。因为要直接指定目录了,所以不需要 classpath 了。↓

     3. 修改 179 行,将 "%CLASSPATH%" 替换成 %BASE_DIR%\libs\*

    修改前:↓

    set COMMAND=%JAVA% %KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS% %KAFKA_JMX_OPTS% %KAFKA_LOG4J_OPTS% -cp "%CLASSPATH%" %KAFKA_OPTS% %*

    修改后:↓

    set COMMAND=%JAVA% %KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS% %KAFKA_JMX_OPTS% %KAFKA_LOG4J_OPTS% -cp %BASE_DIR%\libs\* %KAFKA_OPTS% %*

    方案二

    以下方案在 JDK 11 上验证 

     将 classpath 的内容全部放到 argfile.txt 中,然后在启动命令中指定。kafka-run-class.bat 需要做以下修改:

    1. 修改 93 ~ 95 行,原来的逻辑是拼接 classpath 字符串,新的逻辑是将 classpath 的内容写入到文件中。↓

    注意:classpath 内所有包的绝对路径之间用分号分割,且不能换行,第 95 行就是为了实现不换行。

    2. 注释或删除 174 ~ 177 行,不再需要 classpath 变量了

    3. 修改 179 行,将 -cp "%CLASSPATH%" 替换成 @argfile.txt

    修改前:↓

    set COMMAND=%JAVA% %KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS% %KAFKA_JMX_OPTS% %KAFKA_LOG4J_OPTS% -cp "%CLASSPATH%" %KAFKA_OPTS% %*

    修改后:↓

    set COMMAND=%JAVA% %KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS% %KAFKA_JMX_OPTS% %KAFKA_LOG4J_OPTS% @argfile.txt %KAFKA_OPTS% %*

    结语

    IDEA 给出的三个方案只验证了一种方案,感兴趣的同学可以验证一下剩余的两种方案,如果发了文章请@我,共同学习。

  • 相关阅读:
    Vue知识系列(2)每天10个小知识点
    栈(扩容)的初始化、判满、扩容、入栈、获取栈顶元素且删除、获取栈顶元素不删除等等
    Runaway Queries 管理:提升 TiDB 稳定性的智能引擎
    工程伦理--15.6 克隆技术和干细胞研究的伦理问题(下)
    线上应急的正确姿势应是怎样的?
    亚马逊一分钟1000+的僵尸链接获取只需三步
    Effective Java学习笔记---------方法
    [架构之路-14]:目标系统 - 硬件平台 - CPU、MPU、NPU、GPU、MCU、DSP、FPGA、SOC的区别
    Asp .Net Core 系列:集成 CORS跨域配置
    【流媒体】 通过ffmpeg硬解码拉流RTSP并播放
  • 原文地址:https://blog.csdn.net/FunnyWhiteCat/article/details/126241088