
<a href="#_Toc20081%20">目錄 1</a>
<a href="#_Toc12233%20">1. 約定 1</a>
<a href="#_Toc15799%20">2. 安裝jdk 1</a>
<a href="#_Toc27331%20">3. 安裝maven 1</a>
<a href="#_Toc22797%20">4. 網絡配置 2</a>
<a href="#_Toc17%20">4.1. eclipse 3</a>
<a href="#_Toc32458%20">4.2. maven 3</a>
<a href="#_Toc2815%20">5. 從hbase官網下載下傳源代碼包: 4</a>
<a href="#_Toc25136%20">6. eclipse導入hbase源代碼 4</a>
<a href="#_Toc27234%20">7. 編譯hbase-thrift 6</a>
<a href="#_Toc25837%20">8. Problems opening an editor ... does not exist 10</a>
<a href="#_Toc18068%20">9. hbase-common 11</a>
確定機器可以正常通路Internet,如能正常通路https://repo.maven.apache.org等,如果是代理方式則需要設定好eclipse和maven的網絡配置。
本文環境為64位版本Windows7,jre安裝目錄為C:\java\jdk1.8.0_111,jdk安裝目錄為C:\java\jre1.8.0_111。
最好将jre安裝在在jdk目錄下,否則編譯時會遇到“Could not find artifact jdk.tools:jdk.tools:jar”錯誤。将jre安裝在jdk目錄下的目的是使得jre的上一級存在jdk的lib目錄。
略!安裝好後請設定環境變量JAVA_HOME為jdk的安裝目錄(不是javac所在的bin目錄,而是bin的上一級目錄)。
從maven官網下載下傳安裝包(本文下載下傳的是apache-maven-3.3.9-bin.zip):
<a href="https://maven.apache.org/download.cgi">https://maven.apache.org/download.cgi</a>
解壓後,将maven的bin目錄加入到環境變量PATH中,本文對應的目錄為C:\Program Files\apache-maven-3.3.9\bin。并設定環境變量M2_HOME的值為maven的安裝目錄,對于本文M2_HOME值為C:\Program Files\apache-maven-3.3.9
然後設定eclipse使用外部的maven,進入eclipse的Preferences中按下圖進行設定:
確定機器可以正常通路Internet,否則大量問題難以解決。如果是通過代理才能通路,則需要為eclipse和maven配置好代理。
編輯$HOME/.m2目錄下的settings.xml,如果不存在該檔案,則複制$MAVEN_HOME/conf目錄下的settings.xml,然後再修改即可同。
MAVEN_HOME為maven的安裝目錄,$HOME/.m2為repository的預設目錄,HOME為Windows使用者目錄,Windows7上假設使用者名為mike則HOME為C:\Users\mike。
假設代理伺服器的位址和端口分别為:proxy.oa.com和8080,則(不需要使用者名或密碼,則相應的值不設定即可):
http-proxy
true
http
proxy.oa.com
8080
local|127.0.0.1
https-proxy
https
以下網站均提供hbase源代碼包下載下傳:
<a href="http://mirrors.hust.edu.cn/apache/hbase/">http://mirrors.hust.edu.cn/apache/hbase/</a>
<a href="https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/">https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/</a>
<a href="http://mirror.bit.edu.cn/apache/hbase/">http://mirror.bit.edu.cn/apache/hbase/</a>
<a href="http://apache.fayea.com/hbase/">http://apache.fayea.com/hbase/</a>
本文下載下傳的是hbase-1.2.3-src.tar.gz。
本文使用的eclipse版本:
将hbase-1.2.3-src.tar.gz解壓,本文将其解壓到目錄E:\bigdata\hbase-1.2.3-src,然後以“Existing Maven Projects”方式導入:
成功導入後如下圖所示:
以maven編譯hbase源代碼,編譯整個hbase容易遇到錯誤,比如編譯hbase-common需要安裝bash,hbase-thrift、但hbase-server、hbase-client等子產品不依賴bash。為簡單體驗,先定一個小目标:編譯hbase-thrift子產品:
滑鼠右擊hbase-thrift,按下圖進入設定界面:
設定界面如下圖所示,并設定Goals為clean install -DskipTests(注意不是clean install,需要加上-DskipTests,否則即使勾選了Skip Tests也可能無效):
然後點選“Run”即開始編譯!
編譯過程中如遇到下面的錯誤,請确認是否存在目錄C:\java\jre1.8.0_111/../lib,其用意是jre安裝在jdk的目錄下,也就是說lib需要為jdk的lib目錄。
簡單的做法是複制jdk的lib目錄到C:\java目錄下。
[ERROR] Failed to execute goal on project hbase-thrift: Could not resolve dependencies for project org.apache.hbase:hbase-thrift:jar:1.2.3: Could not find artifact jdk.tools:jdk.tools:jar:1.8 at specified path C:\java\jre1.8.0_111/../lib/tools.jar -> [Help 1]
成功後如下圖所示:
在目錄E:\bigdata\hbase-1.2.3-src\hbase-thrift\target下可以看到編譯生成的jar檔案:
建議從國内鏡像安裝cgywin,會快很多,可用鏡像:
<a href="http://mirrors.163.com/cygwin/">http://mirrors.163.com/cygwin/</a>
<a href="http://www.cygwin.cn/pub/">http://www.cygwin.cn/pub/</a>
選擇從網際網路安裝,在“User URL”處輸入國内鏡像網址。
安裝好cygwin後,需将cgywin的bin目錄加入到環境變量PATH中,并需要重新開機eclipse才會生效。如果未安裝bash,則用同樣方法編譯hadoop-common時,會報如下錯誤:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.6:run (generate) on project hbase-common: An Ant BuildException has occured: Execute failed: java.io.IOException: Cannot run program "bash": CreateProcess error=2, 系統找不到指定的檔案。 -> [Help 1]
在eclipse裡用F3想進入某個類的某方法時,提示以下錯誤(Problems opening an editor Reason: [項目名] does not exist):
解決辦法(目的是生成“.project”和“.classpath”兩個eclipse需要的檔案):
按下圖所示,進入項目的根目錄,以hbase的hbase-thrift為例,如hbase-thrift所在目錄為E:\bigdata\hbase-1.2.3-src\hbase-thrift,注意不是E:\bigdata\hbase-1.2.3-src,然後執行:mvn eclipse:eclipse,成功後重新開機eclipse上述問題即解決(mvn eclipse:eclipse的作用是将maven項目轉化為eclipse項目,即生成兩個eclipse導入所需的配置檔案,并無其他改變,也就是生成eclipse需要的.project和.classpath兩個檔案):
其它諸于hbase-client、hbase-common、h base-server等同樣處理即可。
編譯hbase-common如遇到下述問題:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project hbase-common: Compilation failure: Compilation failure:
[ERROR] E:\bigdata\hbase-1.2.3-src\hbase-common\target\generated-sources\java\org\apache\hadoop\hbase\package-info.java:[5,39] 錯誤: 非法轉義符
[ERROR] E:\bigdata\hbase-1.2.3-src\hbase-common\target\generated-sources\java\org\apache\hadoop\hbase\package-info.java:[5,30] 錯誤: 未結束的字元串文字
[ERROR] E:\bigdata\hbase-1.2.3-src\hbase-common\target\generated-sources\java\org\apache\hadoop\hbase\package-info.java:[6,0] 錯誤: 需要class, interface或enum
[ERROR] E:\bigdata\hbase-1.2.3-src\hbase-common\target\generated-sources\java\org\apache\hadoop\hbase\package-info.java:[6,9] 錯誤: 需要class, interface或enum
[ERROR] -> [Help 1]
打開package-info.java:
/*
* Generated by src/saveVersion.sh
*/
@VersionAnnotation(version="1.2.3", revision="Unknown",
user="mooon\mike
", date="Tue Oct 25 18:02:39 2016", url="file:///cygdrive/e/bigdata/hbase-1.2.3-src",
srcChecksum="88f3dc17f75ffda6176faa649593b54e")
package org.apache.hadoop.hbase;
,可以看到問題出在“mike”後多了一個換行符,正常應當是:
user="mooon\mike", date="Tue Oct 25 18:02:39 2016", url="file:///cygdrive/e/bigdata/hbase-1.2.3-src",
檢視hadoop-common的saveVersion.sh,部分内容如下:
unset LANG
unset LC_CTYPE
version=$1
outputDirectory=$2
pushd .
cd ..
user=`whoami`
date=`date`
cwd=`pwd`
問題就出在whoami指令傳回了mooon\mike,并且mike後跟了一個換行符導緻的,是以可以如下消滅多餘的換行符:
user=`whoami|awk '{printf("%s",$1);}'`
再次編譯,仍然報錯:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project hbase-common: Compilation failure
再次打開package-info.java:
user="mooon\mike", date="Tue Oct 25 17:59:21 2016", url="file:///cygdrive/e/bigdata/hbase-1.2.3-src",
問題出在“mooon\mike”間的斜杠,需要将單個斜杠改成雙斜杠“mooon\\mike”或者幹脆去掉“mooon\”僅保留“mike”也可以。
再次修改saveVersion.sh,直接寫死user:
user=mike
然後再次編譯hadoop-common,終于成功了: