Windows下使用Ant编译hadoop-eclipse-plugin-2.x插件

转自:Windows下使用Ant编译hadoop-eclipse-plugin-2.x插件


  1. 下载Ant,apache-ant-1.9.7-bin.zip,需要下载以前的版本可点击
    • 1.1 解压文件到一个目录,配置相应的环境变量
      ANT_HOME=E:\Program Files (x86)\apache-ant-1.9.7
      PATH=原路径;%ANT_HOME%\bin;
    • 1.2 验证是否安装成功ant -version
      ant安装成功
  2. 下载Hadoop,这里选择2.6.4版本,即搭建伪分布式环境的版本
    由于编译hadoop的eclipse插件需要hadoop相应的jar包,需要有hadoop的安装文件。将hadoop-2.6.4.tar.gz文件解压至本地目录下,也可以是自己编译过后的hadoop文件(hadoop版本是在32位下打包,可编译成64位版本的)。
    注:hadoop文件存放目录不要带有空格,不然编译不成功;在Windows系统下开发hadoop程序,hadoop文件安装目录也不能带有空格。
  3. 下载Eclipse,解压缩到本地目录下
    注:在用Ant编译hadoop-eclipse-plugin-2.x时需要Eclipse的安装目录,Eclipse文件安装目录也不能带有空格。
    编译好hadoop-eclipse-plugin-2.x.jar插件后,可以重新将Eclipse安装目录拷贝到自己想要的目录下。
  4. 下载hadoop2x-eclipse-plugin-master.zip,将文件解压缩到本地目录下
  5. 通过命令行cmd进入到..\hadoop2x-eclipse-plugin-master\src\contrib\eclipse-plugin目录下,或者直接在这个目录下按住Shift+鼠标右键,选择在此处打开命令窗口
    在此处打开命令窗口
    执行命令
    ant jar -Dversion=2.6.4 -Declipse.home=E:\ProgramFiles\eclipse -Dhadoop.home=F:\data\hadoop-2.6.4
    或者
    ant jar -Dhadoop.version=2.6.4 -Declipse.home=E:\ProgramFiles\eclipse -Dhadoop.home=F:\data\hadoop-2.6.4
    -Dversion,-Dhadoop.version都表示的是hadoop的版本
    -Declipse.home表示的是eclipse的安装目录,就是需要使用的eclipse的目录
    -Dhadoop.home表示的是hadoop的目录   
  6. 执行命令会发现一直停在ivy-resolve-common处一直不动
    一直停留在common
    ​ 出现这个问题的原因是执行上面的命令的时候,会查找相应的jar包,若没有的会一直停在那里,但实际上编译hadoop-eclipse-plugin并不需要common相关的包。
    解决:修改执行命令行目录(即..\hadoop2x-eclipse-plugin-master\src\contrib\eclipse-plugin)下的build.xml文件,找到:<target name="compile" depends="init, ivy-retrieve-common" unless="skip.contrib">对应的行,
    找到compile
    去掉depends=”init, ivy-retrieve-common” 修改为<target name="compile" unless="skip.contrib">
  7. 在cmd命令行中Ctrl+C,输入Y终止批处理操作
    Ctrl+c终止批处理
    再次执行ant jar命令,提示copy不到相关jar包的错误
    缺少jar包
    这个问题的原因是..\hadoop2x-eclipse-plugin-master\ivy目录下的libraries.properties文件中的jar包的版本找不到,因为对应的是在hadoop2.6.4版本下编译,该阶段是将hadoop主目录下的jar包复制到插件当中,因此需要修改jar的版本。
      解决:修改..\hadoop2x-eclipse-plugin-master\ivy\libraries.properties文件,将报错的jar包版本号更换成与hadoop安装目录\share\hadoop\common\lib下的jar对应的版本号。
    修改配置文件
    hadoop2.6.4版本只修改了hadoop.version以及commons-collections.version就成功了,如果执行仍然提示copy不到相关jar包的错误,可以根据提示修改对应版本号。
  8. 执行命令,此时编译成功
    编译成功
    生成的插件在..\hadoop2x-eclipse-plugin-master\build\contrib\eclipse-plugin目录下,如图BUILD SUCCESSFUL上一句也可以看到插件包生成的目录。
此时hadoop-eclipse-plugin-2.6.4.jar编译成功。



