# Could not install Analysis Plugin that I created

**URL:** <https://discuss.elastic.co/t/could-not-install-analysis-plugin-that-i-created/193070>\
**Category:** Elasticsearch\
**Created:** [July 31, 2019, 8:44am UTC](https://discuss.elastic.co/t/could-not-install-analysis-plugin-that-i-created/193070 "2019-07-31T08:44:51Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![naughie](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/naughie/32/51307_2.png) [@naughie](https://discuss.elastic.co/u/naughie)\
**Post date:** [July 31, 2019, 8:44am UTC](https://discuss.elastic.co/t/could-not-install-analysis-plugin-that-i-created/193070/1 "2019-07-31T08:44:51Z")

</div>

I have created a new analysis plugin with mvn, but installation `bin/elasticsearch-plugin install` failed.

## Env

- CentOS 7
- elasticsearch 7.2.0
- java 1.8

## Files

- `pom.xml`
- `src/main/assemblies/plugin.xml`
- `src/main/resources/plugin-descriptor.properties`
- `src/main/java/hoge/AnalysisHogePlugin.java`
- `src/main/java/hoge/HogeTokenizerFactory.java`
- `src/main/java/hoge/HogeTokenizer.java`

## Contents of the plugin

For a minimal example, I created an analysis plugin that does nothing:

- `AnalysisHogePlugin`:

```auto
package hoge;

import org.apache.lucene.analysis.Analyzer;
import org.elasticsearch.index.analysis.TokenizerFactory;
import org.elasticsearch.indices.analysis.AnalysisModule.AnalysisProvider;
import org.elasticsearch.plugins.AnalysisPlugin;
import org.elasticsearch.plugins.Plugin;

import java.util.Map;

import static java.util.Collections.singletonMap;

import hoge.HogeTokenizerFactory;

public class AnalysisHogePlugin extends Plugin implements AnalysisPlugin {
  @Override
  public Map<String, AnalysisProvider<TokenizerFactory>> getTokenizers() {
    return singletonMap("hoge_tokenizer", HogeTokenizerFactory::new);
  }
}

```

- `HogeTokenizer`:

```auto
package hoge;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;

import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute;
import org.apache.lucene.analysis.tokenattributes.PositionLengthAttribute;
import org.apache.lucene.analysis.util.RollingCharBuffer;
import org.apache.lucene.util.ArrayUtil;
import org.apache.lucene.util.AttributeFactory;

public final class HogeTokenizer extends Tokenizer {

  private final RollingCharBuffer buffer = new RollingCharBuffer();

  private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
  private final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class);
  private final PositionIncrementAttribute posIncAtt = addAttribute(PositionIncrementAttribute.class);
  private final PositionLengthAttribute posLengthAtt = addAttribute(PositionLengthAttribute.class);

  public HogeTokenizer() {
  }

  public HogeTokenizer(AttributeFactory factory) {
    super(factory);
  }

  @Override
  public void close() throws IOException {
    super.close();
  }

  @Override
  public void reset() throws IOException {
    super.reset();
  }

  @Override
  public void end() throws IOException {
    super.end();
  }

  @Override
  public boolean incrementToken() throws IOException {
    return false;
  }
}

```

- `HogeTokenizerFactory`:

```auto
package hoge;

import org.apache.lucene.analysis.Tokenizer;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.env.Environment;
import org.elasticsearch.index.IndexSettings;
import org.elasticsearch.index.analysis.AbstractTokenizerFactory;

import hoge.HogeTokenizer;

public class HogeTokenizerFactory extends AbstractTokenizerFactory {

  public HogeTokenizerFactory(IndexSettings indexSettings, Environment env, String name, Settings settings) {
    super(indexSettings, settings);
  }

  @Override
  public Tokenizer create() {
    return new HogeTokenizer();
  }
}

```

- `plugin-descriptor.properties`:

```auto
description=Hoge analyzer
version=0.1.0
name=analysis-hoge
classname=hoge.AnalysisHogePlugin
java.version=1.8
elasticsearch.version=7.2.0
extended.plugins=
has.native.controller=false

```

Then, I ran `mvn package` and got a file `analysis-hoge-0.1.0.zip`, which contains

- `analysis-hoge-0.1.0.jar`,
- `plugin-descriptor.properties`.

Finally, when I ran `bin/elasticsearch-plugin install file:///path/to/analysis-hoge-0.1.0.zip` in the root directory of Elasticsearch-7.2.0, I got an error like:

```auto
$ bin/elasticsearch-plugin install file:///home/username/develop/analysis-hoge-0.1.0.zip
-> Downloading file:///home/username/develop/analysis-hoge-0.1.0.zip
[=================================================] 100%
Exception in thread "main" java.nio.file.NoSuchFileException: /home/username/develop/elasticsearch-7.2.0/plugins/.installing-4338817505847375416/plugin-descriptor.properties
	at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
	at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
	at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)
	at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:219)
	at java.base/java.nio.file.Files.newByteChannel(Files.java:373)
	at java.base/java.nio.file.Files.newByteChannel(Files.java:424)
	at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:420)
	at java.base/java.nio.file.Files.newInputStream(Files.java:158)
	at org.elasticsearch.plugins.PluginInfo.readFromProperties(PluginInfo.java:156)
	at org.elasticsearch.plugins.InstallPluginCommand.loadPluginInfo(InstallPluginCommand.java:714)
	at org.elasticsearch.plugins.InstallPluginCommand.installPlugin(InstallPluginCommand.java:793)
	at org.elasticsearch.plugins.InstallPluginCommand.install(InstallPluginCommand.java:776)
	at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:231)
	at org.elasticsearch.plugins.InstallPluginCommand.execute(InstallPluginCommand.java:216)
	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86)
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
	at org.elasticsearch.cli.MultiCommand.execute(MultiCommand.java:77)
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124)
	at org.elasticsearch.cli.Command.main(Command.java:90)
	at org.elasticsearch.plugins.PluginCli.main(PluginCli.java:47)

```

What is wrong? I found little information about creating Elasticsearch plugins on Google search, so I have no idea how I can fix it.

Please tell me why such an error occurs and how to fix it.

---

<div class="post-metadata">

**Author:** ![spinscale](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/spinscale/32/25011_2.png) [@spinscale](https://discuss.elastic.co/u/spinscale)\
**Post date:** [August 1, 2019, 12:40pm UTC](https://discuss.elastic.co/t/could-not-install-analysis-plugin-that-i-created/193070/2 "2019-08-01T12:40:51Z")

</div>

from a high level view this looks ok. Is there any chance you can create a github repo, so one can locally reproduce this?

I only use the gradle and the `esplugin` plugin, which simplifies building plugins a lot, thus my mvn experience is close to zero.

--Alex

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [August 29, 2019, 12:40pm UTC](https://discuss.elastic.co/t/could-not-install-analysis-plugin-that-i-created/193070/3 "2019-08-29T12:40:51Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
