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