Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何制作单片jar.file?_Java_Hadoop - Fatal编程技术网

Java 如何制作单片jar.file?

Java 如何制作单片jar.file?,java,hadoop,Java,Hadoop,我需要创建一个hadoop作业jar文件,该文件使用mahout和其他一些库。我需要能够在不需要额外的jar.file的情况下运行作业,以便所有引用的类都与结果jar文件打包在一起。如何做到这一点?Jar只是一个Zip容器 您可以使用所需的类手动解压缩和修改Jar文件,也可以使用构建系统的描述符 从一般意义上讲,这有时是不可能的,因为JAR文件中的资源必须位于特定位置,两个相互冲突但必要的资源可能会阻止这种组合(想想META-INF/MANIFEST.MF) 然而,在许多情况下,这是非常容易的。

我需要创建一个hadoop作业jar文件,该文件使用mahout和其他一些库。我需要能够在不需要额外的jar.file的情况下运行作业,以便所有引用的类都与结果jar文件打包在一起。如何做到这一点?

Jar
只是一个
Zip
容器


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

从一般意义上讲,这有时是不可能的,因为JAR文件中的资源必须位于特定位置,两个相互冲突但必要的资源可能会阻止这种组合(想想META-INF/MANIFEST.MF)

然而,在许多情况下,这是非常容易的。基本上,您可以解压缩要添加的JAR文件(它是一种zip文件格式),然后将类和其他内容“添加”到现有的JAR文件中


如果您正在制作一个可执行的JAR文件,更好的选择是在启动MANIFEST.MF中添加一个类路径条目,并在与添加的类路径条目兼容的目录结构中发送这两个JAR文件。

配置生成文件以将所有引用的类复制到生成目录。例如,在
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加载到所有节点中

hadoop能够读取jar中的jar。修改Ant脚本,将所有依赖项Jar包含在名为lib的文件夹中,并将此lib文件夹添加到输出Jar中。如果您有大量更大的jar,这有时是一个更好的选择,因为它减少了jar构建时间

在hadoop中使用第三方LIB时,请参阅本文中的一些选项


注意,额外的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>

工作
罐子
假的
假的
运行时
解放党
hadoop:hadoop核心
${artifact.groupId}:${artifact.artifactId}
假的
系统
解放党
${artifact.groupId}:${artifact.artifactId}
${basedir}/target/classes
/ 
*jar先生

你是说一个胖罐子吗?用蚂蚁做这件事并不难。下面是关于如何在NetBeans中构建这样一个jar的讨论: