[1] Компиляция исходного кода elasticsearch

Java программист анализ данных Elasticsearch облачные вычисления
[1] Компиляция исходного кода elasticsearch

Эта статья является первой в серии документов по анализу исходного кода elasticsearch. В этой статье кратко представлена ​​конструкция исходного кода elasticsearch в локальной среде компиляции.

Используемые инструменты: IntelliJ Idea, JDK1.8, gradle3.5, релизная версия elasticsearch-6.0.0-rc2.

скачать готов

Во-первых, скачайте основную версию elasticsearch с gihut.После импорта IDE я вижу, что многие зависимости отсутствуют, потому что проект не был скомпилирован с помощью gradle.

导入IDE后看到缺少很多包.png

Сначала проверьте текущую версию исходного кода elasticsearch. Вы можете увидеть ее в классе org.elasticsearch.Version#CURRENT. Вы можете видеть, что текущая основная версия — это версия 7.0.0-alpha1, но официальный выпуск этого веб-сайта версии его нет, и страница документации этой версии тоже Только что установилась, поэтому переключите код в ide на 6.0.0-rc2, потому что эта версия является версией, которую можно скачать на относительно новый релиз на официальном сайте , как показано ниже:

在ide中切换到6.0版本.png

После завершения перехода перейдите на официальный сайт, чтобы загрузить релизную версию 6.0.0-rc2, которая будет использоваться позже. Как показано ниже:

官网下载6.0.0-rc2的发行版.png

Поскольку инструмент компиляции по умолчанию в elasticsearch изменился с Maven на Gradle после версии 5.X. Среду Gradle необходимо настроить локально, и при необходимости можно переключить внутренний источник. Эта машина использует Gradle3.5 и JDK1.8 для компиляции elasticsearch. Рекомендуется, чтобы версия Gradle не была слишком высокой. Как показано ниже:

修改gradle仓库配置.png

начать компиляцию

Если вы сейчас запустите gradle idea в IDE (если IDE — это eclipse, команда будет gradle idea), вам будет предложено «идея gradle должна быть выполнена перед импортом», как показано ниже:

提示必须在导入idea之前执行gradle idea命令.png

cmd переключитесь в основной каталог и запустите команду gradle idea (поскольку используемая IDE — это idea, если IDE — Eclipse, используйте команду Gradle eclipse). Как показано ниже:

本地编译elasticsearch成功.png

Затем переключитесь в корневую директорию elasticsearch и запустите команду gradle idea.Если компиляция прошла успешно, она будет отображаться, как показано на рисунке:

在elasticsearch根目录下编译成功.png

После успешной компиляции запустите IDE, а идея будет долго настраивать градл.После завершения настройки просмотрите проект, как показано ниже, и вы можете в основном увидеть обзор проекта:

t-8编译好后导入IDE结果.png

путь запуска

Стартовый файл elasticsearch — elasticsearch. В файле упоминается path.conf, ищите в этом поле, чтобы найти в дистрибутиве rpm/src/main/packaging/init.d/, именно здесь инициализируется elasticsearch, а также здесь задаются некоторые параметры, такие как path.conf.

По сценарию запуска находим запись основного метода org.elasticsearch.bootstrap.Elasticsearch, который наследуется от класса EnvironmentAwareCommand, который в основном задает некоторые параметры и запускает программу. EnvironmentAwareCommand наследуется от класса Command, и отношение наследования выглядит следующим образом:

启动类的继承关系.png

Основной метод в Elasticsearch фактически вызывает основной метод Command.После создания перехватчика выключения этот метод настраивает ведение журнала и, наконец, выполняет метод mainWithoutErrorHandling, который, наконец, вызывает метод выполнения EnvironmentAwareCommand. Как показано ниже:

Command类中的main方法.png

Класс построения среды EnvironmentAwareCommand конструирует различные параметры elasticsearch через метод execute, такие как path.data, path.home, path.logs, а затем конструирует текущую конфигурацию через метод createEnv этого класса, как показано на рисунке:

EnvironmentAwareCommand类的execute方法.png

EnvironmentAwareCommand类的createEnv方法.png

В это время после запуска основного метода будет выдано сообщение об ошибке:

执行main方法后提示错误找不到es.path.conf.png

Глядя на исходный код, вы можете видеть, что es.path.conf передается в качестве параметра, как показано ниже:

t-11配置的Des.path.conf被作为参数传递.png

конфигурация параметров

На этом шаге используется только что загруженный пакет распространения elasticsearch, разархивируйте загруженный пакет распространения и в окне конфигурации Run/Debug Configurations настройте параметры параметров виртуальной машины следующим образом:

-Des.path.conf=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Des.path.home=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Dlog4j2.disable.jmx=true

Путь D:\idea\workspace\elasticsearch\distribution\src\main\resources — это путь для загрузки и распаковки дистрибутива.

После установки параметров заданное значение будет передано в качестве параметра в метод createEnv команды EnvironmentAwareCommand.

配置启用发行版的配置和插件运行.png

После настройки трех вышеуказанных параметров локальный запуск elasticsearch прочитает параметры, плагины и модули дистрибутива и успешно запустится.

Проблемы, возникающие в процессе эксплуатации

Могут быть проблемы с политикой безопасности java

доступ запрещен ("javax.management.MBeanTrustPermission" "зарегистрироваться") Решение состоит в том, чтобы создать новый файл политики Java elasticsearch.policy.

Содержание:

grant{
	permission javax.management.MBeanTruxtPermission "register";
	permission javax.management.MBeanServerPermission "createMBeanServer";
};

Затем добавьте параметр jvm:

-Djava.security.policy=/User/seymour/workspace/elasticsearch.policy
Может быть проблема с версией SNAPSHOT пакета jar в модуле

В методе readPolicy() класса org.elasticsearch.bootstrap.Security код определяет, что в данный момент запущена версия моментального снимка, но elasticsearch-rest-client-6.0.0-rc2.jar в дистрибутиве, который мы скачали и распаковали Это выпускная версия. Измените имя пакета jar на версию моментального снимка (elasticsearch-rest-client-6.0.0-rc2-SNAPSHOT), и он сможет нормально работать, как показано ниже:

jar包版本问题.png

запустить успешно

После успешного запуска вы можете протестировать его с помощью адреса 127.0.0.1:9200. После успешного завершения теста вы можете отладить код.

成功运行.png