View Full Version : [java] JNLP accedere archivio JAR
altropinto
02-02-2008, 19:00
Salve a tutti,
ho un problema......:muro: :muro: :muro:
Ho creato un'applicazione java;dopo ho importato, come libreria, un archivio jar che contiene un file di testo (test.txt). Da questa applicazione con la seguente istruzione riesco ad accedere al file contenuto nell'archivio jar:
InputStream fis = ClassLoader.getSystemClassLoader().getResourceAsStream("mio/file/test.txt");
Dopo di ciò ho realizzato una jnlp, l'applicazione funziona ma non riesco più ad accedere al file di testo.
Qualcuno mi saprebbe dire il motivo?????
Con le jnlp devo eseguire qualche istruzione specifica???? O devo indicare un percorso specifico???
altropinto
02-02-2008, 19:41
C'è un altro utente che ha gli stessi mie problemi, vi posto il topic:
*********************************************************
Ciao a tutti è il mio primo problema (su questo forum) spero possiate aiutarmi e consigliarmi.
L'applicazione da me realizzata è depositata su un server e distribuita sui vari client mediante javawebstart.
Pertanto le varie classi e files sono compattati in dei file.jar; tali jar sono stati tutti firmati poichè ci sono delle classi che richiedono di accedere al file system locale e quindi il tag del file jnlp di avvio è stato impostato su .
Fin qui nessun problema.
Il dilemma sorge quando devo caricare da una classe una risorsa presente su un jar differente da cui essa appartiene.
b.jar!/ovi faccio vedere brevemente la struttura dei jar
app.jar!/GUIobjects/*.class
app.jar!/objects/*.class
app.jar!/reports/*.jasper
mylib.jar!/GUIobjects/*.class
mylib.jar!/objects/*.class
Poichè la classe che deve caricare la risorsa si trova in
mylib.jar!/objects/*.class
e la risorsa da caricare in
app.jar!/reports/*.jasper
non posso utilizzare InputStream is = getClass().getResourceAsStream(reports/f.jasper)
bensì
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(reports/f.jasper)
Se compilo ed eseguito da netbeans funziona. se invece faccio partire l'applicazione da javawebstart, mi diche che l'oggetto input stream è nullo ho infatti scorporato l'istruzione sopra per cercare di capire il problema
--
ClassLoader loader = ClassLoader.getSystemClassLoader();
if (loader== null){
System.out.println("no classloader");
}
else{
InputStream is = loader.getResourceAsStream(filepath);
if(is==null)
System.out.println("no inputstream");
-----------------
Vorrei capire per quale motivo, l'unica differenza che c'è tra far avviare l'applicazione da netbeans e farla avviare tramite webstart, è che nel primo caso non si applicano i criteri di policy e nel secondo sì.Io però non credo sia un problema di policy, per 2 motivi
1 - non mi da un errore perciso di accesso negato, tanto è vero che il classloader viene creato
2 - i jar sono tutti firmati e il tag , come accennato prima è impostato su
d'altro canto non può essere che il percorso della risorsa sia sbagliato altrimenti non riusciva a trovarla anche se avvio da netbeans.
Aggiungo per finire che se modifico la struttura dei jar e metto i file da caricare nello stesso jar della classe che li carica, posso utilizzare il metodo getClass().getResourceAsStream() e in questo caso funziona tutto
Voi cosa ne dite?
grazie per l'attenzione
********************************************************
qualcuno mi può aiutare???
^TiGeRShArK^
02-02-2008, 20:06
nel jnlp hai inserito nel classpath tutti i file jar?
altropinto
03-02-2008, 08:19
Come faccio ad aggiungere i jar nel CLASSPATH???????
Intendi inserire i jar nei tag <resources>????
Questa è la mia jnlp:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" href="mia.jnlp" codebase="http://localhost:8084/miaJNLP/gpi">
<information>
<title>mia</title>
<vendor>mia</vendor>
<description>mia</description>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6"/>
<jar href="xxx.jar" download="lazy"/>
<jar href="miaGen.jar" main="true" download="lazy"/>
<jar href="vomsList.jar"/>
</resources>
<application-desc main-class="grelc.tools.proxygen.ProxyInit">
<argument>localhost</argument>
<argument>porta</argument>
</application-desc>
</jnlp>
^TiGeRShArK^
03-02-2008, 09:58
Come faccio ad aggiungere i jar nel CLASSPATH???????
Intendi inserire i jar nei tag <resources>????
Questa è la mia jnlp:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" href="mia.jnlp" codebase="http://localhost:8084/miaJNLP/gpi">
<information>
<title>mia</title>
<vendor>mia</vendor>
<description>mia</description>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6"/>
<jar href="xxx.jar" download="lazy"/>
<jar href="miaGen.jar" main="true" download="lazy"/>
<jar href="vomsList.jar"/>
</resources>
<application-desc main-class="grelc.tools.proxygen.ProxyInit">
<argument>localhost</argument>
<argument>porta</argument>
</application-desc>
</jnlp>
qui nelle resources credo (se il tuo jnlp è corretto pechè sono un paio di anni che non ne tocco uno :p):
<resources>
<j2se version="1.6"/>
<jar href="xxx.jar" download="lazy"/>
<jar href="miaGen.jar" main="true" download="lazy"/>
<jar href="vomsList.jar"/>
<jar href="app.jar" main="true" download="lazy"/>
<jar href="mylib.jar" main="true" download="lazy"/>
</resources>
altropinto
03-02-2008, 11:39
Non va......perchè non riesce a trovare la classe principale nella mylib.jar(jar contenente solo file di teso).
Ma i path nella jnlp sono diversi dall'application???? Perchè nell'applicazione funziona bene e nella jnlp no???
banryu79
03-02-2008, 12:17
Non va......perchè non riesce a trovare la classe principale nella mylib.jar(jar contenente solo file di teso).
Nel jar deve anche esserci il Manifest file che specifica la classe principale, se non erro (nn conosco la tecnologia JNLP quindi non so se è importante)
^TiGeRShArK^
03-02-2008, 12:29
<application-desc main-class="MainClass" />
..ma l'hai effettuato il sign del jar.. vero? :fagiano:
ah.. e devi togliere l'attributo main=true dalle classi che con contengono la main class..
io l'avevo messo in tutte perchè non ho idea da quale jar la prendi.. :mbe:
altropinto
04-02-2008, 11:23
ho provato a togliere " main="true" " ma non funziona lo stesso!!!!!
Secondo te è un problema di policy?????
DvL^Nemo
05-02-2008, 12:00
Vecchio problema.. Io ho risolto scompattando tutto da una parte ( temp o similari ) ed andando a caricare li' le risorse esterne.. Se riuscite a risolvere in un modo meno brutale puo' essere di aiuto.. ;)
Oltretutto nella versione 6 di java i jar vengono rinominati ( credo per questioni di sicurezza ) con dei nomi random ( quando vengono lanciati dal java web start ), quindi la cosa e' ancora piu' difficile..
^TiGeRShArK^
05-02-2008, 14:06
Vecchio problema.. Io ho risolto scompattando tutto da una parte ( temp o similari ) ed andando a caricare li' le risorse esterne.. Se riuscite a risolvere in un modo meno brutale puo' essere di aiuto.. ;)
Oltretutto nella versione 6 di java i jar vengono rinominati ( credo per questioni di sicurezza ) con dei nomi random ( quando vengono lanciati dal java web start ), quindi la cosa e' ancora piu' difficile..
quando sono nella cache è assolutamente normale che vengano rinominati, lo faceva anche con Java 5 e immagino anche con java 1.4.2.
Io ai tempi avevo fatto funzionare il tutto perfettamente (..e non era stato propriamente semplice dato che in Diamond Crush abbiamo un casino di jar esterni e di librerie native) semplicemente guardando esempi già fatti di JNLP e la reference di tutti gli attributi.
Dato che non ricordo molto consiglio di usare la mia stessa tecnica :p
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.