最近在做将impala的C++代码转为presto的udaf的工作,对其他功能模块都进行测试之后,最后剩下对presto udaf的测试了,一般来说,都是通过presto-spi插件打包到presto的plugin目录下,重启presto进行测试,奈何这种效率比较低下,涉及到插件打包、重启presto、测试、修改、…可能写的时候写得好一下就成功了,开发过程中难免都会有一些问题,因此,这种方式不适合,在导师提醒下,去拉取公司仓库中的presto编译之后进行测试,就这个编译公司的presto就遇到很多的问题,几经波折,最后终于编译成功!下面将我重复两次之后的步骤总结下来供参考。
环境:maven中的setting使用的默认下载的maven的setting,repository也是使用默认的。
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:这个命令实际上做了很多步骤,总结为:清理-编译-打包
执行完之后,不出意外,你将会收到下面的结果:
这个会不断执行下去,通过Ctrl+C
强制退出执行,通过错误,我们可以发现,出现大量回车和换行的错误,且定位点在src/checkstyle/presto-checks.xml
的RegexpMultiline: Line contains carriage return
,在idea中找到这个位置,Ctrl+N
然后注释掉这个地方再进行编译(上面报红不管,不影响):
然后再次执行编译打包命令,这次我们加一点参数,方便快速进行:
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
不出意外,之后再去进行presto的编译便可以成功了。
mvn -DskipTests=true -am -pl presto-udf clean package
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模式。