From: Humbel O. <Otm...@bi...> - 2001-09-14 11:59:05
|
[ Samuele Pedroni ] > The idea of the patch is fine for me, on the other hand > it needs some work to better integrate with the rest > of the import logic. >=20 > In any case I would like to understand why so often > jars are reported as bad, this should be quite rare... >=20 > I think we should dig into that. Please let me try to describe the problem we have with our jar file. First at all, I think it is not a Jython issue. If java.util.Locale.getAvailableLocales() is called with this jar file in the classpath, we get: 'file IO Exception:java.util.zip.ZipException: invalid EXT descriptor signature' How do we create the jar file ? We start with a valid jar file named external.jar, which contains all the classes from packages we don't have the source code. external.jar for example contains: com.sun.mail javax.infobus oracle.jdbc etc. Each night we make our application, resulting in packages CH.obj.XYZ. Then we add these classes into a copy of external.jar (named bisonInfra.jar), and the result has the invalid EXT descriptor signature. We have tried every version of PKZIP and many different combination of classes in external.jar, always with the same result. Funny enough, the invalid EXT descriptor always occurs in the same package/class. I tend to blame PKZIP for that (but its only a guess), because if we do it manually (either with jar or WinZip): - unpack all directories from external.jar - adjust the upper/lower case of some directories (greetings from Windows) - pack the whole directory tree into an empty jar file the resulting jar is valid.=20 We simply can't do it right automatically. We test our classpath with the following script (snippet): # # scan the whole class path for .jar's and .zip's #=20 def testJarsOnClasspath( self ): # split the classpath into entries pathSep =3D System.getProperty( "path.separator" ) classpath =3D System.getProperty("java.class.path") pathEntries =3D string.split( classpath, pathSep ) # prepare the error dictionary self._errors =3D {} # test the files on classpath for pathEntry in pathEntries: suffix =3D pathEntry[-4:] if suffix =3D=3D ".jar" or suffix =3D=3D ".zip": self.__checkJarFile( pathEntry ) # report the errors if self._errors: message =3D "The following jar (or zip) files have errors: = \n" for jarFile in self._errors.keys(): message =3D "%s *** %s *** (in %s) \n" % (message, self._errors[jarFile], jarFile ) print message # # check a single jar file and add errors to self._errors #=20 def __checkJarFile( self, jarFilePath ): print "checking %s" % jarFilePath zipFile =3D ZipInputStream( FileInputStream( File(jarFilePath) ) ); try: entry =3D zipFile.getNextEntry() while entry !=3D None: if self._debug: print entry.getName() entry =3D zipFile.getNextEntry() except ZipException, ze: if self._debug: ze.printStackTrace() self._errors[ jarFilePath] =3D ze.getMessage() Best wishes, Oti. |