`
sshzhangwg
  • 浏览: 69011 次
  • 性别: 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包中的类和属性以及方法。 JAR(Java ARchive)是将一系列文件合并到单个压缩文件里,就象Zip...

    windows不同程序窗口合并工具包

    实现在windows系统中,不同程序之间的窗口嵌套的工具表 用到的工具包: org.eclipse.swt.win32.win32.x86_3.100.1.v4234e.jar org.eclipse.swt.win32.win32.x86_64_3.100.1.v4236b.jar

    本Java工程用于演示使用iText jar包如何实现对word文件的操作,这些操作是多方面的,包括对表格的创建合并等。

    本工程为MyEclipse创建的java工程,用于演示使用iText jar包如何实现对word文件的操作,这些操作是多方面的,包括对表格的创建合并等。 本工程编码方式:GBK。 下载下来解压拷贝到MyEclipse中即可运行,欢迎下载。

    文件分割合并程序

    适合分割各种文件,合并自己设置的.pp文件。。自带流行皮肤JAR包。及使用。。

    Excel数据操纵-jar包-jxl.jar

     (很大总是不能很好的加载,我想补充一下:把你下载好的JXL.JAR包放入D:\JAVA\jre\lib\ext中(我的是JDK1.6)就OK了。我相信在配置TOMCAT时也需要把相关的三个包放到这里面。)  基本操作  一、创建文件  拟...

    spire.doc-5.4.0.jar

    可以添加本地依赖通过命令mvn install:install-file -Dfile=C:\Users\spire.doc-5.4.0.jar -DgroupId=e-iceblue -DartifactId=spire.doc -Dversion=5.4.0 -Dpackaging=jar将该依赖添加到本地依赖库使用,其他添加到...

    免费版本的Spire.Doc for Java v5.2.0 jar包

    Free Spire.Doc for Java 是一款免费、专业的 Java Word 组件,开发人员使用它可以轻松地将 Word 文档创建、读取、编辑、转换和打印等功能集成到自己的 Java 应用程序中。作为一款完全独立的组件,Free Spire.Doc ...

    yuicompressor-2.4.8压缩并合并多个文件

    YUICompressor在压缩的过程中无法合并文件,如处理10个文件只能生成10个文件,于是写了一个自动化脚本,只需修改一下criptList.txt文件,及可将里边的文件合并压缩成一个文件。...注:jar包是在win7 32位环境下编译

    java 小程序 合并excel(2010版)

    然后 就是 poi api的使用 结果和以前差别很大,在网上google一下,和之前的用法区别蛮大的, 最后打包,找了几个方法 最后 eclipse 直接export runnable jar 最简单啦 哇咔咔 最后我没有 2012,不知道poi 2012...

    struts框架jar包

    Struts 是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java ServletAPI,鼓励开发者采用MVC架构。 缘起于Apache Struts的WebWork框架,旨在提供相对于Struts框架的增强和改进,...

    JavaPDF操作类库API_Free Spire.PDF for Java_5.1.0

    1.功能:该API为适用于Java平台下,通过后端程序代码调用API...lib文件夹下包含了用于在java程序中的Spire.Pdf.jar文件,在项目程序中调用接口方法时,需要导入该jar文件;doc文件下包含了所有类及方法的说明解释等。

    jstl-1.2.jar 官方下载

    如果要使用JSTL,则必须将jstl.jar和 standard.jar文件放到classpath中,如果你还需要使用XML processing及Database access (SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件...

    一键合并odex

    ODEX是安卓上的应用程序apk中提取出来的可运行文件,即将APK中的classes.dex文件通过dex优化过程将其优化生成一个·dex文件单独存放,原APK中的classes.dex文件会保留的。 中文名 ODEX 类型 可运行文件 说明 安卓上...

    大数据实验5实验报告:MapReduce 初级编程实践

    对于两个输入文件,即文件 A 和文件 B,请编写 MapReduce 程序,对两个文件进行合并, 并剔除其中重复的内容,得到一个新的输出文件 C。下面是输入文件和输出文件的一个样例 供参考。 输入文件 A 的样例如下:

    Jive资料集

    3 Jive Forums KB数据库说明(中文) 4 Jive Forums KB合并数据库脚本(MSSQL) 5 Jive Forums KB合并数据库脚本(Oracle) 6 Jive Forums KB合并数据库脚本(MySql) 7 使用XML封装数据库操作语句...

    Dodo APK Tools(Android程序反编译器)

    直接下了这个,解压到任意文件夹下装了Java,把里面的apktool.jar和signapk.jar复制到了C:\Windows里面(不知道是不是必须的哈,网上看的),再运行apktool.exe就可以反编译了,反编译出来是个文件夹,打开里面的...

    log-merger:简单的命令行实用程序,可根据其时间戳记合并不同的日志文件,从而保留堆栈跟踪

    简单的命令行实用程序,可根据其时间戳记合并堆栈跟踪,从而合并不同的日志文件。 用法 要在第一列中合并两个包含格式为2015-08-29T15:49:46,919的时间戳记的日志文件(列用空格分隔): java -jar log-merger-...

    WinMerge 文件对比合并工具

    WinMerge 是一款用以对文件进行对比以及合并,可以运行在所有流行的 Windows平台上的开源软件。有些功能需要额外安装组件。 最新的 WinMerge 版本以及其它相关信息可以从 http://winmerge.org 得到。 WinMerge ...

    java源码包2

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到...

    java源码包3

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到...

Global site tag (gtag.js) - Google Analytics