`

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包中的带中文文件名导致出错。以后得注意这个问题。

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics