View Full Version : Eseguire file .jar
tylerdurden83
11-04-2008, 19:04
Allora raga, ho fatto le seguenti cose:
1) compilato i java -> class
2) ho due directory, una COM... con dentro l'alberatura e tutti i class, l'altra META-INF con dentro MANIFEST.MF
3) ho creato il jar con:
C:\Programmi\Java\jdk1.6.0_04\bin\jar.exe -cvfm progetto.jar META-INF\MANIFEST.MF *.*
4) il MANIFEST.MF è il seguente:
Manifest-Version: 1.0
Class-Path: C:\work\progetto.jar;C:\...\pippo.jar;C:\...\pluto.jar;C:\...\paperino.jar
Created-By: 1.6.0_04 (Sun Microsystems Inc.)
Main-Class: Com\..\Alberatura\..\..\MainClass
(riga vuota)
5) mi posiziono in una directory di appoggio, c:\work, con dentro il jar e il bat, lancio il bat che contiene la seguente istruzione:
start "Progetto" C:\...\bin\javaw -cp "C:\work\progetto.jar;C:\...\pippo.jar;C:\...\pluto.jar;C:\...\paperino.jar" Com\..\Alberatura\..\..\MainClass x y z
dove x y z sono parametri che voglio passare al main.
Risultato:
Could not find the mail class. Program will exit!
Ovviamente il progetto lanciato da eclipse o similia non dà problemi di classnotfoundexception etc.
Grazie a tutti,
Td
3) ho creato il jar con:
C:\Programmi\Java\jdk1.6.0_04\bin\jar.exe -cvfm progetto.jar META-INF\MANIFEST.MF *.*Solo per chiarezza e precisazione: il file di manifest che passi al tool jar non sei obbligato affatto a chiamarlo MANIFEST.MF e a metterlo in una directory META-INF. Può essere un nome qualunque.
4) il MANIFEST.MF è il seguente:
Manifest-Version: 1.0
Class-Path: C:\work\progetto.jar;C:\...\pippo.jar;C:\...\pluto.jar;C:\...\paperino.jar
Created-By: 1.6.0_04 (Sun Microsystems Inc.)
Main-Class: Com\..\Alberatura\..\..\MainClass
(riga vuota)Non sei obbligato a mettere Manifest-Version o Created-By, ci penserebbe comunque il tool jar a metterli.
Comunque ci sono diverse cose sbagliate:
a) Main-Class: Com\..\Alberatura\..\..\MainClass
Non devi mettere un "path" con \ o /!!! Devi mettere un nome di classe "fully qualified", completamente qualificato. Es. com.pippo.MainClass
b) Class-Path: C:\work\progetto.jar;C:\...\pippo.jar;C:\...\pluto.jar;C:\...\paperino.jar
1) Pessima idea quella di specificare path assoluti.
2) Le specifiche del file JAR dicono che Class-Path deve specificare un insieme di URL relativi (non assoluti) separati da uno o più spazi per le eventuali librerie richieste dalla applicazione. Quindi essendo degli URL devi usare al massimo il / come separatore e se proprio volessi (ma come ho detto non è buona cosa) mettere path assoluti, dovresti mettere file:///C:/blabla......
start "Progetto" C:\...\bin\javaw -cp "C:\work\progetto.jar;C:\...\pippo.jar;C:\...\pluto.jar;C:\...\paperino.jar" Com\..\Alberatura\..\..\MainClass x y zScusa ma se vuoi mettere Main-Class nel manifest (per poter avviare direttamente il jar), che ti serve usare tutta 'sta roba???
tylerdurden83
12-04-2008, 00:11
Hai ragione, domani modifico, purtroppo non posso eseguirlo con successo da casa ma voglio vedere se riesco a levare main class not found come errore.
nuovoUtente86
12-04-2008, 00:30
Solo per chiarezza e precisazione: il file di manifest che passi al tool jar non sei obbligato affatto a chiamarlo MANIFEST.MF e a metterlo in una directory META-INF. Può essere un nome qualunque.
Non sei obbligato a mettere Manifest-Version o Created-By, ci penserebbe comunque il tool jar a metterli.
Comunque ci sono diverse cose sbagliate:
a) Main-Class: Com\..\Alberatura\..\..\MainClass
Non devi mettere un "path" con \ o /!!! Devi mettere un nome di classe "fully qualified", completamente qualificato. Es. com.pippo.MainClass
b) Class-Path: C:\work\progetto.jar;C:\...\pippo.jar;C:\...\pluto.jar;C:\...\paperino.jar
1) Pessima idea quella di specificare path assoluti.
2) Le specifiche del file JAR dicono che Class-Path deve specificare un insieme di URL relativi (non assoluti) separati da uno o più spazi per le eventuali librerie richieste dalla applicazione. Quindi essendo degli URL devi usare al massimo il / come separatore e se proprio volessi (ma come ho detto non è buona cosa) mettere path assoluti, dovresti mettere file:///C:/blabla......
Scusa ma se vuoi mettere Main-Class nel manifest (per poter avviare direttamente il jar), che ti serve usare tutta 'sta roba???
inserendo nel valore class-path url relativi, gli stessi devono puntare a percorsi sullo stesso livello del jar,giusto?
E' possibile fare un jar senza main?Mi riferisco alla tua ultima osservazione!
inserendo nel valore class-path url relativi, gli stessi devono puntare a percorsi sullo stesso livello del jar,giusto?Per URL "relativi" si intendono cose del tipo: ../other.jar (nella directory superiore) oppure lib/other.jar (nella sottodirectory 'lib'). Sono appunto relativi al jar che contiene questi riferimenti.
E' possibile fare un jar senza main?Mi riferisco alla tua ultima osservazione!Se intendi senza l'attributo Main-Class, sì è possibile. Specificare l'attributo Main-Class serve solo se si vuole avviare direttamente il jar con java -jar tua_app.jar.
Se non si mette Main-Class si può comunque avviare la applicazione ma il jar va messo esplicitamente in "classpath" (variabile di ambiente CLASSPATH, opzione -classpath o magari anche nella 'ext' del JRE) e poi va avviata la JVM specificando il nome della classe. Es: java -classpath tua_app.jar com.pippo.MainClass
Chiaramente mettere l'attributo Main-Class ma poi non avviare il jar direttamente non serve a molto .... ;)
Se invece intendi un jar che non contiene alcuna classe che ha il main() statico, la risposta è ancora sì. In tal caso sarà una jar che farà presumibilmente da "libreria" per altre applicazioni.
tylerdurden83
14-04-2008, 11:33
allora vediamo se ho fatto bene.
innanzi tutto lancio il jar con javaw -cp invece che con -jar. attualmente, sotto c:\work:
C:\...\javaw.exe -cp progetto.jar parametro1 parametro2
inoltre il file di manifest è il seguente, considerando che sono posizionato sotto c:\work e alcuni jar che viglio usare sono sotto diciamo c:\eseguibili:
Class-Path: progetto.jar ../eseguibili/pippo.jar ../eseguibili/pluto.jar ../eseguibili/paperino.jar
Main-Class: COM.x.x.x.MiaMainClass
Saluti e grazie 1000
Class-Path: progetto.jar ../eseguibili/pippo.jar ../eseguibili/pluto.jar ../eseguibili/paperino.jarNon capisco perché devi mettere il nome del jar sé stesso nel manifest!!! :mbe:
Per il resto gli altri path sono tecnicamente corrretti ... ovviamente quei jar devono esistere lì dove sono richiesti.
Main-Class: COM.x.x.x.MiaMainClassCome credo (a questo punto non credo più....) di aver spiegato nella discussione, si mette l'attributo Main-Class per poter avviare direttamente il jar con java(w) -jar progetto.jar
Se sei tu a mettere esplicitamente in classpath il jar usando -cp/-classpath, quell'attributo Main-Class non viene usato e nel comando sei sempre tu che devi mettere esplicitamente il nome della classe che ha il main. Es. java(w) -classpath progetto.jar COM.x.x.x.MiaMainClass
tylerdurden83
14-04-2008, 13:57
Quindi, secondo quello che mi hai scritto, ora ho:
Manifest:
Class-Path: ../eseguibili/pippo.jar ../eseguibili/pluto.jar ../eseguibili/paperino.jar
Main-Class: COM.xxx.MiaMainClass
C:\...\javaw.exe -jar progetto.jar parametro1 parametro2
In pratica ho tolto il jar stesso dal path nel manifest, e lo lancio con javaw -jar progetto.jar così da sfruttare l'attributo main class del manifest.
Dove sbaglio ora?
Class-Path: ../eseguibili/pippo.jar ../eseguibili/pluto.jar ../eseguibili/paperino.jar
Main-Class: COM.xxx.MiaMainClass
C:\...\javaw.exe -jar progetto.jar parametro1 parametro2
Dove sbaglio ora?Tecnicamente ora è corretto. Cosa non va ... non posso saperlo. Che problemi/errori ti dà? Amesso che tutti i jar siano lì dove devono essere, sono creati correttamente?
tylerdurden83
14-04-2008, 14:34
i jar che non sono il mio progetto sono dove devono essere e creati correttamente (non fatti da me, funzionanti qualora lancio il mio progetto da eclipse e tutto il resto).
l'errore che mi appare su schermo è sempre quello che non trova la main class :/
l'errore che mi appare su schermo è sempre quello che non trova la main class :/Anche il tuo jar è corretto? Aprilo con WinZip (o simile) e verifica: a) struttura dei package/classi e b) il contenuto del manifest (è in META-INF/MANIFEST.MF).
Ah, c'è una questione in generale riguardo le linee nel manifest. Non devono essere più lunghe di 72 byte. Nel Class-Path gli URL dovresti metterli su più righe e ogni riga deve iniziare con lo spazio.
tylerdurden83
14-04-2008, 15:27
Anche il tuo jar è corretto? Aprilo con WinZip (o simile) e verifica: a) struttura dei package/classi e b) il contenuto del manifest (è in META-INF/MANIFEST.MF).
Ah, c'è una questione in generale riguardo le linee nel manifest. Non devono essere più lunghe di 72 byte. Nel Class-Path gli URL dovresti metterli su più righe e ogni riga deve iniziare con lo spazio.
si il jar è corretto come alberatura e tutto
ho provato a fare come mi hai detto per il classpath ma da errore lo stesso :muro:
tylerdurden83
17-04-2008, 13:46
qualche idea :(?
tylerdurden83
19-04-2008, 19:57
ffs dava quel problema xke la versione di java virtual machine che usavo sul pc di es e a cui facevo riferimento chiamando javaw era piu vecchia di quella ke avevo usato per creare i class
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.