1. 程式人生 > 實用技巧 >Logstash 7.7 x+匯出官網 java 外掛為離線包,重安裝失敗bug:ERROR: Something went wrong when installing file:///xxx, message: Illformed requirement ["=java_xxx"]

Logstash 7.7 x+匯出官網 java 外掛為離線包,重安裝失敗bug:ERROR: Something went wrong when installing file:///xxx, message: Illformed requirement ["=java_xxx"]

標題中bug:在最後按照離線包處說明,給出解決方式

公司需要使用最新版logstash來開發,我們自己開放性框架

  1. 解壓windows 直接解壓/linux unzip xxxx.zip
  2. 生成java外掛所需api 核心 jar 包檔案:進入專案根目錄執行-windows:gradlew.bat assemble linux:./gradlew assemble
  1. plugin demo 根目錄,增加java.properties 配置檔案gradle.properties,新增值:LOGSTASH_CORE_PATH=/data/logstashcpl/logstash-7.10.1/logstash-core 該核心路徑指向上一步中核心jar包路徑
  2. 打包外掛:./gradlew gem
  1. 解壓即可使用,進入logstash根目錄
  2. 安裝上面打包的外掛:bin/logstash-plugin install --no-verify --local 你打包出來的外掛
    bin/logstash-plugin install --no-verify --local /data/plugins/logstash-input-java_input_example-master/logstash-input-java_input_example-1.0.1.gem
  3. 執行該外掛:
    bin/logstash -e "input {java_input_example {}} output {stdout { codec => rubydebug }}"
  4. 檢視該外掛在logstash中的名稱
    [root@VM_centos logstash-7.10.1]# bin/logstash-plugin list
    Using JAVA_HOME defined java: /data/shiqi/java/jdk1.8.0_271/
    WARNING, using JAVA_HOME while Logstash distribution comes with a bundled JDK
    ....
    logstash-input-imap
    logstash-input-java_input_example
    logstash-input-jm
    .....
    
    #logstash-input-java_input_example 即為外掛名
    

      

  5. 匯出該外掛用於離線環境安裝(我司內網,沒辦法在內網編譯安裝)bin/logstash-plugin prepare-offline-pack --overwrite --output [包名] 外掛名,上一步獲取的外掛名即可
    #打離線包
    [root@VM_centos logstash-7.10.1]# bin/logstash-plugin prepare-offline-pack --overwrite --output /data/java_input.zip logstash-input-java_input_example
    Using JAVA_HOME defined java: /data/shiqi/java/jdk1.8.0_271/
    WARNING, using JAVA_HOME while Logstash distribution comes with a bundled JDK
    Offline package created at: /data/java_input.zip
    
    You can install it with this command `bin/logstash-plugin install file:///data/java_input.zip`
    

      

  6. 安裝該離線包:bin/logstash-plugin install file:///data/java_input.zip

我在執行上述步驟是遇到問題如下:

  1. demo 外掛問題:該錯誤來源:
    No signature of method: org.gradle.api.internal.tasks.DefaultTaskDependency $TaskDependencySet.getAt() is applicable for argument types: (ArrayList) values:  
    

      

    dependsOn [downloadAndInstallJRuby, removeObsoleteJars, vendor, generateRubySupportFiles] 修改如下
    dependsOn([downloadAndInstallJRuby, removeObsoleteJars, vendor, generateRubySupportFiles])
  2. demo外掛問題:
    /data/plugins/logstash-input-java_input_example-master/src/main/java/org/logstashplugins/JavaInputExample.java:3: error: package co.elastic.logstash.api does not exist
    import co.elastic.logstash.api.Configuration;
    

      該錯誤原因為build.gradle 去匹配核心jar包時未匹配到,因為demo中

    implementation fileTree(dir: LOGSTASH_CORE_PATH, include: "**/logstash-core-?.?.?.jar")
    #logstash-core-?.?.?.jar 中 ? 匹配一個字元,一旦 x.y.z.jar包中版本超過9,達到兩個字元就會匹配不到
    #修改為:
    implementation fileTree(dir: LOGSTASH_CORE_PATH, include: "**/logstash-core-?.??.?.jar") #或指定你生成的jar包版本

      

  3. 安裝離線包:
    ERROR: Something went wrong when installing file:///data//plugins/java-input.zip, message: Illformed requirement ["=java_input_example"]
    

      該錯誤是由於預設命名外掛時以 java開頭導致:build.gradle 檔案中

    pluginInfo.pluginType      = "input"
    pluginInfo.pluginClass     = "JavaInputExample"
    pluginInfo.pluginName      = "java_input_example" //此處命名java開頭導致
    

      

分析安裝離線包導致的該問題:

根目錄搜尋該報錯資訊:

[root@VM_centos logstash-7.10.1]# grep Illformed -nr ./*
./vendor/jruby/lib/ruby/stdlib/rubygems/requirement.rb:110:      raise BadRequirementError, "Illformed requirement [#{obj.inspect}]"
[root@VM_63_147_centos logstash-7.10.1]# vim ./vendor/jruby/lib/ruby/stdlib/rubygems/requirement.rb +110