Avatar billede william_munny Nybegynder
09. august 2004 - 14:14 Der er 17 kommentarer og
1 løsning

Load resource fra jar

Hej Eksperter,
Nu er jeg ved at skal have min applikation distrubueret, og jeg pakker alle min .class + div billeder og xml filer i min jar. nu vil jeg gerne ændre koden så jeg istedet for at arbejde med komplette stier skal referer direkte til mine pakkede filer i min jar. Altså

String path = "c:\\apps\myapp\xml\\template.xml";

Skal ændres til noget alá

String path = myapp.getResource("template.xml");

Ville gerne have noget så jeg ikke behøvede at ændre ret meget når jeg går fra development til distrubuering.. Nogle gode ideer?
Avatar billede Slettet bruger
09. august 2004 - 14:18 #1
ja, du kunne jo evt. bruge:

Url myRef = getClass().getResource("<relativ stiv til resource>");
Avatar billede Slettet bruger
09. august 2004 - 14:18 #2
*host* STI, ikke stiv... stavefejl er gratis :-)
Avatar billede Slettet bruger
09. august 2004 - 14:19 #3
Supplerende skal det også siges at ovenstående metode fungerer også glimrende, selvom du benytter resourcer der ligger udenfor en JAR-fil.
Avatar billede william_munny Nybegynder
09. august 2004 - 14:20 #4
Men det giver en URL og jeg arbejder med Strings..
Avatar billede Slettet bruger
09. august 2004 - 14:22 #5
så kan du jo blot kalde getFile()-metoden på URL-objektet?
Avatar billede william_munny Nybegynder
09. august 2004 - 14:23 #6
Og hvordan definere jeg at min xml fil ligger 2 kataloger fra mine .class filer er det noget med nogle .. foran? altsa
Url myRef = getClass().getResource("..\\xml\template.xml");
Avatar billede Slettet bruger
09. august 2004 - 14:24 #7
ja, nemli' ja :-)
Avatar billede william_munny Nybegynder
09. august 2004 - 14:25 #8
så et punktum for hvert katalog ?
Avatar billede Slettet bruger
09. august 2004 - 14:31 #9
nej, undskyld...

.. betyder parent-biblioteket, så hvis du vil to mapper "tilbage" skal du skrive

..\\..\\xml\template.xml
Avatar billede Slettet bruger
09. august 2004 - 14:31 #10
et enkelt punktum (.) betyder "biblioteket / mappen som du allerede befinder dig i"
Avatar billede william_munny Nybegynder
09. august 2004 - 14:32 #11
Ok roder lige lidt med det..
Avatar billede william_munny Nybegynder
09. august 2004 - 14:36 #12
hmmm med
URL myref = getClass().getResource("..\\io\\DataHandler.java");
System.out.println(myref.getFile());

giver den følgende
/H:/Research/Automation/Data%20Evaluation%20Applications/ScriptGV/ScriptGV-0.3/src/script/io/DataHandler.java

og det vil den ikke æde..
Avatar billede Slettet bruger
09. august 2004 - 14:45 #13
Så må jeg indrømme at jeg er en smule blank. Jeg plejer nemli' selv blot at arbejde URL-objekterne direkte, og plejer derfor ikke at bruge Strings.

Måske har arne_v / mikkelbm (eller en af de andre gæve gutter) et svar, jeg siger i hvert fald "pas" indtil videre... tænkepause :-)
Avatar billede william_munny Nybegynder
09. august 2004 - 14:49 #14
OK så må vi se om de dukker forbi :-) sådan noget rod
Avatar billede mikkelbm Nybegynder
09. august 2004 - 21:15 #15
Jeg plejer at bruge:

String path = System.getProperty("user.dir");

hvis jeg skal ha' fat i den mappe jar-filen bliver kørt fra.
Det kan godt være det bare er mig, men jeg synes heller ikke det vil gi' nogen mening at hardcode ind i programmet, at den skal læse fra mapper der ligger over den, applikationen bliver kørt fra.

Hvis du har en mappe inde i den hvor jar-filen ligger, kaldet xml - altså:

mappe_med_jar_fil/xml/

og inde i den mappe har template.xml, er det bare at tilføje:

path = path + "\\xml\\template.xml";

så her du stien til din xml-fil.


Hvis jeg skal have adgang til en mappe der er pakket med ind i jar-filen, bruger jeg getResource() som corholio også foreslår:

getClass().getClassLoader().getResource("xml/template.xml");
Avatar billede arne_v Ekspert
09. august 2004 - 23:26 #16
Med hensyn til det konkrete problem:

URL myref = getClass().getResource("..\\io\\DataHandler.java");
String fnm = URLDecoder.decode(myref.getFile(), "ISO-8859-1").substring(1);
System.out.println(fnm);

bør give:

H:/Research/Automation/Data Evaluation Applications/ScriptGV/ScriptGV-0.3/src/script/io/DataHandler.java

som jeg formoder er korrekt.

[hvis Java < 1.4 så fjern karaktersæt]

Ellers er jeg meget enig med de andre i at:

1)  det bør laves så det virker både med directory og med jar

2)  .. er meget usikkert (specielt med jar fil)

3)  getResource -> URL -> InputStream er den rigtige løsning
Avatar billede william_munny Nybegynder
10. august 2004 - 11:57 #17
Hvad der ikke virker idag virker altid imorgen..:-)

Har ændret min kode så den æder URL's de fleste steder og benytter mig af

URL myref = getClass().getClassLoader().getResource("Template.xml");

Ellers benytter jeg mig af

properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"));

Så har jeg samtidig pakket alle mine XML,txt og properties ned i min jar og mountet den i netbeans, så virker det når jeg sidder og udvikler.
Så vil jeg da lige spørge om dette er den korrekte måde at gøre det på mh. til at loade og pakke resources ?
Så smid nogle svar så skal jeg fordele pointsne.
Avatar billede arne_v Ekspert
10. august 2004 - 17:19 #18
Det lyder meget rigtigt !
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester