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_do_jara_-_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