关于将 Elasticsearch 编译成 JAR 的问题,就像它是如何在 Maven 存储库中完成的一样
Question on Compile Elasticsearch into a JAR like how it was done in the Maven repository
我有一个 Maven 项目,我在其中使用了 Elasticsearch 的很多功能。更具体地说,它是这样导入的:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.10</version>
</dependency>
现在我正在对 Elasticsearch 源代码进行一些调整以获得一些额外的功能,我已经使用 ./gradlew assemble
编译了我的代码并在 Maven 中从 ES_SOURCE_CODE_FOLDER/core/build/distributions/elasticsearch-5.6.10-SNAPSHOT.jar
导入了编译的 jar通过指定 systemPath
和 scope
(目前,我知道这不是人们实际会做的,只是为了测试我的实现):
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.10</version>
<scope>system</scope>
<systemPath>/Users/hatsuyukisakura/elasticsearch/core/build/distributions/elasticsearch-5.6.10-SNAPSHOT.jar</systemPath>
</dependency>
但是我意识到在我这样做之后,我无法再编译我的程序,因为以下导入不再有效:
import org.apache.lucene.index.Fields;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.queryparser.flexible.standard.QueryParserUtil;
我的问题是,我是否以错误的方式编译了 Elasticsearch?我应该如何以与在 Maven 存储库中编译的方式相同的方式编译它,以便我仍然可以从 org.apache.lucene
获得我的导入工作?
如果需要这些信息:
我对 Elasticsearch 代码的更改非常有限,基于 857bfc2ac43ae3986197aeb2177ab5ff87d9f3b4
的一个分支,它的版本号仍然是 5.6.10。
我的工作环境是:
$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_212-b03)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.212-b03, mixed mode)
$ mvn --version
[MVNVM] Using maven: 3.5.2
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00:58:13-07:00)
Maven home: /Users/hatsuyukisakura/.mvnvm/apache-maven-3.5.2
Java version: 1.8.0_212, vendor: AdoptOpenJDK
Java home: /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.13.6", arch: "x86_64", family: "mac"
$ gradle --version
------------------------------------------------------------
Gradle 4.7
------------------------------------------------------------
Build time: 2018-04-18 09:09:12 UTC
Revision: b9a962bf70638332300e7f810689cb2febbd4a6c
Groovy: 2.4.12
Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM: 1.8.0_212 (AdoptOpenJDK 25.212-b03)
OS: Mac OS X 10.13.6 x86_64
我无法评论从源代码编译 ElasticSearch 的方式,Based on this information它看起来像你的轨道。
但是,我可以告诉你,如果在你想出一个自定义分布之后,在 maven 中添加了一个依赖项并且发现 org.apache.lucene.index.Fields
(例如)没有找到,最好的方法是使用 Winzip/Winrar 或任何其他可以打开 Zip 文件的程序打开工件本身(因为 jar 基本上是一个 zip),并确保文件 org.apache.lucene.index.Fields
确实存在。
如果它在那里,那么你的 maven 定义有问题,这里很多事情都可能出错,例如,如果你在 linux 上生成文件的权限或者可能与其他依赖项发生冲突(你可以将 mvn help:effective-pom
用于 Maven 实际决定选择的依赖项)
如果不存在,则 Elasticsearch 编译过程中出现问题。
@Mark Bramnik 在后续部分的回答是正确的,这是由传递依赖引起的。
只是删除系统并不能解决问题,我需要执行以下操作:
mvn install:install-file \
-Dfile=/Users/hatsuyukisakura/elasticsearch/core/build/distributions/elasticsearch-5.6.10-SNAPSHOT.jar \
-DgroupId=org.elasticsearch \
-DartifactId=elasticsearch \
-Dversion=5.6.10-X \
-Dpackaging=jar \
-DpomFile=/Users/hatsuyukisakura/elasticsearch/core/build/distributions/elasticsearch-5.6.10-SNAPSHOT.pom
然后使用
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.10-X</version>
</dependency>
相反
我有一个 Maven 项目,我在其中使用了 Elasticsearch 的很多功能。更具体地说,它是这样导入的:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.10</version>
</dependency>
现在我正在对 Elasticsearch 源代码进行一些调整以获得一些额外的功能,我已经使用 ./gradlew assemble
编译了我的代码并在 Maven 中从 ES_SOURCE_CODE_FOLDER/core/build/distributions/elasticsearch-5.6.10-SNAPSHOT.jar
导入了编译的 jar通过指定 systemPath
和 scope
(目前,我知道这不是人们实际会做的,只是为了测试我的实现):
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.10</version>
<scope>system</scope>
<systemPath>/Users/hatsuyukisakura/elasticsearch/core/build/distributions/elasticsearch-5.6.10-SNAPSHOT.jar</systemPath>
</dependency>
但是我意识到在我这样做之后,我无法再编译我的程序,因为以下导入不再有效:
import org.apache.lucene.index.Fields;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.queryparser.flexible.standard.QueryParserUtil;
我的问题是,我是否以错误的方式编译了 Elasticsearch?我应该如何以与在 Maven 存储库中编译的方式相同的方式编译它,以便我仍然可以从 org.apache.lucene
获得我的导入工作?
如果需要这些信息:
我对 Elasticsearch 代码的更改非常有限,基于 857bfc2ac43ae3986197aeb2177ab5ff87d9f3b4
的一个分支,它的版本号仍然是 5.6.10。
我的工作环境是:
$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_212-b03)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.212-b03, mixed mode)
$ mvn --version
[MVNVM] Using maven: 3.5.2
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00:58:13-07:00)
Maven home: /Users/hatsuyukisakura/.mvnvm/apache-maven-3.5.2
Java version: 1.8.0_212, vendor: AdoptOpenJDK
Java home: /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.13.6", arch: "x86_64", family: "mac"
$ gradle --version
------------------------------------------------------------
Gradle 4.7
------------------------------------------------------------
Build time: 2018-04-18 09:09:12 UTC
Revision: b9a962bf70638332300e7f810689cb2febbd4a6c
Groovy: 2.4.12
Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM: 1.8.0_212 (AdoptOpenJDK 25.212-b03)
OS: Mac OS X 10.13.6 x86_64
我无法评论从源代码编译 ElasticSearch 的方式,Based on this information它看起来像你的轨道。
但是,我可以告诉你,如果在你想出一个自定义分布之后,在 maven 中添加了一个依赖项并且发现 org.apache.lucene.index.Fields
(例如)没有找到,最好的方法是使用 Winzip/Winrar 或任何其他可以打开 Zip 文件的程序打开工件本身(因为 jar 基本上是一个 zip),并确保文件 org.apache.lucene.index.Fields
确实存在。
如果它在那里,那么你的 maven 定义有问题,这里很多事情都可能出错,例如,如果你在 linux 上生成文件的权限或者可能与其他依赖项发生冲突(你可以将 mvn help:effective-pom
用于 Maven 实际决定选择的依赖项)
如果不存在,则 Elasticsearch 编译过程中出现问题。
@Mark Bramnik 在后续部分的回答是正确的,这是由传递依赖引起的。
只是删除系统并不能解决问题,我需要执行以下操作:
mvn install:install-file \
-Dfile=/Users/hatsuyukisakura/elasticsearch/core/build/distributions/elasticsearch-5.6.10-SNAPSHOT.jar \
-DgroupId=org.elasticsearch \
-DartifactId=elasticsearch \
-Dversion=5.6.10-X \
-Dpackaging=jar \
-DpomFile=/Users/hatsuyukisakura/elasticsearch/core/build/distributions/elasticsearch-5.6.10-SNAPSHOT.pom
然后使用
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.10-X</version>
</dependency>
相反