关于将 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通过指定 systemPathscope(目前,我知道这不是人们实际会做的,只是为了测试我的实现):

        <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>

相反