PDA

View Full Version : Java --> Jar


carMAN
24-01-2003, 22:33
Vorrei comprimere una applicazione Java e farla autoeseguibile: mi pare che ciò si possa fare utilizzando jar... ma come
Sono riuscito a comprimere tutto ma non riesco a far funzionare l'autoeseguibile.
Come si fa grazie

P.S ho un JTextPane associato ad un JScroolPane : come devo fare affichè quello che scrivo sul JTextPane sia sempre visibile? (lo scroll funziona ma alla rovescia!!)

soalle
25-01-2003, 00:00
devi specificare un manifest file (semplicemente un file di testo) con dentro:

Main-Class: <nome-classe-che-contiene-il-main>

e poi si fa (se non ricordo male)

jar -cvfm <nome-manifest_file> <nome-file-jar> <file-da-compattare>

carMAN
25-01-2003, 09:15
Originally posted by "soalle"

devi specificare un manifest file (semplicemente un file di testo) con dentro:

Main-Class: <nome-classe-che-contiene-il-main>

e poi si fa (se non ricordo male)

jar -cvfm <nome-manifest_file> <nome-file-jar> <file-da-compattare>

Ok! adesso ci provo e ti faccio sapere!
grazie comunque

carMAN
25-01-2003, 10:49
ho creato un Manifest.mf:

Manifest-Version: 1.0
Created-By: 1.4.1_01 (Sun Microsystems Inc.)
Main-Class: Client

ho compattato tutto con jar inserendo il manifest e tutto funziona
ma quando vado a cliccare il file Client.jar ho il seguente errore:

Could not find the main class. Program will exit!
cosa devo fare!!

lo stesso accade se specifico Client.class nel Manifest.mf

soalle
25-01-2003, 11:38
no devi specificare il nome della classe senza l'estensione .class...

Per caso la classe con il main è dentro ad un package?
Nel caso in cui sia dentro ad un package devi inserire il nome della classe completo stile java, cioé:

<nome_package>.Client

Fammi sapere

carMAN
25-01-2003, 15:02
Originally posted by "soalle"

no devi specificare il nome della classe senza l'estensione .class...

Per caso la classe con il main è dentro ad un package?
Nel caso in cui sia dentro ad un package devi inserire il nome della classe completo stile java, cioé:

<nome_package>.Client

Fammi sapere

adesso ci provo!!

carMAN
25-01-2003, 15:15
il main fa parte di un package ed in particolare jchat.client.Client.class
quindi ho definito il file Manifest come:

Manifest-Version: 1.0
Created-By: 1.4.1_01 (Sun Microsystems Inc.)
Main-Class: jchat.client.Client

e ho chiamato il comando jar nel seguente modo

C:\jchat>jar -cvfm client\Client.jar client\Manifest.mf client\*.class client\immagini\*.* client\immagini\icone\*.*

tutto funziona senza errori ma quando clicco su Client.jar si verifica lo stesso errore visto precedentemente

cn73
25-01-2003, 18:35
Originally posted by "carMAN"

il main fa parte di un package ed in particolare jchat.client.Client.class
quindi ho definito il file Manifest come:

Manifest-Version: 1.0
Created-By: 1.4.1_01 (Sun Microsystems Inc.)
Main-Class: jchat.client.Client

e ho chiamato il comando jar nel seguente modo

C:\jchat>jar -cvfm client\Client.jar client\Manifest.mf client\*.class client\immagini\*.* client\immagini\icone\*.*

tutto funziona senza errori ma quando clicco su Client.jar si verifica lo stesso errore visto precedentemente

Se lanci da c.\jchat il main-class del manifest deve essere : client.Client

carMAN
25-01-2003, 19:20
ok adesso ci provo e domani ti faccio sapere

carMAN
26-01-2003, 10:54
ho provato a modificare il file manifest in client.Client ma l'errore permane. Inoltre ho lanciato il comando jar da c:\ modificando il manifest in jchat.client.Client ma nulla è cambiato .
Cosa devo fare!!!

Grazie comunque

soalle
26-01-2003, 11:37
Prova ad usare il jar da c: e in concomitanza a ciò usare il manifest con:

