Запуск Solr с Maven
Solr — это поисковый сервер с открытым исходным кодом, созданный с использованием возможностей индексации и поиска Lucene Core , и его можно использовать для реализации масштабируемых поисковых систем практически с любым языком программирования.
Хотя у Solr есть много преимуществ, настройка среды разработки не входит в их число. Эта запись блога описывает, как мы можем запустить Solr с помощью Maven и убедиться, что каждый разработчик использует одну и ту же конфигурацию, схему и версию Solr.
Требования нашей сборки Maven следующие:
- Свойства нашей сборки Maven должны быть прочитаны из внешнего файла свойств. Единственное исключение из этого правила заключается в том, что номера версий зависимостей объявлены в нашем файле POM.
- Процесс сборки должен копировать файлы конфигурации Solr в правильный каталог при запуске нашего экземпляра Solr.
- Процесс сборки должен очистить файлы конфигурации, когда разработчик выполняет команду mvn clean из командной строки.
- Должно быть возможно запустить наш экземпляр Solr с помощью плагина Jetty Maven.
Мы можем выполнить эти требования, выполнив следующие действия:
- Создайте файл POM.
- Получите необходимые зависимости.
- Получите файлы конфигурации Solr.
- Создайте файл свойств, содержащий свойства, используемые в нашей сборке Maven.
- Отредактируйте файл solr.xml .
- Настройте плагин свойств Maven.
- Настройте плагин Copy Maven.
- Настройте плагин Jetty Maven.
Эти шаги описаны более подробно ниже.
Создание файла POM
Сначала нам нужно создать файл POM для проекта веб-приложения. Скелет нашего файла POM выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" < modelVersion >4.0.0</ modelVersion > < groupId >net.petrikainulainen.maven</ groupId > < artifactId >running-solr-with-maven</ artifactId > < packaging >war</ packaging > < version >0.1</ version > < profiles > <!-- Add profile configuration here --> </ profiles > < dependencies > <!-- Add dependencies here --> </ dependencies > < build > < finalName >solr</ finalName > <!-- Add filter configuration here --> <!-- Add resources configuration here --> < plugins > <!-- Add plugin configuration here --> </ plugins > </ build > </ project > |
Получение требуемых зависимостей
Единственная зависимость, которая нам нужна, это Solr 4.1.0 (война). Другими словами, единственное, что нам нужно сделать, это добавить следующее объявление зависимости в раздел зависимостей нашего файла POM:
1
2
3
4
5
6
|
< dependency > < groupId >org.apache.solr</ groupId > < artifactId >solr</ artifactId > < version >4.1.0</ version > < type >war</ type > </ dependency > |
Получение файлов конфигурации Solr
Мы можем получить файлы конфигурации Solr, выполнив следующие действия:
- Загрузите бинарный дистрибутив Solr 4.1.0 .
- Распакуйте загруженный пакет в нужный каталог.
- Перейдите в корневой каталог распакованного бинарного дистрибутива Solr.
- Скопируйте следующие файлы из каталога example / solr / collection1 / conf в каталог src / main / config : admin-extra.html, admin-extra-menu.menu-bottom.html, admin-extra.menu-top.hml , currency.xml, elevate.xml, mapping-FoldToASCII.txt, mapping-ISOLatin1Accent.txt, protwords.xml, schema.xml, solrconfig.xml, spellings.txt, stopwords.txt, synonyms.txt и update-script.js ,
- Скопируйте файлы конфигурации для конкретного языка, найденные в каталоге example / solr / collection1 / conf / lang, в директорию src / main / config / lang .
- Скопируйте макросы Velocity и другие файлы, найденные из каталога example / solr / collection1 / conf / speed, в директорию src / main / config / speed.
- Скопируйте таблицы стилей XSL, найденные из каталога example / solr / collection1 / conf / xslt, в директорию src / main / config / xslt .
- Скопируйте файл solr.xml из каталога exaple / solr / collection1 в каталог src / main / resources .
- Создайте каталог src / main / webapp / WEB-INF . Этот каталог необходим для запуска экземпляра Solr.
Теперь мы успешно получили необходимые файлы и готовы перейти к следующему этапу.
Создание файла свойств
Нашим следующим будет создание файла свойств, который используется в нашей сборке Maven, и добавление необходимой конфигурации профиля сборки в наш файл POM. Пойдем дальше и узнаем, как это делается.
Сначала мы создадим файл свойств, который используется в нашей сборке Maven. Мы можем сделать это, выполнив следующие действия:
- Создайте каталог с профилями / dev в корневом каталоге нашего проекта Maven.
- Создайте файл свойств config.properties в каталоге profile / dev .
Наш файл свойств имеет три свойства, которые описаны ниже:
- Свойство solr.detault.core.directory указывает значение основного каталога по умолчанию. Это каталог, который создается в домашнем каталоге нашего экземпляра Solr. В этом каталоге хранится конфигурация нашего экземпляра Solr и его данные.
- Свойство solr.default.core.name содержит имя ядра по умолчанию.
- Свойство solr.solr.home указывает домашний каталог нашей установки Solr.
Содержимое файла config.properties выглядит следующим образом:
1
2
3
4
5
6
7
8
9
|
#SOLR PROPERTIES #Configures the directory used to store the data and configuration of the Solr default core solr.default.core.directory=todo #Configures the name of the Solr default core. solr.default.core.name=todo #SYSTEM PROPERTIES #Configures the home directory of Solr. Set the preferred directory path here. solr.solr.home= |
Во-вторых, мы должны сконфигурировать профили сборки нашей сборки Maven и использовать фильтрацию для замены вместо переменных, включенных в наши ресурсы. Мы можем сделать это, выполнив следующие действия:
- Создайте отдельный профиль с именем dev и убедитесь, что это профиль по умолчанию для нашей сборки.
- Объявите свойство с именем build.profile.id и установите его значение равным «dev».
- Создайте фильтр, который считывает специфический для профиля файл конфигурации и заменяет переменные, найденные в наших ресурсах, фактическими значениями свойств.
Мы можем завершить шаги один и два, добавив следующее объявление профиля в наш файл POM:
1
2
3
4
5
6
7
8
9
|
< profile > < id >dev</ id > < activation > < activeByDefault >true</ activeByDefault > </ activation > < properties > < build.profile.id >dev</ build.profile.id > </ properties > </ profile > |
Мы можем завершить третий шаг, добавив следующий XML-код в раздел сборки нашего файла POM:
1
2
3
4
5
6
7
8
9
|
< filters > < filter >${project.basedir}/profiles/${build.profile.id}/config.properties</ filter > </ filters > < resources > < resource > < filtering >true</ filtering > < directory >src/main/resources</ directory > </ resource > </ resources > |
Редактирование файла solr.xml
Поскольку для настройки имени и каталога экземпляра ядра по умолчанию Solr мы используем специальный файл конфигурации профиля, мы должны внести изменения в файл solr.xml . Эти изменения описаны ниже:
- Значение свойства solr.default.core.name должно быть установлено в качестве значения атрибута defaultCoreNameAttribute элемента cores .
- Значение свойства solr.default.core.name должно быть установлено в качестве значения атрибута name основного элемента.
- Значение свойства solr.default.core.directory должно быть установлено в качестве значения атрибута instanceDir основного элемента.
Содержимое файла solr.xml выглядит следующим образом:
1
2
3
4
5
|
< solr persistent = "true" > < cores adminPath = "/admin/cores" defaultCoreName = "${solr.default.core.name}" host = "${host:}" hostPort = "${jetty.port:}" hostContext = "${hostContext:}" zkClientTimeout = "${zkClientTimeout:15000}" > < core name = "${solr.default.core.name}" instanceDir = "${solr.default.core.directory}" /> </ cores > </ solr > |
Настройка свойств Maven Plugin
Поскольку мы хотим, чтобы все значения свойств, используемые в нашем файле POM, читались из внешнего файла свойств, мы должны использовать плагин, называемый плагином Properties Maven . Мы можем настроить этот плагин, выполнив следующие действия:
- Убедитесь, что свойства читаются из конкретного файла конфигурации профиля.
- Создайте выполнение, которое выполняет цель read-project-properties плагина Properties Maven на этапе инициализации жизненного цикла Maven по умолчанию.
- Создайте выполнение, которое запускает цель свойств read-project плагина Properties Maven на этапе предварительной очистки чистого жизненного цикла Maven.
Конфигурация плагина Properties Maven выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
< plugin > < groupId >org.codehaus.mojo</ groupId > < artifactId >properties-maven-plugin</ artifactId > < version >1.0-alpha-2</ version > < configuration > < files > <!-- Properties are read from profile specific property file --> < file >${project.basedir}/profiles/${build.profile.id}/config.properties</ file > </ files > </ configuration > < executions > <!-- Load properties for the default lifecycle --> < execution > < id >default-lifecycle-properties</ id > < phase >initialize</ phase > < goals > < goal >read-project-properties</ goal > </ goals > </ execution > <!-- Load properties for the clean lifecycle --> < execution > < id >clean-lifecycle-properties</ id > < phase >pre-clean</ phase > < goals > < goal >read-project-properties</ goal > </ goals > </ execution > </ executions > </ plugin > |
Настройка модуля копирования Maven
Мы будем использовать плагин Copy Maven для двух целей:
- Мы копируем файлы конфигурации Solr в правильный каталог, когда запускаем наш экземпляр Solr.
- Мы удаляем файлы конфигурации Solr при выполнении команды mvn clean в командной строке.
Мы можем начать, добавив следующий XML в раздел плагинов нашего POM-файла:
1
2
3
4
5
6
7
8
|
< plugin > < groupId >com.github.goldin</ groupId > < artifactId >copy-maven-plugin</ artifactId > < version >0.2.5</ version > < executions > <!-- Add executions here --> </ executions > </ plugin > |
Давайте продолжим и узнаем, как мы можем настроить плагин Copy Maven для копирования и удаления файлов конфигурации Solr.
Копирование файлов конфигурации Solr
Мы можем скопировать файлы конфигурации Solr, выполнив следующие действия:
- Создайте выполнение, которое запускает цель копирования плагина Copy Maven на этапе компиляции жизненного цикла Maven по умолчанию.
- Скопируйте файл solr.xml в домашний каталог нашего экземпляра Solr. Убедитесь, что фильтрация свойств применяется к файлу при его копировании.
- Скопируйте найденные файлы из каталога src / main / config в каталог solr.solr.home / solr.default.core.directory / conf .
- Скопируйте файлы конфигурации для конкретного языка, найденные из каталога src / main / config / lang, в каталог solr.solr.home / solr.detault.core.directory / conf / lang .
- Скопируйте макросы Velocity и другие файлы, найденные из каталога src / main / config / speed, в каталог solr.solr.home / solr.detault.core.directory / conf / speed .
- Скопируйте таблицы стилей XSL, найденные из каталога src / main / config / xslt, в каталог solr.solr.home / solr.detault.core.directory / conf / xslt .
Конфигурация нашего исполнения выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
< execution > < id >copy-solr-config</ id > < phase >compile</ phase > < goals > < goal >copy</ goal > </ goals > < configuration > < resources > <!-- Copy solr.xml to correct directory and applies properties filtering to it. --> < resource > < directory >${project.basedir}/src/main/resources</ directory > < filtering >true</ filtering > < targetPath >${solr.solr.home}</ targetPath > < includes > < include >solr.xml</ include > </ includes > </ resource > <!-- Copy configuration files --> < resource > < directory >${project.basedir}/src/main/config</ directory > < targetPath >${solr.solr.home}/${solr.default.core.directory}/conf</ targetPath > < excludes > < exclude >lang</ exclude > < exclude >velocity</ exclude > < exclude >xslt</ exclude > </ excludes > </ resource > <!-- Copy language specific configuration files --> < resource > < directory >${project.basedir}/src/main/config/lang</ directory > < targetPath >${solr.solr.home}/${solr.default.core.directory}/conf/lang</ targetPath > </ resource > <!-- Copy Velocity macros and other files --> < resource > < directory >${project.basedir}/src/main/config/velocity</ directory > < targetPath >${solr.solr.home}/${solr.default.core.directory}/conf/velocity</ targetPath > </ resource > <!-- Copy XSL style sheets --> < resource > < directory >${project.basedir}/src/main/config/xslt</ directory > < targetPath >${solr.solr.home}/${solr.default.core.directory}/conf/xslt</ targetPath > </ resource > </ resources > </ configuration > </ execution > |
Удаление файлов конфигурации Solr
Мы можем удалить файлы конфигурации Solr, выполнив следующие действия:
- Создайте выполнение, которое запускает цель копирования плагина Copy Maven на этапе чистого жизненного цикла.
- Убедитесь, что сборка не завершится ошибкой, если каталоги не найдены.
- Удалите каталог оверлеев , созданный в корневой каталог нашего проекта Maven.
- Удалите найденный файл solr.xml из домашнего каталога нашего экземпляра Solr.
- Удалите каталог conf, найденный из каталога solr.solr.home / solr.default.core.directory .
Конфигурация нашего исполнения выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
< execution > < id >clean-solr</ id > < phase >clean</ phase > < goals > < goal >copy</ goal > </ goals > < configuration > < failIfNotFound >false</ failIfNotFound > < resources > <!-- Clean the overlays directory from the project root directory --> < resource > < clean >true</ clean > < cleanEmptyDirectories >true</ cleanEmptyDirectories > < directory >${project.basedir}/overlays</ directory > < includes > < include >**/**</ include > </ includes > </ resource > <!-- Remove the solr.xml file --> < resource > < clean >true</ clean > < directory >${solr.solr.home}</ directory > < includes > < include >solr.xml</ include > </ includes > </ resource > <!-- Remove the conf directory --> < resource > < clean >true</ clean > < cleanEmptyDirectories >true</ cleanEmptyDirectories > < directory >${solr.solr.home}/${solr.default.core.directory}</ directory > < includes > < include >conf</ include > </ includes > </ resource > </ resources > </ configuration > </ execution > |
Настройка подключаемого модуля Jetty Maven
Мы можем настроить плагин Jetty Maven для запуска нашего экземпляра Solr, выполнив следующие действия:
- Настройте Jetty для прослушивания порта 8983.
- Убедитесь, что системные свойства считываются из конкретного файла конфигурации профиля. Этот файл свойств содержит свойство solr.solr.home, которое указывает домашний каталог нашего экземпляра Solr.
- Укажите, что контекстный путь нашего приложения — / solr .
Конфигурация плагина Jetty Maven выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
< plugin > < groupId >org.mortbay.jetty</ groupId > < artifactId >jetty-maven-plugin</ artifactId > < version >8.1.8.v20121106</ version > < configuration > < stopPort >9966</ stopPort > < stopKey >stop</ stopKey > < connectors > <!-- Listen to port 8983 --> < connector implementation = "org.eclipse.jetty.server.nio.SelectChannelConnector" > < port >8983</ port > < maxIdleTime >60000</ maxIdleTime > </ connector > </ connectors > <!-- Read system properties from profile specific configuration file --> < systemPropertiesFile >${project.basedir}/profiles/${build.profile.id}/config.properties</ systemPropertiesFile > < webApp > < contextPath >/solr</ contextPath > </ webApp > </ configuration > </ plugin > |
Бегущий Солр
Теперь мы создали сборку Maven, которую можно использовать для запуска Solr в среде разработки. У нас есть два варианта запуска нашего экземпляра Solr:
- Мы можем выполнить mvn jetty: запустить команду в командной строке.
- Мы можем выполнить команду mvn jetty: run-war в командной строке.
После того, как мы запустили Solr, мы можем получить доступ к его интерфейсу администратора, используя следующий URL-адрес: http: // localhost: 8983 / solr .
Пример приложения доступен на Github . В этом примере используется пользовательская схема, потому что я планирую использовать ее в своем учебнике по Spring Data Solr. Исходная схема примера находится в каталоге etc.