PDA

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

andbin
11-04-2008, 23:01
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!

andbin
12-04-2008, 11:08
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

andbin
14-04-2008, 12:35
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?

andbin
14-04-2008, 14:10
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 :/

andbin
14-04-2008, 14:40
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

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.