jchat.client.Client

PGI
26-01-2003, 13:37
Può darsi che dica una cosa che già hai fatto ma scrivo lo stesso perchè è un piccola "bizzarria" in cui mi sono imbattuto.
Il file di testo che contiene il manifest deve necessariamente terminare con un "ritorno a capo" altrimenti la jvm restituisce proprio un'eccezione "Could not find the main class".

Ad esempio:
[inizio]
Main-Class: package.classname
[fine]

è "errato", mentre
[inizio]
Main-Class: package.classname

[fine]

funziona correttamente.

Ciao.

carMAN
26-01-2003, 14:02
ti ringrazio vivamente per il consiglio!!
adesso ci provo e ti farò sapere!!!

carMAN
26-01-2003, 14:18
non so cosa fare!!

lancio il comando jar in questo modo

C:\j2sdk1.4.1_01\bin>jar cvfm c:\jchat\client\Client.jar c:\jchat\client\Manifes
t.mf c:\jchat\client\*.class c:\jchat\client\immagini\*.* c:\jchat\immagini\icon
e\*.*

e tutto funziona.

il file Manifest è il seguente

Main-Class: jchat.client.Client [invio]
[invio]

cosa devo fare?

P.S la cartella jchat si trova in C

PGI
26-01-2003, 14:50
Carman, hai un pvt (se non hai già risolto).

Cascasse il modo adesso quel programma lo facciamo diventare un executable jar file! :D

Ciao.

carMAN
26-01-2003, 16:47
Originally posted by "PGI"

Carman, hai un pvt (se non hai già risolto).

Cascasse il modo adesso quel programma lo facciamo diventare un executable jar file! :D

Ciao.

non purtroppo no!!

ti riassumo un pò la situazione
il progetto riguarda una chat basata su client e server progettata in multitread e con i socket.
E' il progetto per un esame universitario.
Nella cartella jchat, che si trova in c, c'è la cartella client e quella server.
Innazitutto dedichiamoci al client.
Nella cartella client ci sono i file .class, . java ed una cartella immagini e , al suo interno, una cartella icone.
Il file Manifest.mf si trova in jchat\client cioè dove stanno i .class e .java.
Il comando jar che eseguo è esattamente quello che ho scritto precedentemente e viene eseguito correttamente. Purtroppo, però, quando clicco sul file Client.jar la JVM mi segnale l'errore già descritto.
Aiutami e te ne sarò grato!!

PGI
26-01-2003, 17:19
prova un po' così:

nel prompt dei comandi vai in c:\ e scrivi

jar mcf c:\jchat\client\Manifest.mf PROVA.jar jchat/

che succede?

carMAN
26-01-2003, 18:00
ho definito il file manifest cosi:
Manifest-Version: 1.0
Created-By: 1.4.1_01 (Sun Microsystems Inc.)
Main-Class: jchat.client.Client
[invio]

e dal prompt:
C:\j2sdk1.4.1_01\bin>jar mcf c:\jchat\client\Manifest.mf c:\jchat\client\PROVA.jar c:\jchat\client\*.*

tutto funziona ma l'errore permane

PGI
26-01-2003, 18:06
Per il manifest è sufficiente la sola scritta "Main-Class: ...[invio]", comunque quello che hai scritto non fa una grinza.

Dovresti comunque provare a scrivere esattamente la riga a cui accennavo:

"jar mcf c:\jchat\client\Manifest.mf PROVA.jar jchat/ "

con il prompt dei comandi su "c:\";

Lo dico perchè ho provato poco fa a fare un archivio jar con "c:\nomepackage\..." anzichè "nomepackage/" e mi dava un errore "could not find main class".

Io sto qui finchè non funziona, :D

Ciao.

carMAN
26-01-2003, 20:12
se scrivo c:\jar ... il comando non viene trovato!
se invece scrivo

C:\j2sdk1.4.1_01\bin>jar mcf c:\jchat\client\Manifest.mf PROVA.jar jchat/
ho il seguente risultato
jchat : impossibile trovare il file o la directory

ho copiato il file jar in c e ho scritto

