jar包中中文文件名引发的jar包解压异常(java.lang.IllegalArgumentException)

今天,在一个项目中,使用了我提供的一个jar,在运行到当JPython试图缓存该jar包中的类时,报解压出错:

java.lang.IllegalArgumentException
	at java.util.zip.ZipInputStream.getUTF8String(ZipInputStream.java:284)
	at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:237)
	at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:73)
	at org.python.core.CachedJarsPackageManager.getZipPackages(Unknown Source)
	at org.python.core.CachedJarsPackageManager.addJarToPackages(Unknown Source)
	at org.python.core.CachedJarsPackageManager.addJarToPackages(Unknown Source)
	at org.python.core.PathPackageManager.addClassPath(Unknown Source)
	at org.python.core.SysPackageManager.findAllPackages(Unknown Source)
	at org.python.core.SysPackageManager.<init>(Unknown Source)
	at org.python.core.PySystemState.initPackages(Unknown Source)
	at org.python.core.PySystemState.initialize(Unknown Source)
	at org.python.core.PySystemState.initialize(Unknown Source)
	at org.python.core.PySystemState.initialize(Unknown Source)
	at org.python.core.PySystemState.initialize(Unknown Source)
	at org.python.core.PySystemState.<init>(Unknown Source)
	at org.python.util.PythonInterpreter.<init>(Unknown Source)
	at org.python.util.InteractiveInterpreter.<init>(Unknown Source)
	at org.python.util.InteractiveInterpreter.<init>(Unknown Source)
	at org.python.util.InteractiveInterpreter.<init>(Unknown Source)

 很奇怪,我的jar应该是没问题的啊。

 

于是写了个简单的类来测试(核心就是从JPython中复制出来一个函数):

	// Extract all of the packages in a single jarfile
	public Hashtable getZipPackages(InputStream jarin) throws IOException {
		Hashtable zipPackages = new Hashtable();

		ZipInputStream zip = new ZipInputStream(jarin);

		ZipEntry entry;
		while ((entry = zip.getNextEntry()) != null) {
			addZipEntry(zipPackages, entry, zip);
			zip.closeEntry();
		}

		// Turn each vector into a comma-separated String
		for (Enumeration e = zipPackages.keys(); e.hasMoreElements();) {
			Object key = e.nextElement();
			Vector[] vec = (Vector[]) zipPackages.get(key);
			String classes = vectorToString(vec[0]);
			if (vec[1].size() > 0) {
				classes += '@' + vectorToString(vec[1]);
			}
			zipPackages.put(key, classes);
		}

		return zipPackages;
	}
 

然后运行该类来解析我的jar包,每当执行到:

while ((entry = zip.getNextEntry()) != null) 

 这一句时就会抛出上面的异常。

用Systemout.print把entry的文件名打印出来,显示执行到其中一个xml文件后就抛异常,我怀疑是那个xml文件前后相关文件有问题,我就把该xml同级包路径里的文件全部删除,异常还是照样出现,但打印出来的最后一个文件名变成其他的了。因为该jar做过混淆,该不会是混淆导致的问题吧,可是暂时也没办法弄个未混淆的jar来测试,所以还是先从其他方面来分析。

 

看到异常信息中的 getUTF8String 函数,应该是与字符编码方式有关,会不会是中文字符导致的呢,我看了一个jar包中有个说明文件的文件名中有中文字符,我把中文字符删除,再测试,异常不再出现!!

 

原来是我手工加到jar包中的带中文文件名导致出错。以后得注意这个问题。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值