場景:重構spark 2.1版本的sql語法。因此 需要使用antlr;
前期准備:idea安裝了antlr插件(antlr的4.7.2版本)
因此在maven工程中添加了antlr的依賴:
<dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>4.7.2</version> </dependency>
同事在mac的環境下也配置了antlr4.7.2的環境變量
#export CLASSPATH=".:/usr/local/lib/antlr-4.7-complete.jar:$CLASSPATH"
#export CLASSPATH=".;%JAVA_HOME%\jre\lib\rt.jar;/usr/local/lib/antlr-4.7-complete.jar:$CLASSPATH"
#alias antlr4='java -jar /usr/local/lib/antlr-4.7-complete.jar'
#alias grun='java org.antlr.v4.gui.TestRig'
一切工作准備就緒,使用idea運行重構好的spark sql,在編譯期出現如下錯誤:
ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.2ANTLR:
錯誤的認為是:
<dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> </dependency>
點擊進入依賴,看當前antlr4的底層的依賴:
<plugin> <groupId>org.antlr</groupId> <artifactId>antlr4-maven-plugin</artifactId> <version>4.5.3</version> <!-- use older version to process XPathLexer.g4, avoiding cyclic build dependency --> <executions> <execution> <id>antlr</id> <configuration> <sourceDirectory>src</sourceDirectory> </configuration> <goals> <goal>antlr4</goal> </goals> </execution> </executions> </plugin>
這樣就能對上錯誤問題了,因為使用4.7.2生成的代碼。但是在編譯期間是4.5.3;所以出錯了
錯誤的解決:
將4.5.3改成4.7即可
##############################真實的原因######################################################
spark 2.1版本,支持的antlr是4.5.3.可以下載spark源碼,查看maven依賴
由以上可以推斷出錯誤的原因大致是因為spark 2.1版本目前還不支持antlr4.7.2
解決:
修改antlr環境變量,改成antlr4.5.3版本
export CLASSPATH=".:/usr/local/lib/antlr-4.5.3-complete.jar:$CLASSPATH"
alias antlr4='java -Xmx500M -cp "/usr/local/lib/antlr-4.5.3-complete.jar:$CLASSPATH" org.antlr.v4.Tool'
alias grun='java org.antlr.v4.runtime.misc.TestRig'
然后卸載掉idea的antlr插件;
(https://www.cnblogs.com/niutao/)
這樣重新基於antlr生成代碼后,就可以正常運行了