文章目录
Easticsearch从0学到1之源码阅读环境搭建
本文选择的是elasticsearch6.4.2版本的
前提环境
jdk11(依据elasticsearch的版本而定),目前Oracle官网只能下载jdk8和11,这两个版本目前是长期支持的版本。jdk10也行
gradle 4.9(elasticsearch是使用gradle构建的)http://services.gradle.org/distributions/
elasticsearch6.4(github上拉取源码,以及下载对应的发布版)
如果是在windows,建议系统为专业版以上,家庭版好像是无法创建pid文件
直接从github上clone会非常慢,建议在码云上创建个elasticsearch的项目,然后把在github上的项目导入到码云上,这样会速度比较快。如图1-1所示。
图1-1
修改部分配置
修改全局Maven仓库地址
提前安装好gradle。在USER_HOME/.gradle/下面创建新文件 init.gradle,输入下面的内容并保存。
allprojects{
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/'
all {
ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://repo.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
remove repo
}
}
}
maven {
url REPOSITORY_URL
}
}
}
其中USER_HOME/.gradle/
是自己的gradle安装目录,示例值:C:\Users\Administrator\.gradle
,
如果没有.gradle目录,可用自己创建,或者先执行 编译源码 ,等gradle安装后再回来修改。
上面脚本把url匹配到的仓库都替换成了阿里云的仓库(如果不修改,访问国外的网址会很慢,甚至不成功)。
gradle编译源码
拷贝文件
将下载的gradle-4.9-all.zip包放到 elasticsearch\gradle\wrapper 目录下, 与 elasticsearch\gradle\wrapper\gradle-wrapper.properties 在同级目录,再修改 elasticsearch\gradle\wrapper\gradle-wrapper.properties 配置如下:
distributionUrl=gradle-4.9-all.zip
windows运行cmd,进入DOS命令行,然后切换到elasticsearch源码的根目录,执行如下命令,把elasticsearch编译为 idea 工程:
gradlew idea
编译失败则按照错误信息解决问题,可用使用如下命令帮助定位问题:
gradlew idea -info
gradlew idea -debug
一般是Maven仓库地址不可用导致jar包无法下载,从而编译失败,此时请修改相关的仓库地址。
编译成功后打印日志:
BUILD SUCCESSFUL in 1m 23s
导入elasticsearch项目到idea
需要的参数
VM options
-Des.path.home=E:\eshome -Des.path.conf=E:\eshome\config -Xms1g -Xmx1g -Dlog4j.disable.jmx=true -Djava.security.policy=E:\eshome\config\elasticsearch.policy
复制modules plugins config 到eshome目录下,可以选择从对应版本的官方二进制包中复制
参数 | 说明 |
---|---|
-Des.path.home | 指定eshome目录所在路径名 |
-Des.path.conf | 指定配置文件所在路径 |
-Xms1g | 设置JVM初始堆内存大小为1G |
-Xmx1g | 设置JVM最大允许分配的堆内存大小为1G |
-Dlog4j.disable.jmx=true | 这个是jvm.options文件中的默认配置,不加会报“access denied”等错误。但在IDE中启动elasticsearch不会加载jvm.options文件,这个文件是在Elasticsearch的启动脚本elasticsearch、elasticsearch.bat中加载的 |
-Djava.security.policy | 同样是权限问题(不配置的话部分环境环境变量上会遇到access denied问题),配置policy文件路径,policy文件内容如下: |
eshome/config/elasticsearch.policy
grant{
permission javax.management.MBeanTruxtPermission "register";
permission javax.management.MBeanServerPermission "createMBeanServer";
permission java.lang.RuntimePermission "createClassLoader";
} ;
可以复制发布版的 config modules plugins (elasticsearch启动时需要加载这几个目录,找到相应配置
)到eshome下面
报错
[2019-07-14T09:24:58,207][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [] fatal error in thread [main], exiting
java.lang.NoClassDefFoundError: org/elasticsearch/plugins/ExtendedPluginsClassLoader
at org.elasticsearch.plugins.PluginsService.loadBundle(PluginsService.java:538) ~[main/:?]
at org.elasticsearch.plugins.PluginsService.loadBundles(PluginsService.java:464) ~[main/:?]
at org.elasticsearch.plugins.PluginsService.<init>(PluginsService.java:156) ~[main/:?]
at org.elasticsearch.node.Node.<init>(Node.java:315) ~[main/:?]
at org.elasticsearch.node.Node.<init>(Node.java:256) ~[main/:?]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:213) ~[main/:?]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:213) ~[main/:?]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:326) ~[main/:?]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[main/:?]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:127) ~[main/:?]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[main/:?]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[main/:?]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[main/:?]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) ~[main/:?]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:86) ~[main/:?]
Caused by: java.lang.ClassNotFoundException: org.elasticsearch.plugins.ExtendedPluginsClassLoader
at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[?:?]
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[?:?]
... 15 more
解决办法:
参考资料
[1] JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止https://blog.csdn.net/u013256816/article/details/50417822
[2] Java安全——安全管理器、访问控制器和类装载器 SecurityManager https://blog.csdn.net/wwwdc1012/article/details/82287474
[3] 渣渣菜鸡的 ElasticSearch 源码解析 —— 环境搭建https://www.jianshu.com/p/a9f66ea2c84a
[4] 教你编译调试Elasticsearch 6.3.2源码https://blog.csdn.net/wwwdc1012/article/details/81978966