以下标红部分的好像有问题,放到eclipse下之后,无法新建hadoop loation!!!
所以还是使用hadoop2.x-eclipse-plugin-master吧,使用的二进制包还是hadoop-2.6.0-cdh5.4.5
报错提示说:jacksosn-core-asl-1.9.13.jar无法复制,查看后,发现jackson-core-asl的版本号jackson.version在文件D:\hadoop2x-eclipse-plugin-master\ivy\libraries.properties内配置,需要改成跟二进制内的一致起来,二进制包内是D:\hadoop-2.6.0-cdh5.4.5\share\hadoop\common\lib\jackson-core-asl-1.8.8.jar,所以将jackson.version修改为1.8.8。
同样的问题还有复制hadoop-auth-2.6.0.jar时,需要将D:\hadoop2x-eclipse-plugin-master\ivy\libraries.properties内的hadoop.version修改为2.6.0-cdh5.4.5

然后我这儿就ok了,文件位于:D:\hadoop2x-eclipse-plugin-master\build\contrib\eclipse-plugin\hadoop-eclipse-plugin-2.6.0-cdh5.4.5.jar,再去eclipse里试一下

2020-03-09
后续:

今天不打算使用hadoop-eclipse-plugin-master,而是直接使用hadoop二进制包里src内的eclipse-plugin来打包。
使用的版本如下:
hadoop: hadoop-2.6.0-cdh5.4.5,位置:D:/hadoop-2.6.0-cdh5.4.5
eclipse插件源码位于:
D:\hadoop-2.6.0-cdh5.4.5\src\hadoop-mapreduce1-project\src\contrib\eclipse-plugin
打包命令: ant jar -Dversion=2.6.0-cdh5.4.5 -Declipse.home=D:\sts-bundle\eclipse-oxygen -Dhadoop.home=D:\hadoop-2.6.0-cdh5.4.5

1、直接build同样会报出6的错误,修改后通过
2、报出另一个错,大概意思就是无法找到haoop相关jar包,所以需要在build.xml里增加classpath指定hadoop的jar包位置(即指定路径:D:\hadoop-2.6.0-cdh5.4.5\share\hadoop目录下各个子目录lib包的位置)。
3、执行jar这个target时,同样需要指定hadoop相关jar包和其他jar包的位置(本人对ant不是很熟,所以就直接copy了一些hadoop-eclipse-plugin-master文件夹下的build.xml内容,做了简单的修改,主要修改的就是把jar包的版本号全部写死了,坏处就是build.xml他人无法直接使用!!!)
所以最终的build.xml大概是这个样子的:


<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->

<project default="jar" name="eclipse-plugin">

  <import file="../build-contrib.xml"/>
  
  <!--added by scott ,these are jar in hadoop-cdh-binary -->
  <path id="hadoop-sdk-jars">
<fileset dir="${hadoop.home}/share/hadoop/common">
      <include name="hadoop*.jar"/>
    </fileset>
<fileset dir="${hadoop.home}/share/hadoop/hdfs">
      <include name="hadoop*.jar"/>
    </fileset>
<!--
<fileset dir="${hadoop.home}/share/hadoop/mapreduce1">
      <include name="hadoop*.jar"/>
    </fileset>-->
    <fileset dir="${hadoop.home}/share/hadoop/mapreduce2">
      <include name="hadoop*.jar"/>
    </fileset>
<fileset dir="${hadoop.home}/share/hadoop/yarn">
      <include name="hadoop*.jar"/>
    </fileset>
    
  </path>

  <path id="eclipse-sdk-jars">
    <fileset dir="${eclipse.home}/plugins/">
      <include name="org.eclipse.ui*.jar"/>
      <include name="org.eclipse.jdt*.jar"/>
      <include name="org.eclipse.core*.jar"/>
      <include name="org.eclipse.equinox*.jar"/>
      <include name="org.eclipse.debug*.jar"/>
      <include name="org.eclipse.osgi*.jar"/>
      <include name="org.eclipse.swt*.jar"/>
      <include name="org.eclipse.jface*.jar"/>

      <include name="org.eclipse.team.cvs.ssh2*.jar"/>
      <include name="com.jcraft.jsch*.jar"/>
    </fileset> 
  </path>

  <!-- Override classpath to include Eclipse SDK jars -->
  <path id="classpath">
    <pathelement location="${build.classes}"/>
    <!--<pathelement location="${hadoop.root}/build/classes"/>-->
    <path refid="eclipse-sdk-jars"/>
<path refid="hadoop-sdk-jars"/>
  </path>

  <!-- Skip building if eclipse.home is unset. -->
  <target name="check-contrib" unless="eclipse.home">
    <property name="skip.contrib" value="yes"/>
    <echo message="eclipse.home unset: skipping eclipse plugin"/>
  </target>
  <!-- remove from "compile" target in below: 
  depends="init, ivy-retrieve-common" 
  
  target="${targetJavaVersion}"
  source="${javac.version}"
  deprecation="${javac.deprecation}"
  -->
 <target name="compile"  unless="skip.contrib">
    <echo message="contrib: ${name}"/>
    <javac
     encoding="${build.encoding}"
     srcdir="${src.dir}"
     includes="**/*.java"
     destdir="${build.classes}"
     debug="${javac.debug}"
     optimize="${javac.optimize}" 
     >
     <classpath refid="classpath"/>
    </javac>
  </target>

  <!-- Override jar target to specify manifest -->
  <target name="jar" depends="compile" unless="skip.contrib">
    <mkdir dir="${build.dir}/lib"/>
