PDA

View Full Version : [Java] File .jar ed il Classpath nel manifest


Edde
09-07-2007, 16:32
Ciao :)

Come cacchio si setta l'attributo "Class-Path:" del file manifest.mf di un jar, se è parecchio lungo?

Inserendo qualche cosa di simile funziona tutto:

Class-Path: lib/ant.jar lib/commons-codec-1.3.jar lib/commons-el.jar

Ma nel mio caso ho davvero parecchi jar, e quindi la riga diventa troppo lunga: in fase di avvio del file mi compare il messaggio di errore:

Exception in thread "main" java.io.IOException: line too long
at java.util.jar.Attributes.read(Attributes.java:362)
at java.util.jar.Manifest.read(Manifest.java:167)
at java.util.jar.Manifest.<init>(Manifest.java:52)
at java.util.jar.JarFile.getManifestFromReference(Jar File.java:15
at java.util.jar.JarFile.getManifest(JarFile.java:145 )

Ho trovato questo messaggio su un blog (è vecchiotto però... parliamo di fine 2004) e si parla di come risolvere questo problema

http://jroller.com/page/apolci?entry...h_molto_grandi

Tuttavia questa soluzione non sembra cmq funzionare. In fase di avvio mi compare il messaggio:

Invalid o corrupt jarfile


Questo è il mio corrente manifest

Manifest-Version: 1.0
Main-Class: StartCrawl
Class-Path: lib/ant.jar
lib/commons-cli-2.0-SNAPSHOT.jar
lib/commons-codec-1.3.jar
lib/commons-el.jar
lib/commons-httpclient-3.0.1.jar
lib/commons-lang-2.3.jar
lib/commons-logging.jar
lib/commons-logging-1.1.jar
lib/commons-logging-adapters-1.1.jar
lib/commons-logging-api-1.1.jar
lib/hadoop-0.12.3-core.jar
lib/jakarta-oro-2.0.7.jar
lib/jasper-compiler.jar
lib/jasper-runtime.jar
ib/jets3t-0.5.0.jar
lib/jetty-5.1.4.jar
lib/jsp-api.jar
lib/junit-3.8.1.jar
lib/log4j-1.2.13.jar
lib/lucene-core-2.1.0.jar
lib/lucene-misc-2.1.0.jar
lib/nutch-0.9.jar
lib/resolver.jar
lib/serializer.jar
lib/servlet-api.jar
lib/xercesImpl.jar
lib/xercesSamples.jar
lib/xml-apis.jar


Sapete aiutarmi?

Grazie :p

Edde
10-07-2007, 08:39
Uppo :mc:

andbin
10-07-2007, 09:29
Assicurati che al fondo del file ci sia un newline e che tra la fine del nome di un jar e il successivo sulla riga seguente ci siano almeno 2 spazi.

..certo che avrebbero anche potuto strutturarlo meglio il manifest... :rolleyes:

Edde
10-07-2007, 10:13
Assicurati che al fondo del file ci sia un newline e che tra la fine del nome di un jar e il successivo sulla riga seguente ci siano almeno 2 spazi.

..certo che avrebbero anche potuto strutturarlo meglio il manifest... :rolleyes:

Ho seguito alla lettera quanto detto in quel blog. Ogni riga al di fuori della prima inizia con uno spazio. Ed ogni riga al di fuori dell'ultima termina con uno spazio.
E riga vuota finale.

Visto che non andava poi ho fatto anche diverse prove (tolgo lo spazio lì, ne metto un altro là e cose simili :D ), ma nisba.

Adesso *sembra* (e qui mi gratto) che abbia risolto il problema, ma in un modo che non può certo considerarsi elegante... la riga del Class-path non può essere molto lunga? Ed io ho scompattato alcuni jar sparsi e li ho ricompattati in jar "tematici": uno che raccolga tutto il pacchetto dei vari commons-logging, tutti quelli di xerces in uno solo e così via... ora i jar sono di meno, e posso metterli su di un'unica riga.
Però è una soluzione temporanea... non credo che si possa accettare una cosa simile :p

andbin
10-07-2007, 10:32
Fai un jar con la seguente classe:
import java.util.*;
import java.util.jar.*;

public class Prova
{
public static void main (String[] args)
{
try
{
JarFile jf = new JarFile ("prova.jar");
Manifest m = jf.getManifest ();

Attributes attr = m.getMainAttributes ();

for (Map.Entry<Object,Object> e : attr.entrySet ())
System.out.println (e.getKey () + " = \"" + e.getValue () + "\"");
}
catch (Exception e)
{
System.out.println (e);
}
}
}e mettendo nel manifest il Class-Path come l'hai postato tu e verifica che avviando il jar, il valore delle entry sia corretto.
Lo vedi subito se il classpath è corretto ... manda l'output su un file e poi editalo.

Maui78
10-07-2007, 10:50
Ciao, quale application server usi per il deploy della tua applicazione?

Edde
11-07-2007, 08:29
Ciao, quale application server usi per il deploy della tua applicazione?

Eclipse.

Grazie andbin, poi proverò :)