如何制作一个单片jar.file?

时间:2012-03-22 19:51:49

标签: java hadoop

我需要创建一个使用mahout和一堆其他库的hadoop作业jar文件。我需要能够运行该作业而无需额外的jar.files,以便所有引用的类与生成的jar文件打包在一起。怎么办呢?

5 个答案:

答案 0 :(得分:2)

配置构建文件以将所有引用的类复制到构建目录。例如,在ant

    <path id="classpathunjar">
        <fileset dir="${lib.dir}" includes="*.jar" excludes="sqljdbc4.jar"/>
    </path>


    <target name="compile" depends="clean">
        ...
        <unjar dest="${build.dir}">
            <path refid="classpathunjar" />
        </unjar>
        ...
   </target>

但如果你能做到这一点,那就更好了。如果您要在hadoop集群上运行mapreduce作业,请使用libjars功能将jar加载到所有节点中

答案 1 :(得分:2)

Hadoop能够读取jar中的jar。修改Ant脚本以将所有依赖关系jar包含在名为lib的文件夹中,并将此lib文件夹添加到输出Jar。如果你有更多的大罐子,这有时是一个更好的选择,因为它会减少你的罐子的构建时间。

有关使用带有hadoop的第三方库的许多选项,请参阅此文章

答案 2 :(得分:1)

Jar只是一个Zip容器。

您可以使用所需的类手动解压缩和修改Jar文件,也可以使用jar-with-dependencies构建系统的Maven描述符。

答案 3 :(得分:1)

在一般意义上,它有时是不可能的,因为JAR文件具有必须位于特定位置的资源,并且两个冲突但必要的资源可能会阻止组合(Think META-INF / MANIFEST.MF)

然而,在许多情况下,这很容易。基本上你解压缩要添加的JAR文件(它是一个zip文件格式)并“添加”类和什么不是现有的JAR文件。

如果要创建可执行JAR文件,更好的选择是在启动MANIFEST.MF中添加ClassPath条目,并将两个JAR文件发送到与添加的ClassPath条目兼容的目录结构中。

答案 4 :(得分:1)

请注意,额外的jar必须放在lib /子目录下(是的,jar中的jar)。我使用以下maven程序集,我在其他地方找到了它。

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>job</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <outputDirectory>lib</outputDirectory>
      <excludes>
        <exclude>org.apache.hadoop:hadoop-core</exclude>
        <exclude>${artifact.groupId}:${artifact.artifactId}</exclude>
      </excludes>
    </dependencySet>
    <dependencySet>
      <unpack>false</unpack>
      <scope>system</scope>
      <outputDirectory>lib</outputDirectory>
      <excludes>
        <exclude>${artifact.groupId}:${artifact.artifactId}</exclude>
      </excludes>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${basedir}/target/classes</directory>
      <outputDirectory>/</outputDirectory> 
      <excludes>
        <exclude>*.jar</exclude>
      </excludes>
    </fileSet>
  </fileSets>
</assembly>