大佬教程收集整理的这篇文章主要介绍了如何使用 Gradle 导入库“Symja”才能与 Elasticsearch 服务器模块一起使用?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
对于一个项目,我想扩展 Elasticsearch,因此需要使用包 Symja。在 Symja 的 Github 中,提供了一个 manual for the usage with Maven。
由于 Elasticsearch 存储库是使用 Gradle 构建的,因此我还需要使用 Gradle 而不是 Maven。测试 suggested example Symja project,以下 build.gradle
(我基本上使用 gradle init
生成并稍作调整)完美地导入了库:
apply plugin: 'java'
apply plugin: 'maven-publish'
repositorIEs {
mavenLocal()
maven {
url = uri('https://oss.sonatype.org/content/repositorIEs/snapshots')
}
maven {
url = uri('https://repo.maven.apache.org/maven2/')
}
}
dependencIEs {
implementation 'org.matheclipse:matheclipse-core:1.0.0-SNAPSHOT'
}
publishing {
publications {
maven(MavenPublication) {
from(components.java)
}
}
}
现在,我想将 Symja 添加到我的 Elasticsearch fork 到 server
模块中。
但是,当我尝试构建它时,导入
import org.matheclipse.parser.clIEnt.SyntaxError;
import org.matheclipse.parser.clIEnt.math.MathException;
Symja 示例的 未检测到:java: package org.matheclipse.parser.clIEnt does not exist
。可能出了什么问题?
我更新后的 build.gradle
of the server
module 如下所示:
...
apply plugin: 'java'
apply plugin: 'maven-publish'
publishing {
publications {
...
maven(MavenPublication) {
from(components.java)
}
}
}
repositorIEs {
mavenLocal()
maven {
url = uri('https://oss.sonatype.org/content/repositorIEs/snapshots')
}
maven {
url = uri('https://repo.maven.apache.org/maven2/')
}
}
...
dependencIEs {
...
// Symja
implementation "org.matheclipse:matheclipse-core:1.0.0-SNAPSHOT"
...
}
...
编辑:
按照@axelclk 的建议添加implementation "org.matheclipse:matheclipse-frontend:1.0.0-SNAPSHOT"
之后,我的IDE 现在可以检测到这些包。虽然,如果我构建 build.gradle
(同时在 org.elasticsearch.index.query.boolqueryBuilder.java
中的方法中包含 Symja 示例),则会出现以下错误:
C:\{path here...}\elasticsearch\server\src\main\java\org\elasticsearch\index\query\BoolqueryBuilder.java:454: error: cAnnot access GcdRingElem
System.out.println("Out[2]: " + result.toString());
^
class file for edu.jas.structure.GcdRingElem not found
C:\{path here...}\elasticsearch\server\src\main\java\org\elasticsearch\index\query\BoolqueryBuilder.java:459: error: cAnnot access FIEldElement
System.out.println("Out[3]: " + result.toString());
^
class file for org.hipparchus.FIEldElement not found
似乎不知何故,toString
方法无法正常工作。此外,如果我使用 gradlew run -Dtests.es.xpack.security.enabled=false -Dtests.heap.size=1G
运行 Elasticsearch fork,构建将失败并显示以下输出:
> Configure project :modules:reindex
disabling reindex-from-old tests because we can't get the pID file on windows
> Configure project :plugins:repository-hdfs
hdfsFixture unsupported,please set HADOOP_HOME and put HADOOP_HOME\bin in PATH
> Configure project :x-pack:plugin:searchable-snapshots:qa:hdfs
hdfsFixture unsupported,please set HADOOP_HOME and put HADOOP_HOME\bin in PATH
=======================================
Elasticsearch Build Hamster says Hello!
Gradle Version : 6.8
OS Info : windows 10 10.0 (amd64)
JDK Version : 15 (OraclE)
JAVA_HOME : C:\Program files\Java\jdk-15.0.1
Random TesTing Seed : C5A79F8CABA0D6FA
In FIPS 140 mode : false
=======================================
> Task :server:compileJava
C:\{path here ...}\elasticsearch\server\src\main\java\org\elasticsearch\index\query\BoolqueryBuilder.java:454: error: cAnnot access GcdRingElem
System.out.println("Out[2]: " + result.toString());
^
class file for edu.jas.structure.GcdRingElem not found
C:\{path here ...}\elasticsearch\server\src\main\java\org\elasticsearch\index\query\BoolqueryBuilder.java:459: error: cAnnot access FIEldElement
System.out.println("Out[3]: " + result.toString());
^
class file for org.hipparchus.FIEldElement not found
Note: Some input files use or overrIDe a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors
> Task :server:compileJava Failed
FAILURE: Build Failed with an exception.
* what went wrong:
Execution Failed for task ':server:compileJava'.
> Compilation Failed; see the compiler error output for details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --deBUG option to get more log output. Run with --scan to get full insights.
* Get more Help at https://Help.gradle.org
BUILD Failed in 58s
228 actionable tasks: 8 executed,220 up-to-date
编辑 2:我按照@axelclk 的建议添加了 implementation "org.matheclipse:matheclipse-external:1.0.0-SNAPSHOT"
并将 @H_971_5@mavenLocal() 替换为 @H_971_5@mavenCentral(),这不会导致任何不同的结果。 >
编辑 3: 我再次添加了 - 根据@axelclk 的建议 - pom.xml
和 @H_971_5@matheclipse-external 的 @H_971_5@matheclipse-core 文件描述的实现:
...
// Symja
implementation "org.matheclipse:matheclipse-external:1.0.0-SNAPSHOT"
//implementation "org.apache.logging.log4j:log4j-core:2.13.2"
//implementation "org.apache.logging.log4j:log4j-API:2.13.2"
testImplementation "org.slf4j:slf4j-simple:1.7.25"
implementation "org.slf4j:log4j-over-slf4j:1.7.25"
//implementation "com.Google.guava:failureaccess:1.0.1"
//implementation "com.Google.guava:guava:30.1.1-jre"
implementation "com.fasterxml.jackson.core:jackson-databind:2.11.0"
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.0"
implementation "io.pebbletemplates:pebble:3.1.5"
implementation "org.jheaps:jheaps:0.13"
implementation "org.antlr:antlr4-runtime:4.8-1"
implementation "org.apache.commons:commons-text:1.8"
//testImplementation "junit:junit:4.13.1"
implementation "org.matheclipse:matheclipse-frontend:1.0.0-SNAPSHOT"
implementation "org.matheclipse:matheclipse-core:1.0.0-SNAPSHOT"
implementation "org.commonmark:commonmark:0.17.1"
implementation "org.commonmark:commonmark-ext-gfm-tables:0.17.1"
implementation "org.apfloat:apfloat:1.10.0-SNAPSHOT"
//implementation "org.apache.logging.log4j:log4j-core:2.13.2"
//implementation "org.apache.logging.log4j:log4j-API:2.13.2"
//testImplementation "org.slf4j:slf4j-simple:1.7.25"
//implementation "org.slf4j:log4j-over-slf4j:1.7.25"
implementation "org.hipparchus:hipparchus-core:1.8"
implementation "org.hipparchus:hipparchus-clustering:1.8"
implementation "org.hipparchus:hipparchus-fft:1.8"
implementation "org.hipparchus:hipparchus-fitTing:1.8"
implementation "org.hipparchus:hipparchus-ode:1.8"
implementation "org.hipparchus:hipparchus-optim:1.8"
implementation "org.hipparchus:hipparchus-stat:1.8"
//implementation "commons-codec:commons-codec:1.14"
implementation "org.apache.commons:commons-lang3:3.11"
implementation "com.Google.code.findBUGs:Jsr305:3.0.0"
implementation "org.logicng:logicng:2.0.2"
implementation "org.gavaghan:geodesy:1.1.3"
implementation "it.unimi.dsi:fastutil:8.5.2"
implementation "org.codehaus.janino:janino:3.1.3"
implementation "com.ibm.icu:icu4j:68.2"
implementation "com.univocity:univocity-parsers:2.8.4"
testImplementation "org.junit.jupiter:junit-jupiter-API:5.4.2"
testImplementation "org.junit.jupiter:junit-jupiter-ENGIne:5.4.2"
testImplementation "org.junit.vintage:junit-vintage-ENGIne:5.4.2"
//implementation "org.matheclipse:matheclipse-API:1.0.0-SNAPSHOT"
//implementation "org.matheclipse:matheclipse-io:1.0.0-SNAPSHOT"
//implementation "org.matheclipse:matheclipse-beakerx:1.0.0-SNAPSHOT"
...
现在,server
构建似乎可以工作了。但是,如果我现在使用 gradlew run -Dtests.es.xpack.security.enabled=false -Dtests.heap.size=1G
运行,则会有不同的任务失败:
> Configure project :modules:reindex
disabling reindex-from-old tests because we can't get the pID file on windows
> Configure project :plugins:repository-hdfs
hdfsFixture unsupported,please set HADOOP_HOME and put HADOOP_HOME\bin in PATH
=======================================
Elasticsearch Build Hamster says Hello!
Gradle Version : 6.8
OS Info : windows 10 10.0 (amd64)
JDK Version : 15 (OraclE)
JAVA_HOME : C:\Program files\Java\jdk-15.0.1
Random TesTing Seed : 266D7D1003A7C996
In FIPS 140 mode : false
=======================================
> Task :modules:kibana:bundlePlugin Failed
> Task :modules:ingest-user-agent:bundlePlugin Failed
> Task :modules:aggs-matrix-stats:bundlePlugin Failed
> Task :modules:ingest-common:bundlePlugin Failed
> Task :modules:lang-mustache:bundlePlugin Failed
> Task :modules:ingest-geoip:bundlePlugin Failed
> Task :modules:analysis-common:bundlePlugin Failed
> Task :modules:geo:bundlePlugin Failed
FAILURE: Build completed with 8 @R_783_4895@.
1: Task Failed with an exception.
-----------
* what went wrong:
...
* Get more Help at https://Help.gradle.org
BUILD Failed in 13s
204 actionable tasks: 9 executed,195 up-to-date
我觉得这很奇怪,因为我没有对 Elasticsearch fork 的这些部分进行任何更改。这里发生了什么?
编辑 4: 在 Elasticsearch 的“jar 地狱”功能出现一些问题后,我设法在 @IanGabes 的帮助下通过将 repositorIEs
添加到根的 { {1}}。
问题是,Symja 类似乎还没有工作。我有一个方法 build.gradle
目前执行以下操作:
normalize
该方法在 private voID normalize(String queryString) {
System.out.println("I'm here!");
String eString = "";
ExprEvaluator util = new ExprEvaluator(false,(short) 100);
IExpr e;
}
调用之前在 Elasticsearch 的 BoolqueryBuilder.doToquery()
中被调用。现在我正在addBooleanClauses
打POST
。正如预期的那样,有输出 Booleanquery
。之后,会发生以下情况:
"I'm here!"
我看不出这几个用于初始化 Symja 类的命令有什么危害。但是当我将它们注释掉时,一切正常,所以问题似乎出在这个地方。
以下依赖项目前包含在 ...
╗ [2021-04-19T22:54:29,779][INFO ][stdout ] [runTask-0] I'm here!
╗ [2021-04-19T20:54:30.497923300Z] [BUILD] StopPing node
=== Standard error of node `node{::runTask-0}` ===
╗ ? last 40 non error or warning messages from C:\{path...}\elasticsearch\build\testclusters\runTask-0\logs\es.stderr.log ?
╗ Fatal error in thread [elasticsearch[runTask-0][search][T#1]],exiTing
╗ @R_502_4126@.NoClassDefFoundError: com/Google/common/util/concurrent/UncheckedTimeoutException
╗ at org.elasticsearch.index.query.boolqueryBuilder.normalize(BoolqueryBuilder.java:440)
╗ at org.elasticsearch.index.query.boolqueryBuilder.doToquery(BoolqueryBuilder.java:332)
╗ at org.elasticsearch.index.query.AbstractqueryBuilder.toquery(AbstractqueryBuilder.java:103)
╗ at org.elasticsearch.index.query.SearchExecutionContext.lambda$toquery$3(SearchExecutionContext.java:464)
╗ at org.elasticsearch.index.query.SearchExecutionContext.toquery(SearchExecutionContext.java:476)
╗ at org.elasticsearch.index.query.SearchExecutionContext.toquery(SearchExecutionContext.java:463)
╗ at org.elasticsearch.search.Searchservice.parsesource(Searchservice.java:912)
╗ at org.elasticsearch.search.Searchservice.createContext(Searchservice.java:750)
╗ at org.elasticsearch.search.Searchservice.executequeryPhase(Searchservice.java:438)
╗ at org.elasticsearch.search.Searchservice$2.lambda$onResponse$0(Searchservice.java:406)
╗ at org.elasticsearch.action.ActionRunnable.lambda$supply$0(ActionRunnable.java:58)
╗ at org.elasticsearch.action.ActionRunnable$2.doRun(ActionRunnable.java:73)
╗ at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
╗ at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:44)
╗ at org.elasticsearch.common.util.concurrent.thReadContext$ContextPreservingAbstractRunnable.doRun(thReadContext.java:739)
╗ at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
╗ at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
╗ at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
╗ at java.base/@R_502_4126@.Thread.run(Thread.java:832)
╗ Caused by: java.lang.classnotFoundException: com.Google.common.util.concurrent.UncheckedTimeoutException
╗ at java.base/jdk.internal.loader.builTinClassLoader.loadClass(BuilTinClassLoader.java:606)
╗ at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
╗ at java.base/java.lang.classLoader.loadClass(ClassLoader.java:522)
╗ ... 19 more
> Task :run Failed
FAILURE: Build Failed with an exception.
* what went wrong:
Execution Failed for task ':run'.
> Elasticsearch cluster dIEd
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --deBUG option to get more log output. Run with --scan to get full insights.
* Get more Help at Help.gradle.org
BUILD Failed in 3m 34s
429 actionable tasks: 13 executed,416 up-to-date
中(或者分别注释掉,例如它们与不同模块的其他依赖项发生冲突):
gradle.build
@H_696_0@解决方法
为了完整起见,我想至少包含@axelclk 和@IanGabes 给出的解决方案的一部分。首先,似乎有必要手动添加所有隐式依赖项以及它们源自 to server
's build.gradle
的存储库,对应于 pom.xml
文件 of @H_971_5@matheclipse-core 和 of @H_971_5@matheclipse-external:>
...
apply plugin: 'java'
apply plugin: 'maven-publish'
publishing {
publications {
...
maven(MavenPublication) {
from(components.java)
}
}
}
repositories {
mavenCentral()
maven {
url = uri('https://oss.sonatype.org/content/repositories/snapshots')
}
maven {
url = uri('https://repo.maven.apache.org/maven2/')
}
}
...
// Symja
implementation "org.matheclipse:matheclipse-external:1.0.0-SNAPSHOT"
//implementation "org.apache.logging.log4j:log4j-core:2.13.2"
//implementation "org.apache.logging.log4j:log4j-api:2.13.2"
testImplementation "org.slf4j:slf4j-simple:1.7.25"
//implementation "org.slf4j:log4j-over-slf4j:1.7.25"
implementation "com.google.guava:failureaccess:1.0.1"
//implementation "com.google.guava:guava:30.1.1-jre"
//implementation "com.fasterxml.jackson.core:jackson-databind:2.11.0"
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.0"
implementation "io.pebbletemplates:pebble:3.1.5"
implementation "org.jheaps:jheaps:0.13"
//implementation "org.antlr:antlr4-runtime:4.8-1"
implementation "org.apache.commons:commons-text:1.8"
//testImplementation "junit:junit:4.13.1"
implementation "org.matheclipse:matheclipse-frontend:1.0.0-SNAPSHOT"
implementation "org.matheclipse:matheclipse-core:1.0.0-SNAPSHOT"
implementation "org.commonmark:commonmark:0.17.1"
implementation "org.commonmark:commonmark-ext-gfm-tables:0.17.1"
implementation "org.apfloat:apfloat:1.10.0-SNAPSHOT"
//implementation "org.apache.logging.log4j:log4j-core:2.13.2"
//implementation "org.apache.logging.log4j:log4j-api:2.13.2"
//testImplementation "org.slf4j:slf4j-simple:1.7.25"
//implementation "org.slf4j:log4j-over-slf4j:1.7.25"
implementation "org.hipparchus:hipparchus-core:1.8"
implementation "org.hipparchus:hipparchus-clustering:1.8"
implementation "org.hipparchus:hipparchus-fft:1.8"
implementation "org.hipparchus:hipparchus-fitTing:1.8"
implementation "org.hipparchus:hipparchus-ode:1.8"
implementation "org.hipparchus:hipparchus-optim:1.8"
implementation "org.hipparchus:hipparchus-stat:1.8"
//implementation "commons-codec:commons-codec:1.14"
implementation "org.apache.commons:commons-lang3:3.11"
implementation "com.google.code.findbugs:jsr305:3.0.0"
implementation "org.logicng:logicng:2.0.2"
implementation "org.gavaghan:geodesy:1.1.3"
implementation "it.unimi.dsi:fastutil:8.5.2"
implementation "org.codehaus.janino:janino:3.1.3"
//implementation "com.ibm.icu:icu4j:68.2"
implementation "com.univocity:univocity-parsers:2.8.4"
testImplementation "org.junit.jupiter:junit-jupiter-api:5.4.2"
testImplementation "org.junit.jupiter:junit-jupiter-ENGIne:5.4.2"
testImplementation "org.junit.vintage:junit-vintage-ENGIne:5.4.2"
...
不过,如上面的代码所示,一些依赖项被注释掉了。这是因为 Elasticsearch 有一个功能会因为 jar Hell
而引发构建错误,此时构建的其他部分已经使用了特定依赖项的另一个版本。
此外,由于 server
包依赖于其父包,因此需要将存储库添加到 subprojects
environment of elasticsearch
's build.gradle
中:
...
subprojects {
...
repositories {
mavenCentral()
maven {
url = uri('https://oss.sonatype.org/content/repositories/snapshots')
}
maven {
url = uri('https://repo.maven.apache.org/maven2/')
}
}
}
...
完成此操作后,当将示例添加到 server
模块内的现有 Elasticsearch 类时,会在我的 IDE(对我而言:IntelliJ IDEA)中检测到 Symja 示例的包。 (就我而言,我在包含 org.elasticsearch.index.query.boolQueryBuilder
的 Symja example 中调用了一个方法)。
如果我尝试使用例如构建/运行所有内容gradlew run -Dtests.es.xpack.security.enabled=false -Dtests.heap.size=1G
从我的 Elasticsearch 根目录开始,一切都完美地构建。也可以使用 PUT...
创建文档。在我的情况下,尝试运行 Boolean query (然后使用 Symja 调用添加的方法)更像是一个问题。在这种情况下,Elasticsearch 立即崩溃并显示以下输出:
...
╗ [2021-04-22T08:34:21.178673600Z] [BUILD] Stopping node
=== Standard error of node `node{::runTask-0}` ===
╗ ? last 40 non error or warning messages from C:\...\elasticsearch\build\testclusters\runTask-0\logs\es.stderr.log ?
╗ fatal error in thread [elasticsearch[runTask-0][search][T#1]],exiTing
╗ java.lang.NoClassDefFoundError: com/google/common/util/concurrent/UncheckedTimeoutException
...
> Task :run FAILED
FAILURE: Build failed with an exception.
* what went wrong:
Execution failed for task ':run'.
> Elasticsearch cluster died
...
BUILD FAILED in 7m 37s
429 actionable tasks: 19 executed,410 up-to-date
这是因为 Symja 在运行时依赖于 Guava 包的存在,需要从 build.gradle
中注释掉。一方面,无法使用 implementation
选项将 Guava 添加到任何包中,因为 Elasticsearch 在文件 gradle\forbidden-dependencies.gradle
中将其定义为“禁止依赖项”:
// we do not want any of @R_489_8270@ dependencies on the compilation classpath
// because they could then be used within Elasticsearch
List<String> FORBIDDEN_DEPENDENCIES = [
'guava'
]
...
另一方面,也无法通过 runtimeOnly "com.google.guava:guava:30.1.1-jre"
将其添加到 server
模块。这再次导致由于 jar Hell
导致构建失败,因为 Elasticsearch 的某些测试部分也以这种方式使用 Guava。尝试将版本调整为现有版本也是无效的。
总而言之,将 Symja 内容添加到 Elasticsearch 的 server
模块似乎不可能。在 Elastic Stack 社区中,声明如下:
[...] 您在依赖项等方面面临的问题是尝试向 server
添加内容的结果,如果您构建插件,则不会遇到该问题。
这似乎是最佳做法。我会走这条路,因为无论如何我的目标是创建一个插件。
更新:由于我设法安装了我正在编写的插件,因此使用上述工作流程非常有效(通过 runtimeOnly
包含 Guava 并使用 {{1} } 我的插件)。
以上是大佬教程为你收集整理的如何使用 Gradle 导入库“Symja”才能与 Elasticsearch 服务器模块一起使用?全部内容,希望文章能够帮你解决如何使用 Gradle 导入库“Symja”才能与 Elasticsearch 服务器模块一起使用?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。