Elasticsearch 7.17.6自定义插件安装报错:找不到plugin-descriptor.properties
Elasticsearch 7.17.6自定义插件安装失败问题排查
问题背景
为Elasticsearch 7.17.6开发Java自定义插件,使用gradle distZip命令构建插件压缩包。解压压缩包后,所有文件(包括plugin-descriptor.properties)均位于根目录,但执行以下安装命令时失败:
elasticsearch-plugin install file:///plugins/elasticsearch_plugin-1.0.zip -v
报错信息
sh-5.0# elasticsearch-plugin install file:/plugins/elasticsearch_plugin-1.0.zip -v -> Installing file:/plugins/elasticsearch_plugin-1.0.zip -> Downloading file:/plugins/elasticsearch_plugin-1.0.zip Retrieving zip from file:/plugins/elasticsearch_plugin-1.0.zip [=================================================] 100%?? -> Failed installing file:/plugins/elasticsearch_plugin-1.0.zip -> Rolling back file:/plugins/elasticsearch_plugin-1.0.zip -> Rolled back file:/plugins/elasticsearch_plugin-1.0.zip Exception in thread "main" java.nio.file.NoSuchFileException: /usr/share/elasticsearch/plugins/.installing-4054247711532660111/plugin-descriptor.properties at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106) at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:218) at java.base/java.nio.file.Files.newByteChannel(Files.java:380) at java.base/java.nio.file.Files.newByteChannel(Files.java:432) at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:422) at java.base/java.nio.file.Files.newInputStream(Files.java:160) at org.elasticsearch.plugins.PluginDescriptor.readFromProperties(PluginDescriptor.java:183) at org.elasticsearch.plugins.cli.InstallPluginAction.loadPluginInfo(InstallPluginAction.java:827) at org.elasticsearch.plugins.cli.InstallPluginAction.installPlugin(InstallPluginAction.java:887) at org.elasticsearch.plugins.cli.InstallPluginAction.execute(InstallPluginAction.java:245) at org.elasticsearch.plugins.cli.InstallPluginCommand.execute(InstallPluginCommand.java:88) at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77) at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:95) at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) at org.elasticsearch.cli.Command.main(Command.java:77) at org.elasticsearch.plugins.cli.PluginCli.main(PluginCli.java:36)
插件描述文件内容
plugin-descriptor.properties内容如下:
type=isolated description=My custom plugin for Elasticsearch version=1.0.0 name=myplugin classname=com.example.MyPlugin java.version=1.8 elasticsearch.version=7.17.6
临时解决方法
将压缩包复制到Docker容器内,解压后把整个文件夹移动到/usr/share/elasticsearch/plugins目录,重启容器后插件可正常加载运行。
问题原因
Elasticsearch的elasticsearch-plugin install工具要求插件压缩包的结构必须是:所有插件文件放在以插件名称(即plugin-descriptor.properties中的name字段值)命名的子目录下,而不是直接放在压缩包根目录。
使用gradle distZip构建的压缩包将文件直接放在根目录,不符合安装工具的预期结构。当工具解压压缩包到临时目录(如/usr/share/elasticsearch/plugins/.installing-xxxxxx)时,会默认去子目录中查找plugin-descriptor.properties,自然找不到根目录下的文件,导致安装失败。
手动解压后移动文件夹的操作,相当于手动创建了符合要求的目录结构,因此插件能正常被Elasticsearch识别加载。
内容的提问来源于stack exchange,提问作者Pharmakon
相关产品推荐
相关产品推荐

