编译hbase-1.2.3源代码
目录
8. Problems opening an editor ... does not exist 10
1. 约定
确保机器可以正常访问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目录。
2. 安装jdk
略!安装好后请设置环境变量JAVA_HOME为jdk的安装目录(不是javac所在的bin目录,而是bin的上一级目录)。
3. 安装maven
从maven官网下载安装包(本文下载的是apache-maven-3.3.9-bin.zip):
https://maven.apache.org/download.cgi
解压后,将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中按下图进行设置:
4. 网络配置
确保机器可以正常访问Internet,否则大量问题难以解决。如果是通过代理才能访问,则需要为eclipse和maven配置好代理。
4.1. eclipse
4.2. 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,则(不需要用户名或密码,则相应的值不设置即可):
<proxy> <id>http-proxy</id> <active>true</active> <protocol>http</protocol> <username></username> <password></password> <host>proxy.oa.com</host> <port>8080</port> <nonProxyHosts>local|127.0.0.1</nonProxyHosts> </proxy> <proxy> <id>https-proxy</id> <active>true</active> <protocol>https</protocol> <username></username> <password></password> <host>proxy.oa.com</host> <port>8080</port> <nonProxyHosts>local|127.0.0.1</nonProxyHosts> </proxy> |
5. 从hbase官网下载源代码包:
以下网站均提供hbase源代码包下载:
http://mirrors.hust.edu.cn/apache/hbase/
https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/
http://mirror.bit.edu.cn/apache/hbase/
http://apache.fayea.com/hbase/
本文下载的是hbase-1.2.3-src.tar.gz。
6. eclipse导入hbase源代码
本文使用的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模块:
7. 编译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文件:
然后可以编译hbase-client,如果需要编译hadoop-common则需要安装bash先,也就是得安装cygwin(https://cygwin.com/install.html)。
建议从国内镜像安装cgywin,会快很多,可用镜像:
http://mirrors.163.com/cygwin/
选择从互联网安装,在“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] |
8. Problems opening an editor ... does not exist
在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等同样处理即可。
1. hbase-common
编译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”后多了一个换行符,正常应当是:
/* * 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; |
查看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后跟了一个换行符导致的,因此可以如下消灭多余的换行符:
unset LANG unset LC_CTYPE version=$1 outputDirectory=$2 pushd . cd .. user=`whoami|awk '{printf("%s",$1);}'` date=`date` cwd=`pwd` |
再次编译,仍然报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project hbase-common: 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] -> [Help 1] |
再次打开package-info.java:
/* * Generated by src/saveVersion.sh */ @VersionAnnotation(version="1.2.3", revision="Unknown", user="mooon\mike", date="Tue Oct 25 17:59:21 2016", url="file:///cygdrive/e/bigdata/hbase-1.2.3-src", srcChecksum="88f3dc17f75ffda6176faa649593b54e") package org.apache.hadoop.hbase; |
问题出在“mooon\mike”间的斜杠,需要将单个斜杠改成双斜杠“mooon\\mike”或者干脆去掉“mooon\”仅保留“mike”也可以。
再次修改saveVersion.sh,直接写死user:
unset LANG unset LC_CTYPE version=$1 outputDirectory=$2 pushd . cd .. user=mike date=`date` cwd=`pwd` |
然后再次编译hadoop-common,终于成功了:
编译hbase-1.2.3源代码的更多相关文章
- 如何编译Apache Hadoop2.6.0源代码
如何编译Apache Hadoop2.6.0源代码 1.安装CentOS 我使用的是CentOS6.5,下载地址是http://mirror.neu.edu.cn/centos/6.5/isos/x8 ...
- 编译Apache Hadoop2.2.0源代码
Hadoop2的学习资料很少,只有官网的少数文档.如果想更深入的研究hadoop2,除了仅看官网的文档外,还要学习如何看源码,通过不断的调试跟踪源码,学习hadoop的运行机制. 1.安装CentOS ...
- 【转】在Ubuntu上下载、编译和安装Android最新源代码
原文网址:http://blog.csdn.net/luoshengyang/article/details/6559955 看完了前面说的几本书之后,对Linux Kernel和Android有一定 ...
- 在Ubuntu上下载、编译和安装Android最新源代码
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6559955 看完了前面说的几本书之后,对Lin ...
- Android:基于Eclipse编译调试系统级应用源代码
一. 概要描述 在使用Eclipse导入android工程源代码以后,我们可以使用ddms调试和跟踪源代码. 本文讲述动态调试源代码和静态调试源代码的两种方法,避免build system. ...
- 通常编译亲测56Y国际象棋源代码,精仿56Y国际象棋完整的源代码下载!
今天公布亲测通常应编译56Y国际象棋源代码,精仿56Y牌源代码.喜欢的能够拿去研究.论坛资源太多.我们会把好的资源都公布出来,同一时候欢迎很多其它的程序猿增加我们! 增加我们的共同学习交流! ...
- 如何编译Apache Hadoop2.2.0源代码
转自(原文图片已丢失,本文修复图片,重新排版,并更正部分原文错误):http://www.superwu.cn/2013/12/26/913 欢迎和大家交流技术相关问题: 邮箱: jiangxinnj ...
- JD-GUI反编译jar包为Java源代码
程序员难免要借鉴其他java工程的代码.可有时只能拿到.calss文件,jar包或者war包,这个时候要求程序员能熟练的将这些类型文件反编译为Java代码并形成可编译运行的项目.本文介绍的反编译工具是 ...
- eclipse编译hbase 1.3.1(转)
https://yq.aliyun.com/articles/59830 ,晚上回去试试...
随机推荐
- mongodb基础学习11-复制集和分片结合使用
实际的使用中复制集和分片是结合使用的,即一个分片由一个复制集构成,多个分片存储数据库的数据 调用脚本启动两个复制集 启动configsvr的节点 启动mongos 增加分片,这次要加上复制集的id,节 ...
- state介绍
state是salt最核心的功能,通过预先定制好的sls(salt state file)文件对被控主机进行状态管理,支持包括程序包(pkg).文件(file).网络配置(network).系统服务( ...
- 关于Git的礼节
(这里的内容本来是<怎样尊重一个程序员>的一小节,但由于Git的使用引起了很普遍的不尊重程序员的现象,现在特别将这一节提出来单独成文.) Git是现在最流行的代码版本控制工具.用外行话说, ...
- Python的logging,记录log的包
最近在做自动化测试时,想给他加上日志,所以用到logging的模块,以下是python增加log的几种方式 一.python代码配置方式(当然还有一种是可以多模块通用的一个python代码设置,这个网 ...
- Java的Reflection机制
什么时候使用Reflection: 在java语言中,创建一个类的对象通常使用new operator,但是如果预先不知道Class的名字,类名是在程序运行过程中通过参数传递过来,就没法使用这种方法了 ...
- [leetcode]159. Longest Substring with At Most Two Distinct Characters至多包含两种字符的最长子串
Given a string s , find the length of the longest substring t that contains at most 2 distinct char ...
- 6-Linux 上mysql的常用命令 以及 tomcat的相关指定
mysql -u root -p 进入Mysql //注意一下有逗号!!! show databases; //显示所有的数据库 drop database mydb; // 删除mydb这个数据库 ...
- 遍历XML文件
#encoding=utf-8 from xml.etree import ElementTree as ET #要找出所有人的年龄 per=ET.parse('d:\\1.xml') p=per.f ...
- final修饰符:
知识点: 1.final关键字用于修饰类.变量和方法 2.有点类似C#里的 sealed 关键字,用于表示它修饰的方法.变量和类不可以再被改变 3.final修饰变量时,表示该变量一旦获取了初始值,就 ...
- super限定,子类中系统查找变量的顺序:
示例代码如下: import static java.lang.System.*; //-父类: class BaseClass{ public int a=7; } //-子类: public cl ...