`
sshzhangwg
  • 浏览: 70819 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

使用程序来合并jar包

 
阅读更多

逻辑比较简单,直接贴代码了。

package util;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.Attributes;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.ninjacave.jarsplice.JarSplice;

public class Splicer {
	ArrayList<String> dirs = new ArrayList<String>();
	int bufferSize;
	byte[] buffer = new byte[4096];

	/**
	 * 
	 * descrition:
	 *
	 * @author LUZHUPAOPAO
	 * <p>creater date :2013-9-3 下午4:41:07</p>
	 *
	 * @param jars  JAR路径的数组
	 * @param output  新文件的合并路径
	 * @return
	 * @throws Exception
	 *
	 * <p>modify history:</p>
	 */
	public boolean createFatJar(String[] jars,String output) throws Exception {
		createFatJar(jars,null,output,"","");
		return true;
	}
	
	public void createFatJar(String[] jars, String[] natives, String output,
			String mainClass, String vmArgs) throws Exception {
		this.dirs.clear();

		Manifest manifest = getManifest(mainClass, vmArgs);

		FileOutputStream fos = new FileOutputStream(output);
		JarOutputStream jos = new JarOutputStream(fos, manifest);
		try {
			addFilesFromJars(jars, jos);
			addNativesToJar(natives, jos);
			addJarSpliceLauncher(jos);
		} finally {
			jos.close();
			fos.close();
		}
	}

	protected Manifest getManifest(String mainClass, String vmArgs) {
		Manifest manifest = new Manifest();
		Attributes attribute = manifest.getMainAttributes();
		attribute.putValue("Manifest-Version", "1.0");
		attribute.putValue("Main-Class",
				"org.ninjacave.jarsplice.JarSpliceLauncher");
		attribute.putValue("Launcher-Main-Class", mainClass);
		attribute.putValue("Launcher-VM-Args", vmArgs);

		return manifest;
	}

	protected void addFilesFromJars(String[] jars, JarOutputStream out)
			throws Exception {
		for (int i = 0; i < jars.length; i++) {

			System.out.println("------------  " + jars[i]);
			ZipFile jarFile = new ZipFile(jars[i]);

			Enumeration<?> entities = jarFile.entries();

			while (entities.hasMoreElements()) {
				ZipEntry entry = (ZipEntry) entities.nextElement();

				if (entry.isDirectory()) {
					if (this.dirs.contains(entry.getName())) {
						continue;
					}
					this.dirs.add(entry.getName());
				}

				if (entry.getName().toLowerCase().startsWith("meta-inf")) {
					continue;
				}

				if (entry.getName().toLowerCase().contains("JarSpliceLauncher")) {
					continue;
				}
				InputStream in = jarFile.getInputStream(jarFile.getEntry(entry
						.getName()));

				out.putNextEntry(new ZipEntry(entry.getName()));

				while ((this.bufferSize = in.read(this.buffer, 0,
						this.buffer.length)) != -1) {
					out.write(this.buffer, 0, this.bufferSize);
				}

				in.close();
				out.closeEntry();
			}

			jarFile.close();
		}
	}

	protected void addNativesToJar(String[] natives, JarOutputStream out)
			throws Exception {
		if(natives!=null && natives.length>0) {
			for (int i = 0; i < natives.length; i++) {
				InputStream in = new FileInputStream(natives[i]);

				out.putNextEntry(new ZipEntry(getFileName(natives[i])));

				while ((this.bufferSize = in.read(this.buffer, 0,
						this.buffer.length)) != -1) {
					out.write(this.buffer, 0, this.bufferSize);
				}

				in.close();
				out.closeEntry();
			}	
		}
	}

	protected void addJarSpliceLauncher(JarOutputStream out) throws Exception {
		InputStream in = JarSplice.class
				.getResourceAsStream("JarSpliceLauncher.class");

		out.putNextEntry(new ZipEntry(
				"org/ninjacave/jarsplice/JarSpliceLauncher.class"));
		while ((this.bufferSize = in.read(this.buffer, 0, this.buffer.length)) != -1) {
			out.write(this.buffer, 0, this.bufferSize);
		}
		in.close();
		out.closeEntry();
	}

	protected String getFileName(String ref) {
		ref = ref.replace('\\', '/');
		return ref.substring(ref.lastIndexOf('/') + 1);
	}
	
	public static void main(String[] args) throws Exception {
		Splicer splicer = new Splicer();
		String[] jars = new String[]{"d:\\1.jar","d:\\2.jar"};
		splicer.createFatJar(jars,"d:\\9999555.jar");
	}
}

 

分享到:
评论

相关推荐

    多个jar包合并成一个jar包的办法

    在软件开发过程中,经常需要将多个JAR包合并成一个JAR包,以方便管理和部署。本文将详细介绍如何实现这一过程,并提供具体的操作步骤和技术细节。 ### 一、概述 在Java开发中,项目通常会依赖多个外部库或模块,...

    Jar包合并工具

    "Jar包合并工具"就是为此目的设计的一个实用程序,它可以帮助开发者将多个JAR文件合并成一个,使得运行或部署更为便捷。 标题中的“Jar包合并工具”是一个用于合并多个Java档案(JAR)文件的工具。它通过批处理脚本...

    一键合并指定jar包,一键生成.dex.zip

    总的来说,"一键合并指定jar包,一键生成.dex.zip"工具提供了便捷的解决方案,帮助开发者应对Android应用的 dex 文件限制问题。通过自动化脚本,它简化了jar到.dex的转换过程,并提供了方法计数功能,便于优化代码...

    jar包修改神器.rar

    在IT行业中,jar包是Java应用程序的标准打包格式,它包含了类文件、资源文件以及元数据。当多个jar包包含相同类名时,可能会引发版本冲突问题。为了应对这种问题,"jar包修改神器"应运而生。这个压缩包文件提供了...

    Eclipse打包成JAR包读取外部JAR包和外部配置文件

    总结来说,打包Eclipse项目为JAR并处理外部JAR包和配置文件的关键步骤包括: 1. 使用Eclipse的`Runnable JAR file`导出功能。 2. 选择合适的库处理方式,通常推荐`Package required libraries into generated JAR`。...

    jar包差异比对器

    在实际使用"jar包差异比对器"时,可以借助一些工具,如Beyond Compare、WinMerge、JArchitect等。这些工具提供了图形化的界面,可以直观地显示两个jar包的差异,并支持导出比对结果,方便进一步分析。 对比过程中,...

    所有要用到的jar包

    标题"所有要用到的jar包"表明这是一份包含了项目运行所需全部依赖的集合,而描述中提到的"项目6.5"可能是某个具体项目的版本,暗示这些`jar`包是为了解决该项目在运行时遇到的错误或缺失的依赖。 `jar`包的使用通常...

    java通用jar包

    可以使用`jar`命令的`uf`(更新文件)和`x`(解压)选项来合并多个jar包或解压jar包内容。这在处理依赖管理和构建过程时非常有用。 5. **依赖管理**: 在大型项目中,jar包经常用来管理依赖关系。Maven和Gradle等...

    Jar打包(解决eclipse无法打包含有第三方架包问题)

    这是一个Eclipse插件,它允许开发者方便地将所有依赖的库文件合并到一个JAR中。下载并安装这个插件后,用户可以通过Eclipse的界面直接操作,选择需要打包的项目和其依赖,然后生成包含所有资源的fat jar。 使用FAT ...

    java语言开发jar包_jar包_java_

    Java语言开发中的JAR(Java Archive)包是Java平台特有的文件格式,用于打包多个类文件、资源文件以及元数据,便于分发、部署和运行。...理解和熟练使用JAR包对于任何Java开发者来说都是至关重要的技能。

    手机jarl软件合并程序

    使用Multime合并JAR程序的基本步骤如下: 1. **下载与安装**:首先,你需要从可靠的来源获取Multime工具的最新版本,例如“multime0[1].15”。将下载的文件解压缩到本地目录。 2. **准备JAR文件**:将所有需要合并...

    lib中的jar lib中的jar包

    使用lib中的jar包** - **构建路径**:在IDE如Eclipse、IntelliJ IDEA中,可以将`lib`目录设置为项目的类路径,使得其中的`jar`包被自动引入。 - **命令行执行**:使用`java -cp`或`-classpath`参数指定`jar`包的...

    Javaweb开发JAR包

    创建JAR包通常通过使用`jar`命令行工具或者IDE如Eclipse、IntelliJ IDEA等集成开发环境来完成。例如,可以使用`jar cf jarfile manifestEntries file1 file2 ...`命令,其中`c`代表创建,`f`指定输出的JAR文件名,`...

    jar包隔离代码.zip

    不同的库可能会依赖于不同版本的相同jar包,这可能导致版本冲突,影响程序的稳定性和兼容性。"jar包隔离代码.zip" 提供了一种解决此类问题的代码示例。 一、jar包隔离的重要性 1. 版本冲突:多个组件或库可能依赖于...

    java_jar打包_合并打包示例.rar

    注意,合并JAR文件可能会导致类路径冲突,如果两个JAR中有相同的类,结果JAR中只包含其中一个版本。 四、数据库与JAR打包 在Java应用中,可能需要将数据库配置或数据文件打包在JAR内。这通常适用于小型应用或测试...

    jar包的一些用法,详细

    3. **合并jar包** 使用`jar uvf jarfile file...`命令可以将新的类文件或资源添加到已存在的jar包中。这在处理依赖或更新项目时非常有用。 4. **解压jar包** 可以使用`jar xf jarfile`命令来提取jar包中的内容到...

    ffmpeg的jar包和jffmpeg的 jar包.zip

    总之,"ffmpeg的jar包和jffmpeg的jar包.zip"这个压缩包提供了在Java环境中使用FFmpeg处理音视频文件的两个重要库。无论是简单的转码需求还是复杂的多媒体应用开发,JAVE和JFFmpeg都能为你的项目提供强大的支持。

    各种jar包

    4. **jar包的合并与压缩** 当多个`jar`包有共同的依赖时,可以使用工具(如ProGuard、FatJar等)合并成一个大`jar`,减少类加载时间并优化资源占用。 5. **工具的使用** - Maven或Gradle等构建工具可以自动管理`...

    itext7jar包

    **IText7.jar包详解** IText7是一个广泛使用的Java库,主要用于创建、修改和处理PDF文档。这个jar包集合提供了全面的API,使得开发者能够高效地进行PDF文档的编程操作,无需深入理解PDF格式的复杂性。在项目中直接...

    Jar包合并工具及脚本.rar

    使用这样的ANT脚本,你可以轻松地批量合并JAR文件,这对于创建独立运行的应用程序或者减少服务器部署的复杂性非常有用。不过,需要注意的是,合并JAR可能会导致类加载问题,特别是当多个JAR包含相同类时。因此,正确...

Global site tag (gtag.js) - Google Analytics