<copy  todir="${build.dir}/lib/" verbose="true">
        <fileset dir="${hadoop.home}/share/hadoop/common">
            <include name="hadoop*.jar"/>
        </fileset>
    </copy>
<copy  todir="${build.dir}/lib/" verbose="true">
        <fileset dir="${hadoop.home}/share/hadoop/hdfs">
            <include name="hadoop*.jar"/>
        </fileset>
    </copy>
<copy  todir="${build.dir}/lib/" verbose="true">
        <fileset dir="${hadoop.home}/share/hadoop/mapreduce1">
            <include name="hadoop*.jar"/>
        </fileset>
    </copy>
<copy  todir="${build.dir}/lib/" verbose="true">
        <fileset dir="${hadoop.home}/share/hadoop/mapreduce2">
            <include name="hadoop*.jar"/>
        </fileset>
    </copy>
    <copy  todir="${build.dir}/lib/" verbose="true">
        <fileset dir="${hadoop.home}/share/hadoop/yarn">
            <include name="hadoop*.jar"/>
        </fileset>
    </copy>
    <copy  todir="${build.dir}/classes" verbose="true">
        <fileset dir="${root}/src/java">
            <include name="*.xml"/>
        </fileset>
    </copy>

    <copy file="${hadoop.home}/share/hadoop/common/lib/protobuf-java-2.5.0.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/log4j-1.2.17.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/commons-cli-1.2.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/commons-configuration-1.6.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/commons-lang-2.6.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/commons-collections-3.2.1.jar"  todir="${build.dir}/lib" verbose="true"/>  
    <copy file="${hadoop.home}/share/hadoop/common/lib/jackson-core-asl-1.8.8.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/jackson-mapper-asl-1.8.8.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/slf4j-api-1.7.5.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/guava-11.0.2.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/hadoop-auth-${version}.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/commons-cli-1.2.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/netty-3.6.2.Final.jar"  todir="${build.dir}/lib" verbose="true"/>
    <copy file="${hadoop.home}/share/hadoop/common/lib/htrace-core-3.0.4.jar"  todir="${build.dir}/lib" verbose="true"/>

    <!--
<copy file="${hadoop.root}/build/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>
    <copy file="${hadoop.root}/build/ivy/lib/Hadoop/common/commons-cli-${commons-cli.version}.jar"  todir="${build.dir}/lib" verbose="true"/>
-->
<!-- <jar jarfile="${build.dir}/hadoop-${name}-${hadoop.version}.jar" -->
    <jar jarfile="${build.dir}/hadoop-${name}-${version}.jar"
      manifest="${root}/META-INF/MANIFEST.MF">
  <manifest>
   <attribute name="Bundle-ClassPath" 
    value="classes/, 
 lib/hadoop-mapreduce-client-core-${hadoop.version}.jar,
 lib/hadoop-mapreduce-client-common-${hadoop.version}.jar,
 lib/hadoop-mapreduce-client-jobclient-${hadoop.version}.jar,
 lib/hadoop-auth-${hadoop.version}.jar,
 lib/hadoop-common-${hadoop.version}.jar,
 lib/hadoop-hdfs-${hadoop.version}.jar,
 lib/protobuf-java-*.jar,
 lib/log4j-*.jar,
 lib/commons-cli-*.jar,
 lib/commons-configuration-*.jar,
 lib/commons-httpclient-*.jar,
 lib/commons-lang-*.jar,  
 lib/commons-collections-*.jar,  
 lib/jackson-core-asl-*.jar,
 lib/jackson-mapper-asl-*.jar,
 lib/slf4j-log4j12-*.jar,
 lib/slf4j-api-*.jar,
 lib/guava-*.jar,
 lib/netty-*.jar,
 lib/htrace-core-*.jar"/>
   </manifest>
      <fileset dir="${build.dir}" includes="classes/ lib/"/>
      <fileset dir="${root}" includes="resources/ plugin.xml"/>
    </jar>
  </target>

</project>

4、编译成功后,jar包位置:
D:\hadoop-2.6.0-cdh5.4.5\src\hadoop-mapreduce1-project\build\contrib\eclipse-plugin

5、将jar包放到eclipse的plugins目录下,重启eclipse,在preference中指定windows平台下hadoop-cdh二进制包位置