C:\>jar mcf c:\jchat\client\Manifest.mf PROVA.jar jchat/
Can't determine application home

infine ho copiato il file jar in jchat e ho scritto

C:\jchat>jar mcf c:\jchat\client\Manifest.mf PROVA.jar jchat/
jchat : impossibile trovare il file o la directory

quindi veramente non so cosa fare

PGI
26-01-2003, 20:58
Non c'è problema!

Allora, anzichè infilarci nel setting delle variabili d'ambiente del sistema operativo facciamo così:
apri il prompt dei comandi, vai in c:\ e scrivi

set path=C:\j2sdk1.4.1_01\bin\ [invio]

poi vai col comando

jar mcf c:\jchat\client\Manifest.mf PROVA.jar jchat/ [invio]

cosa succede?

carMAN
26-01-2003, 21:25
ti premetto che ho XP professional

nel prompt ho scritto:

C:\>set path=C:\j2sdk1.4.1_01\bin\

C:\>

tutto ok, quindi
C:\>jar mcf c:\jchat\client\Manifest.mf PROVA.jar jchat/
Can't determine application home

C:\>

ho provato a scrivere jar
C:\>jar
Can't determine application home

C:\>
ed ecco il risultato

PS: ho scritto un semplice helloword ponendolo in c
quindi, sempre in c, ho scritto il metafile
Main-Class: helloword

e infine:

C:\j2sdk1.4.1_01\bin>jar mcf c:\Manifest.mf c:\PROVA.jar c:\helloword.class

C:\j2sdk1.4.1_01\bin>

e l'errore persiste anche in questa semplice prova

PGI
26-01-2003, 21:46
Prendiamola da un altra parte :)
Modifichiamo la variabile path per includere jar.exe nei programmi di default (l'ho fatto anch'io nel mio s.o., vai tranquillo).

apri

start->pannello di controllo->sistema, scheda "avanzate", bottone "variabili d'ambiente", evidenzia la variabile "path" (non pathext) e clicca su "modifica"; nella casella di testo trovi qualcosa di simile a

"%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Programmi\ATI Technologies\ATI Control Panel"

in fondo aggiungi un punto e virgola (se manca) e scrivi il percorso in cui si trova jar.exe, alla fine avrai una cosa così (posto la variabile path del mio sistema):

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Programmi\ATI Technologies\ATI Control Panel;C:\Program Files\s1studio_jdk\j2sdk1.4.1\bin;

premi ok e riavvia il sistema.
Una volta riavviato apri il prompt dei comandi, vai in c:\ e digita "jar", a questo punto parte l'elenco dei comandi disponibili per il programma jar.

tutto ok?

carMAN
27-01-2003, 20:42
scusa per il ritardo con cui ti rispondo ma non sono stato in sede.
Comunque quello che mi hai detto di fare era già stato fatto in passato.
Tutte le istruzioni (java, javaw, serialver..etc) funzionano se le chiamo da c: o da altrove; purtroppo,il comando jar invece non parte e mi da un errore :cry:

PGI
28-01-2003, 09:39
Pardon per le informazioni superflue :)
Allora sposterei tutta la cartella "jchat" e il file manifest.mf in "c:\j2sdk1.4.1_01\bin" in modo da avere una cartella

c:\j2sdk1.4.1_01\bin\jchat\...

e un file

c:\j2sdk1.4.1_01\bin\Manifest.mf

e da "c:\j2sdk1.4.1_01\bin" lancerei

jar mcf Manifest.mf prova.jar jchat/

carMAN
03-02-2003, 21:44
Scusa per il ritardo ma sono stato fuori sede e sono tornato oggi.
Domani farò quello che hai detto e ti farò sapere
grazie

carMAN
03-02-2003, 22:11
FUNZIONA!!!!!!!!!!!!!!!....quasi!!!
il file prova.jar, una volta cliccato, viene eseguito ma non vengono caricate le immagini!!
Nella cartella jchat\client si trova la cartella immagini dove ci sono le immagini utilizzate nell'applicazione.Esse non vengono caricate ( al loro posto,nell'interfaccia grafica, non c'è nulla)

Il caricamento delle immagini è così definito:

