В JAR'е первым элементом обязательно должен быть манифест. Это его главное отличие от простого ZIP'а, в котором присутствует этот же файл. Если он не первый, то JarInputStream.getManifest() вернет null. А код, который вызывает этот метод, будет считать, что манифеста нет, и ругаться, что джар неправильный.
С другой стороны, если паковать через JarOutputStream( OutputStream os, Manifest man ), то вроде как все должно быть нормуль. Но тут вылазит баг МЕшных VM на мобилах и в эмуляторах. Если какой-либо атрибут более 72 символов, то по спецификации манифеста должен быть перенос строки. Но как минимум KVM из Sun WTK не понимает настолько "хитрый" маневр и считает атрибут запорченным. А строка в более чем 72 символа запросто достигается в MIDlet-Permissions при перечислении всех классов, для которых понадобится разрешение. Приходится делать свою реализацию манифеста и писать его как обычный файл, только самым первым.
Вот, блин, такие дела. Баг на баге. Плюс Sun'овский WTK выдает ошибки, не соответствующие действительности.
Сейчас написал баг-репорт в сан, посмотрим, что скажут.