Newsgroup: it.comp.java
Titolo: Classpath nel manifest

Sto cercando di specificare il classpath per una mia applicazione nel 
manifest di un jar. Sfortunatamente ho molti jar (circa 40) da includere 
(l'applicazione č decisamente grande e fa uso di un gran numero di 
librerie) e se le specificassi in un unica riga avrei un errore.
In pratica non posso scrivere semplicemente:
Class-Path: libreria1.jar libreria2.jar libreria3.jar ...
In svariati punti della documentazione sul sito sun (es. 
http://java.sun.com/docs/books/tutorial/ext/basics/download.html
 e 
http://java.sun.com/j2se/1.4.2/docs/guide/extensions/spec.html#bundled
) 
si sotiene che sia possibile indicare piů Class-Path headers. Ad esempio 
nel primo link:
--------------------------------------------------------------------
You can also specify multiple extension URLs by using more than one 
Class-Path header in the manifest. For example:
Class-Path: area.jar
Class-Path: servlet.jar
Download extensions can be "daisy chained", meaning that the manifest of 
one download extension can have a Class-Path header that refers to a 
second extension, which can refer to a third extension, and so on.
--------------------------------------------------------------------
Peccato che questa cosa non sembra vera. Ho fatto diverse prove (con JDK 
1.4.2_02 e 1.4.2_04) ma sempre con lo stesso risultato. Ogni volta che 
provo ad inserire due righe Class-Path nel manifest ottengo questo errore:
19-ott-2004 22.54.05 java.util.jar.Attributes read
AVVERTENZA: Duplicate name in Manifest: Class-Path
19-ott-2004 22.54.05 java.util.jar.Attributes read
AVVERTENZA: Duplicate name in Manifest: Class-Path
Exception in thread "main" java.lang.NoClassDefFoundError: ProvaClasse1
         at ProvaMain.main(ProvaMain.java:11)
Proprio adesso ho letto nelle specifiche del formato jar ( 
http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html
 ) che 
effettivamente non č possibile indicare piů volte un attributo e che la 
riga deve essere al massimo di 72 caratteri.
In compenso si dice che il valore di un attributo puň essere diviso su 
piů righe semplicemente iniziando la seconda riga con uno spazio. Solo 
che dalle prime prove che ho fatto sembra ci siano dei problemi su 
quando si va a capo (se ci si va su uno spazio da un errore di formato 
del manifest).
Qualcuno sa fare un pň di chiarezza sulla questione?
Andrea

Scopro che si tratta di un problema ben noto: 
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4295946
Tra l'altro sembra che Sun stia beatamente ignorando la cosa :-(
Se qualcun'altro è interessato alla cosa sarebbe bene che si registrasse 
sul sito per poi votare questo bug. Ho visto che per entrare nella top25 
bastano una settantina di voti. ;-)
Andrea

 Class-Path: libreria1.jar libreria2.jar libreria3.jar ...
Ciao Andrea... io ho fatto sempre così, con lo spazio come separatore e 
in un'unica riga... Che errore ottieni se le specifichi tutte in 
un'unica riga? Non è che usi un editor che inserisce l'"a capo" 
automatico? Io generalmente uso l'apposito tag di ant e non ho mai avuto 
problemi usando molte librerie.
Ciao!
-- 
_ _ _  _  /_
  _ /_//_///_' ___
   / and yet it does move...

 Andrea
Allora il fatto mi ha incuriosito e (dopo aver letto il bug segnalato) 
pur non avendo modo di testare il caricamento "reale" dei jar via 
classloader ho fatto la seguente prova (in debug sulle classi java):
package carlo;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
public class Test {
	public static void main(String[] args) {
		String filename = "MANIFEST.MF";
		try {
			Manifest mf = new Manifest(new FileInputStream(filename));
			Attributes attr = mf.getMainAttributes();
			System.out.println(attr.entrySet().toString());
		} catch (IOException ioe) {
				ioe.printStackTrace();	
		}
	}
}
il file MANIFEST.MF č cosě fatto:
nota bene ogni riga č terminata (altrimenti va in errore la 
java.util.jar.Attributes) da uno spazio + cr+lf, esclusa l'ultima che 
non ha importanza (EOF)
Manifest-Version: 1.0
Class-Path: a.jar b.jar c.jar
  d.jar e.jar
  f.jar
  h.jar
  i.jar
  l.jar
  m.jar
  d.jar e.jar
  f.jar
  h.jar
  i.jar
  l.jar
  m.jar
  d.jar e.jar
  f.jar
  h.jar
  i.jar
  l.jar
  m.jar
  d.jar e.jar
  f.jar
  h.jar
  i.jar
  l.jar
  m.jar
  d.jar e.jar
  f.jar
  h.jar
  i.jar
  l.jar
  m.jar
  d.jar e.jar
  f.jar
  h.jar
  i.jar
  l.jar
  m.jar
  d.jar e.jar
  f.jar
  h.jar
  i.jar
  l.jar
  m.jar
il risultato, lo puoi verificare: [Class-Path=a.jar b.jar c.jar d.jar 
e.jar f.jar h.jar i.jar l.jar m.jar d.jar e.jar f.jar h.jar i.jar l.jar 
m.jar d.jar e.jar f.jar h.jar i.jar l.jar m.jar d.jar e.jar f.jar h.jar 
i.jar l.jar m.jar d.jar e.jar f.jar h.jar i.jar l.jar m.jar d.jar e.jar 
f.jar h.jar i.jar l.jar m.jar d.jar e.jar f.jar h.jar i.jar l.jar m.jar 
, Manifest-Version=1.0]
Carlo