Windows下编译Presto源码的坑

一、前言

最近在做将impala的C++代码转为presto的udaf的工作,对其他功能模块都进行测试之后,最后剩下对presto udaf的测试了,一般来说,都是通过presto-spi插件打包到presto的plugin目录下,重启presto进行测试,奈何这种效率比较低下,涉及到插件打包、重启presto、测试、修改、…可能写的时候写得好一下就成功了,开发过程中难免都会有一些问题,因此,这种方式不适合,在导师提醒下,去拉取公司仓库中的presto编译之后进行测试,就这个编译公司的presto就遇到很多的问题,几经波折,最后终于编译成功!下面将我重复两次之后的步骤总结下来供参考。
环境maven中的setting使用的默认下载的maven的setting,repository也是使用默认的。
Windows下编译Presto源码的坑

二、编译Presto

1、拉取presto源码 https://github.com/prestodb/presto.git

git clone https://github.com/prestodb/presto.git

2、先使用下面命令编译presto

mvn -DskipTests=true -am -pl presto-udf  clean package

参数解释:

-DskipTests :跳过测试
-am:构建指定模块,同时构建指定模块依赖的其他模块;
pl presto-udf:手动选择需要构建的项目,这里选择presto-udf
clean package:这个命令实际上做了很多步骤,总结为:清理-编译-打包

执行完之后,不出意外,你将会收到下面的结果:
Windows下编译Presto源码的坑

这个会不断执行下去,通过Ctrl+C强制退出执行,通过错误,我们可以发现,出现大量回车和换行的错误,且定位点在src/checkstyle/presto-checks.xmlRegexpMultiline: Line contains carriage return,在idea中找到这个位置,Ctrl+N
Windows下编译Presto源码的坑

然后注释掉这个地方再进行编译(上面报红不管,不影响):
Windows下编译Presto源码的坑

然后再次执行编译打包命令,这次我们加一点参数,方便快速进行:

mvn -T 4 -DskipTests=true -am -pl presto-udf  clean package

解释:-T 4表示四个线程执行。
此时不出意外收获下面的错误:

[ERROR] Failed to execute goal com.facebook.presto:presto-maven-plugin:0.3:generate-service-descriptor (default-generate-service-descriptor) on project presto-tpch: Execution default-ge
nerate-service-descriptor of goal com.facebook.presto:presto-maven-plugin:0.3:generate-service-descriptor failed: A required class was missing while executing com.facebook.presto:presto
-maven-plugin:0.3:generate-service-descriptor: com\facebook\presto\tpch\ColumnNaming (wrong name: com/facebook/presto/tpch/ColumnNaming)

这个错误主要是由插件presto-maven-plugin导致的,Presto使用presto-maven-plugin编译。在Window下编译失败原因是编译过程中类找不到,而且文件路径错了。这里Presto使用的presto-maven-plugin的版本为0.3,这个在这篇文章中找到了解决方案,那就是手动下载这个插件,进行修改后install到本地仓库中。
3、presto-maven-plugin插件修改替换

下载:别用上面那篇文章中给的github上拉取插件,因为那个作者进行了一些修改,因此我们在这里下载0.3版本的插件进行修改。

修改:修改ServiceDescriptorGenerator.java

String className = classPath.substring(0, classPath.length() - 6).replace('/', '.');

修改为:

String className = classPath.substring(0, classPath.length() - 6).replace(File.separatorChar, '.');

这是因为类名是通过把类路径的文件分隔符替换成 .来生成,Windows的分隔符是反斜杠 ** ,所以把 ‘/’ 替换成 File.separatorChar

打包到本地仓库:再将presto-maven-plugin打包到本地仓库中:

mvn clean install -DskipTests

Windows下编译Presto源码的坑

不出意外,之后再去进行presto的编译便可以成功了。

mvn -DskipTests=true -am  -pl presto-udf  clean package

Windows下编译Presto源码的坑

maven命令参考:

-h,--help                              Display help information
-am,--also-make                        构建指定模块,同时构建指定模块依赖的其他模块;
-amd,--also-make-dependents            构建指定模块,同时构建依赖于指定模块的其他模块;
-B,--batch-mode                        以批处理(batch)模式运行;
-C,--strict-checksums                  检查不通过,则构建失败;(严格检查)
-c,--lax-checksums                     检查不通过,则警告;(宽松检查)
-D,--define <arg>                      Define a system property
-e,--errors                            显示详细错误信息
-emp,--encrypt-master-password <arg>   Encrypt master security password
-ep,--encrypt-password <arg>           Encrypt server password
-f,--file <arg>                        使用指定的POM文件替换当前POM文件
-fae,--fail-at-end                     最后失败模式:Maven会在构建最后失败(停止)。如果Maven refactor中一个失败了,Maven会继续构建其它项目,并在构建最后报告失败。
-ff,--fail-fast                        最快失败模式: 多模块构建时,遇到第一个失败的构建时停止。
-fn,--fail-never                       从不失败模式:Maven从来不会为一个失败停止,也不会报告失败。
-gs,--global-settings <arg>            替换全局级别settings.xml文件(Alternate path for the global settings file)
-l,--log-file <arg>                    指定输出日志文件
-N,--non-recursive                     仅构建当前模块,而不构建子模块(即关闭Reactor功能)。
-nsu,--no-snapshot-updates             强制不更新SNAPSHOT(Suppress SNAPSHOT updates)
-U,--update-snapshots                  强制更新releases、snapshots类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖)
-o,--offline                           运行offline模式,不联网进行依赖更新
-P,--activate-profiles <arg>           激活指定的profile文件列表(用逗号[,]隔开)
-pl,--projects <arg>                   手动选择需要构建的项目,项目间以逗号分隔;A project can be specified by [groupId]:artifactId or by its relative path.
-q,--quiet                             安静模式,只输出ERROR
-rf,--resume-from <arg>                从指定的项目(或模块)开始继续构建
-s,--settings <arg>                    替换用户级别settings.xml文件(Alternate path for the user settings file)
-T,--threads <arg>                     Thread count, for instance 2.0C where C is core multiplied
-t,--toolchains <arg>                  Alternate path for the user toolchains file
-V,--show-version                      Display version information WITHOUT stopping build
-v,--version                           Display version information
-X,--debug                             输出详细信息,debug模式。
上一篇:kvm上的Linux虚拟机使用virtio磁盘


下一篇:大数据面试通关手册 | Presto原理&调优&面试&实战