Tworzenie pliku jar - NullPointerException przy zasobach

0

Dopiero co uporałem się z identycznym (tak przynajmniej myślałem) problemem -> http://4programmers.net/Forum/Java/248484-projekt_dojara-_nie_dziala_prawdopodobnie_blad_z_zasobami

Jako że coś takiego poprzednio zadziało:

package resources;

import java.io.InputStream;

public class ResourceLoader
{
    public static ResourceLoader rl = new ResourceLoader();

    public static InputStream getXMLDocumentInputStream(String fileName)
    {
        InputStream is = rl.getClass().getResourceAsStream("xml/" + fileName + ".xml");
        return is;
    }
}

Postanowiłem w identyczny sposób rozwiązać problem w dużym projekcie, nad którym już dłuższy czas pracuję. Niestety - NullPointerException. Błąd się pojawia już przy pierwszej próbie wczytania pliku z zasobami.

package resources;

import java.io.*;
import java.net.URL;
import java.nio.file.*;

public class ResourceLoader
{
    public static ResourceLoader rl = new ResourceLoader();

    /**
     * make Input Stream
     */
    private static InputStream makeIS(String first, String... more)
    {
        Path path = Paths.get(first, more);

        System.out.println(path); //test
        InputStream is = rl.getClass().getResourceAsStream(path.toString());
        if(is == null) System.out.println("nenfsd"); //test
        return is;
    }

    public static InputStream getArmiesList()
    {
        return makeIS("army", "Armies.txt");
    }

   ...

}

Rozkład folderów jest analogiczny do tego, jaki miałem w poprzednim problemie (czyli teoretycznie powinno działać). Mianowicie, poprzednio miałem:

resources:
    ~ xml:
          ~ smsy.xml
    ~ ResourceLoader.class

a teraz mam(nie będę rozwijał tych zbędnych):

resources:
    ~ army:
         ~ Armies.txt
          ...
    ~ skills:
          ...
    ...
    ~ ResourceLoader.class

I wtedy nie wywalało nulla, a teraz:

army\Armies.txt
nenfsd
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at java.io.Reader.<init>(Unknown Source)
        at java.io.InputStreamReader.<init>(Unknown Source)
        at java.util.Scanner.<init>(Unknown Source)
        at generator.GeneratorFrame.<init>(GeneratorFrame.java:87) // <- tutaj jest wywołanie tej metody po prostu
        ...

Oczywiście program pięknie działa zanim się go wpakuje do jara.

Z góry dziękuję za pomoc :)

0

W starym problemie postanowiłem użyć Paths.get(...) do złożenia ścieżki i... okazało się, że jako jar też wtedy nie działa. Tak więc przy obecnym problemie w tym większym projekcie zmieniłem metodę na następującą:

    private static InputStream makeIS(String firstPathElement, String... otherPathElements)
    {
        String path = firstPathElement;
        for(String element : otherPathElements)
            path += "/" + element;

        InputStream is = rl.getClass().getResourceAsStream(path);
        return is;
    }

i działa... Tylko nie wiem czemu utworzenie ścieżki za pomocą klasy Paths nie działa po wyeksportowaniu do jara :x

PS: nie wiedziałem czy po prostu usunąć temat, ale zostawiam, jakby też miał ktoś kiedyś podobny problem.

0

Działa też, trochę nienaturalne, umieszczenie zasobów obok pliku class, tak by ścieżka względna nie zaczynała się od kropek.

-pakiet1
   klasa1
   klasa2
   -resources
       plik1
-pakiet2
   klasa3
...

I w dowolnym miejscu

obiekt_typu_klasa1.class.getResourceAsStream("resources/plik1");

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0