[[java-api]] = Java API :ref: http://www.elastic.co/guide/en/elasticsearch/reference/master :version: 6.0.0-alpha1 [preface] == Preface This section describes the Java API that elasticsearch provides. All elasticsearch operations are executed using a <> object. All operations are completely asynchronous in nature (either accepts a listener, or returns a future). Additionally, operations on a client may be accumulated and executed in <>. Note, all the APIs are exposed through the Java API (actually, the Java API is used internally to execute them). == Maven Repository Elasticsearch is hosted on http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22elasticsearch%22[Maven Central]. For example, you can define the latest version in your `pom.xml` file: ["source","xml",subs="attributes"] -------------------------------------------------- org.elasticsearch.client transport {version} -------------------------------------------------- === Log4j 2 Logger You need to also include Log4j 2 dependencies: ["source","xml",subs="attributes"] -------------------------------------------------- org.apache.logging.log4j log4j-api 2.7 org.apache.logging.log4j log4j-core 2.7 -------------------------------------------------- And also provide a Log4j 2 configuration file in your classpath. For example, you can add in your `src/main/resources` project dir a `log4j2.properties` file like: ["source","properties",subs="attributes"] -------------------------------------------------- appender.console.type = Console appender.console.name = console appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%m%n rootLogger.level = info rootLogger.appenderRef.console.ref = console -------------------------------------------------- === Using another Logger If you want to use another logger than Log4j 2, you can use http://www.slf4j.org/[SLF4J] bridge to do that: ["source","xml",subs="attributes"] -------------------------------------------------- org.apache.logging.log4j log4j-to-slf4j 2.7 org.slf4j slf4j-api 1.7.21 -------------------------------------------------- http://www.slf4j.org/manual.html[This page] lists implementations you can use. Pick your favorite logger and add it as a dependency. As an example, we will use the `slf4j-simple` logger: ["source","xml",subs="attributes"] -------------------------------------------------- org.slf4j slf4j-simple 1.7.21 -------------------------------------------------- == Dealing with JAR dependency conflicts If you want to use Elasticsearch in your Java application, you may have to deal with version conflicts with third party dependencies like Guava and Joda. For instance, perhaps Elasticsearch uses Joda 2.8, while your code uses Joda 2.1. You have two choices: * The simplest solution is to upgrade. Newer module versions are likely to have fixed old bugs. The further behind you fall, the harder it will be to upgrade later. Of course, it is possible that you are using a third party dependency that in turn depends on an outdated version of a package, which prevents you from upgrading. * The second option is to relocate the troublesome dependencies and to shade them either with your own application or with Elasticsearch and any plugins needed by the Elasticsearch client. The https://www.elastic.co/blog/to-shade-or-not-to-shade["To shade or not to shade" blog post] describes all the steps for doing so. == Embedding jar with dependencies If you want to create a single jar containing your application and all dependencies, you should not use `maven-assembly-plugin` for that because it can not deal with `META-INF/services` structure which is required by Lucene jars. Instead, you can use `maven-shade-plugin` and configure it as follow: [source,xml] -------------------------------------------------- org.apache.maven.plugins maven-shade-plugin 2.4.1 package shade -------------------------------------------------- Note that if you have a `main` class you want to automatically call when running `java -jar yourjar.jar`, just add it to the `transformers`: [source,xml] -------------------------------------------------- org.elasticsearch.demo.Generate -------------------------------------------------- == Deploying in JBoss EAP6 module Elasticsearch and Lucene classes need to be in the same JBoss module. You should define a `module.xml` file like this: [source,xml] -------------------------------------------------- -------------------------------------------------- include::client.asciidoc[] include::docs.asciidoc[] include::search.asciidoc[] include::aggs.asciidoc[] include::query-dsl.asciidoc[] include::indexed-scripts.asciidoc[] include::admin/index.asciidoc[]