Avatar billede brinkoman Nybegynder
29. januar 2003 - 08:49 Der er 18 kommentarer og
1 løsning

Ressourcer i jar-fil!

Jeg har et program som er pakket i en jar-fil. Den vil ikke finde mine xml-filer som bruges til konfiguration. I NetBeans tilgår jeg filen ved getClass().getResource(); men når jeg pakker den i jar-filen uden for netbeans kan den ikke finde filen... hvad kan man gøre ved det?

Man kan selvfølgelig angive hele stien, men det holder ikke da programmet kal distribueres til mange andre computere som selvfølgelig ikke installerer i samme bibliotek allesammen.
Avatar billede disky Nybegynder
29. januar 2003 - 09:06 #1
Hvad kommer den med af Exception når du forsøger ?
Avatar billede brinkoman Nybegynder
29. januar 2003 - 09:25 #2
Bare for at lave noget som jeg kan bruge til at rette det, har jeg lavet en funktion som skal skrive hvilket sted på harddisken programmet ligger:

URL home = getClass().getResource(".");
System.out.println(home.toString());

Som sagt virker det i NetBeans, og den skriver det bibliotek hvor jeg har filerne liggende. Men når det er pakket ned, giver den en NullPointerException på toString-metoden. Højst sandsynlig fordi home-variablen er null, men hvorfor er den det?
Avatar billede di8leva Nybegynder
29. januar 2003 - 09:33 #3
jag bruger:
ResourceIcon.class.getResource("/package1/package2/package3/package4/image.gif")

der ResourceIcon er en klass som jag har lavet

den, og billederna ligger i samme JAR fil...

kan du bruge det?
Avatar billede arne_v Ekspert
29. januar 2003 - 09:40 #4
Hvis din ressource ligger i:
  /resource/foobar.xml
i din jar fil, så bør du kunne lave en:
  getClass().getResource("/resource/foobar.xml")
eller en:
  getClass().getResourceAsStream("/resource/foobar.xml")

[den sidste er formentlig bedst, hvis du skal læse XML filen]
Avatar billede arne_v Ekspert
29. januar 2003 - 09:46 #5
Med W3C DOM:

DocumentBuilderFactpry dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document d = db.parse(getClass().getResourceAsStream("/resource/foobar.xml"));
Avatar billede arne_v Ekspert
29. januar 2003 - 09:49 #6
Med SAX:

Altså:

SAXParserFactory spf = SAXParserFactory.newInstance();
XMLReader r = spf.newSAXParser().getXMLReader();
r.setContentHandler(new FoobarHandler());
r.parse(getClass().getResourceAsStream("/resource/foobar.xml"));
Avatar billede brinkoman Nybegynder
29. januar 2003 - 11:18 #7
Det der med getResourceAsStream() ser ud til at virke for at indlæse filer, men hvad skal jeg så gøre for at få et bibliotek indlæst?
Avatar billede arne_v Ekspert
29. januar 2003 - 11:25 #8
Hvad mener du helt præcist med "få et bibliotek indlæst" i denne
sammenghæng ?

Vil du have fat i alle ressourcer i en sti inden i jar-filen f.eks.:
  /resource/*.xml
?
Avatar billede brinkoman Nybegynder
29. januar 2003 - 16:59 #9
jaaa... det er faktisk det.

Før brugte jeg en File fil = new File("bibliotek"); for at finde alle filer som er .xml, men det fungerer ikke med en InputStream som man får med getResourceAsStream().
Avatar billede arne_v Ekspert
29. januar 2003 - 17:22 #10
Det er svært at gøre på en pæn måde.

Jeg er bange for at du bliver nødt til noget i retning af følgende
pseudo kode:

if this class is loaded from a jar fil {
    open jar file
    for each entry in jar file {
      if a resource {
            load resource
      }
    }
    close jar file
} else {
  lookup directory
  for each file {
      if a resource {
            load resource
      }
  }
}
Avatar billede brinkoman Nybegynder
29. januar 2003 - 17:28 #11
det ka da ikke være rigtigt.. hvad er så pointen i at lægge sit program i en jar-fil?
Avatar billede disky Nybegynder
29. januar 2003 - 17:32 #12
At man ikke skal sende 417 filer til brugeren, og tingene fylder mindre.

Tænk på en jar fil som en application gemt i en zippet fil, men som kan startes direkte derfra.
Avatar billede arne_v Ekspert
29. januar 2003 - 18:24 #13
Normalt ved en application, hvilke filer/ressourcer den skal bruge.

Hvis det er noget som en slut-bruger skal kunne ændre, så bør de slet ikke
pakkes ned i jar-fil.
Avatar billede brinkoman Nybegynder
29. januar 2003 - 20:34 #14
Selve xml-filerne som slutbrugerne skal kunne redigere i, ligger selvfølgelig heller ikke i jar-filen, men for at finde ud af hvor de ligger, nemlig i et bibliotek i programmets rod-bibliotek, bliver jeg nødt til at finde ud af hvor brugeren har lagt programmet.

Men jeg tænker på en løsning hvor brugeren af programmet skal angive hvor hans xml-filer ligger, og så smidder jeg det ned i en xml-fil. Så er de jo ikke noget problem at få fat på.
Avatar billede arne_v Ekspert
29. januar 2003 - 20:59 #15
Du kan spørge Java om hvor jar-filen ligger.
Avatar billede arne_v Ekspert
29. januar 2003 - 21:01 #16
Avatar billede arne_v Ekspert
20. februar 2003 - 18:19 #17
brinkoman>

Har du fået løst problemet ?
Avatar billede martin_schou Nybegynder
28. februar 2003 - 13:29 #18
Jeg henter billeder ud fra en jar-fil - det burde være samme "problem" at hente en xml-fil ud i min applet:

//Start kodestump
    public Image LoadImageFromJarFile( String filename )
      {
        URLClassLoader cl = (URLClassLoader) super.getClass().getClassLoader();
        URL url = cl.findResource( filename );
        Toolkit tk = Toolkit.getDefaultToolkit();
        try
          {
            Image tmp = tk.getImage( url );

            while( tmp.getWidth( null ) < 0 )
              {
                try
                  {
                    Thread.sleep( 50 );
                  }
                catch( InterruptedException e )
                  {
                  }
              }
            return tmp;
          }
        catch( NullPointerException e )//ingen billede på URL
          {
            return null;
          }
      }
//Slut kodestump

Bare ret datatypen til :-)
Avatar billede brinkoman Nybegynder
01. marts 2003 - 15:10 #19
hmm ok...

Jeg læste spm287997, og det virkede fint! I mellemtiden har jeg så fundet ud af at det også virker fint hvis jeg bare skriver en relativ sti. Hvis jeg fx skal have fat i en data.xml, som ligger i samme bibliotek som mit program, kan jeg bare skrive File data = new File("data.xml"). Grunden til at jeg ikke brugte det fra starten var at det ikke virkede i NetBeans, men det virker altså fint i den "virkelige verden".

Som sagt så var det arne_v's link der egentlig viste mig det jeg skulle bruge, så det må være ham der får pointene...men også tak for hjælpen til jer andre...
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