[nella Gui]
....
private final byte preseconnesse=0,presesconnesse=1,duecomputer=2,....
.....

private final Image[] immagine =new Image[14];....
....
private MediaTracker tracker;
...


[nel costruttore della Gui:]
........
tracker=new MediaTracker(this);
........
Toolkit toolkit=Toolkit.getDefaultToolkit();
..........
String path="immagini/";
String pathicone="icone/";
immagine[preseconnesse]=(toolkit.getImag(path+"preseconnesse.gif"));
tracker.addImage(immagine[preseconnesse],preseconnesse);
immagine[presesconnesse]=(toolkit.getImage(path+"presesconnesse.gif"));
tracker.addImage(immagine[presesconnesse],presesconnesse);
.....
.....
System.out.println("Attendere: caricamento immagini in corso...");
try{
tracker.waitForAll();
}catch(InterruptedException e){}
System.out.println("caricamento avvenuto!");
........


perchè le immagini non vengono caricate!!
P.S:nel file Prova.jar esse sono presenti!!!

soalle
04-02-2003, 08:33
Quando carichi qualcosa dentro ad un jar la procedura è leggermente diversa...


ImageIcon worldIcon =
new ImageIcon( cl.getResource( "vamp/tutorial/images/world2.gif" ) );


dove cl è il classloader...

carMAN
04-02-2003, 17:44
Originally posted by "soalle"

Quando carichi qualcosa dentro ad un jar la procedura è leggermente diversa...


ImageIcon worldIcon =
new ImageIcon( cl.getResource( "vamp/tutorial/images/world2.gif" ) );


dove cl è il classloader...

scusa cosa è un classloader??
e come si costruisce!!!

soalle
04-02-2003, 18:16
Il class loader è il componente che si occupa di caricare le classi ;) la classe di ClassLoader è l'oggetto wrapper a tale componente.
E' possibile recuperare il ClassLoader tramite una classe...
Se ad esempio nella tua applicazione esiste la classe Client allora:

ClassLoader cl=Client.class.getClassLoader();

carMAN
04-02-2003, 20:03
Ho eseguito le modifiche e tutto funziona!
Purtroppo però, dopo aver creato il file jar e dopo averlo clikkato esso non parte e non mi viene restituito alcun errore!!!

cosa devo fare!!!!

soalle
04-02-2003, 21:24
Ma hai dei problemi a livello di jar (cosa che ipotizzo) o di programma?
Prova a fare un po' di debug per vedere se riusce ad entrare da nel main (cioé se il jar viene effettivamente eseguito...)

carMAN
04-02-2003, 22:01
l'applicazione funziona correttamente se fatta partire in modo normale (java ..... oppure Ctrl3 in TextPad) e l'esecuzione del comando jar avviene perfettamente senza errori. Il problema si verifica quando clicco sul file .jar restituitomi dal comando jar.Quando clicco tale file l'applicazione non parte!! boh

soalle
04-02-2003, 22:55
Ti dicevo prova a mettere una stampa su console nel main, tipo:

System.out.println("Funziona!!!");

e poi fai partire il jar da una console dos per vedere se riesce a trovare il main... altrimenti ti darà errore...

carMAN
06-02-2003, 11:25
per fare fare partite il file jchat.jar da console ho scritto:

C:\j2sdk1.4.1_01\bin>javaw jchat.jar
(jchat.jar si trova in questa cartella)

e mi viene segnalato il seguente errore:

Could not find the main class. Programm will exit!

lo stesso avviene se faccio partire, sempre da Console, il file prova.jar .
Questo file,se cliccato, funziona ma senza immagini (è il primo file jar costruito senza il classLoader)

soalle
06-02-2003, 18:38
passo... non saprei dirti... con i jar non ho mai avuto un ottimo rapporto...

Hai provato da console java -jar <nomefile.jar>.... ma non penso cambi molto...

carMAN
06-02-2003, 21:25
Originally posted by "soalle"

passo... non saprei dirti... con i jar non ho mai avuto un ottimo rapporto...

Hai provato da console java -jar <nomefile.jar>.... ma non penso cambi molto...


ok ti ringrazio molto lo stesso!!!