to.getClass().getClassLoader().getResource ("... " ) i NullPointerException

Stworzyłem minimalistyczny projekt Mavena z pojedynczym modułem potomnym w eclipse helios.

W folderze src / test / resources umieściłem pojedynczy plik " install.xml". W folderze src/test / java utworzyłem pojedynczy pakiet z jedną klasą, która robi:

  @Test
  public void doit() throws Exception {
    URL url = this.getClass().getClassLoader().getResource("install.xml");
    System.out.println(url.getPath());

  }

Ale kiedy uruchamiam kod jako test jednostkowy junit 4, po prostu dostaję NullPointerException. To działało dobrze milion razy wcześniej. Jakieś pomysły?

Podążałem za tym przewodnik:

Http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/

Ale nadal otrzymujemy ten sam błąd.

Author: Pascal Thivent, 2010-09-27

8 answers

Kiedy używasz

this.getClass().getResource("myFile.ext")

getResource spróbuje znaleźć zasób związany z pakietem. Jeśli używasz:

this.getClass().getResource("/myFile.ext")

getResource potraktuje to jako ścieżkę absolutną i po prostu wywoła classloader tak, jak byś to zrobił.

this.getClass().getClassLoader().getResource("myFile.ext")

Powodem, dla którego nie możesz użyć wiodącego / w ścieżce ClassLoader jest to, że wszystkie ścieżki ClassLoader są bezwzględne, a więc / nie jest prawidłowym pierwszym znakiem w ścieżce.

 79
Author: AmishDave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 09:24:00

Tul,

  • Kiedy używasz .getClass().getResource(fileName) bierze pod uwagę lokalizacja nazwy pliku jest tą samą lokalizacją wywołania klasy.
  • Kiedy używasz .getClass().getClassLoader().getResource(fileName) to uważa, że lokalizacja nazwy pliku jest root - innymi słowy bin folder.

Źródło:

package Sound;
public class ResourceTest {
    public static void main(String[] args) {
        String fileName = "Kalimba.mp3";
        System.out.println(fileName);
        System.out.println(new ResourceTest().getClass().getResource(fileName));
        System.out.println(new ResourceTest().getClass().getClassLoader().getResource(fileName));
    }
}

Wyjście:

Kalimba.mp3
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Sound/Kalimba.mp3
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Kalimba.mp3
 32
Author: namalfernandolk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 00:41:21

Powinno być getResource("/install.xml");

Nazwy zasobów są względne do miejsca, w którym znajduje się Klasa getClass (), np. jeśli twoim testem jest org/example/foo/MyTest.class, to getResource("install.xml") zajrzy do org/example/foo/install.xml.

Jeśli install.xml znajduje się w src/test/resources, znajduje się w katalogu głównym classpath, dlatego musisz poprzedzić nazwę zasobu znakiem /.

Jeśli działa tylko czasami, to może być tak dlatego, że Eclipse wyczyściło katalog wyjściowy (np. target/test-classes) i zasobu po prostu brakuje w runtime classpath. Sprawdź, czy korzystanie z widoku nawigatora Eclipse zamiast Eksploratora pakietów. Jeśli brakuje plików, uruchom cel mvn package.

 17
Author: mhaller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 11:58:22

Miałem ten sam problem z następującymi warunkami:

    Pliki zasobów znajdują się w tym samym pakiecie co pliki źródłowe Javy, w folderze źródłowym Javy (src/test/java).
  • zbudowałem projekt z Mavena w wierszu poleceń, a budowa nie powiodła się w testach z NullPointerException.
  • kompilator wiersza poleceń nie skopiował plików zasobów do folderu test-classes, Co wyjaśniało błąd kompilacji.
  • podczas przechodzenia do eclipse po zbudowaniu wiersza poleceń i ponownym uruchomieniu testów w eclipse mam też NullPointerException w eclipse.
  • kiedy wyczyściłem projekt (usunąłem zawartość folderu docelowego) i odbudowałem projekt w Eclipse, test działał poprawnie. To wyjaśnia, dlaczego działa, gdy zaczynasz od czystego projektu.

Naprawiłem to umieszczając pliki zasobów w folderze resources W teście: src/test/resources używając tej samej struktury pakietów Co Klasa source.

BTW użyłem getClass().getResource(...)

 3
Author: Hilbrand Bouwkamp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-22 14:47:42

Kiedy eclipse uruchomi przypadek testowy, będzie szukał pliku w target / classes, a nie src / test / resources. Kiedy zasób jest zapisany eclipse powinien skopiować go z src / test / resources do target / classes jeśli się zmienił, ale jeśli z jakiegoś powodu tak się nie stało, to otrzymasz ten błąd. Sprawdź, czy plik istnieje w target / classes, aby sprawdzić, czy to jest problem.

 2
Author: oenpelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-30 06:41:00

Myślę, że napotkałem ten sam problem co twój. Stworzyłem prosty projekt mvn i użyłem "mvn eclipse: eclipse" do Ustawienia projektu eclipse.

Na przykład mój plik źródłowy " Router.java "lokalizuje w" java / main / org / jhoh / mvc". I Routera.java chce odczytać plik "routes", który znajduje się w "java/main/org/jhoh/mvc / resources"

Uruchamiam " Router.java " w eclipse, a konsola eclipse ma NullPointerExeption. Ustawiłem pom.xml z tym ustawieniem, aby wszystkie *.class java bytecode files Znajdź w katalogu budowania.

<build>
    <defaultGoal>package</defaultGoal>
    <directory>${basedir}/build</directory>
<build>

Poszedłem do katalogu "build/classes/org/jhoh/mvc / resources" i nie ma "routes". Eclipse nie skopiowało "routes" do "build / classes / org / jhoh / mvc / resources"

Myślę, że możesz skopiować swój " install.xml " do twojego *.katalog bajtowy klasy, Nie w katalogu z kodem źródłowym.

 1
Author: Le Wang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 12:24:39

Miałem ten sam problem pracując nad projektem z Maven. Oto jak to naprawiłem: po prostu umieściłem źródła (obrazy, muzykę i inne rzeczy) w katalogu zasobów:

src/main/resources

Utworzyłem tę samą strukturę dla pakietów w katalogu resources. Na przykład:

If my class is on

com.package1.main

W katalogu resources umieszczam jeden pakiet o tej samej nazwie

com.package1.main

Więc używam

getClass().getResource("resource.png");
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-18 05:45:33

Jeszcze jedno spojrzenie na to rozwiązało to dla mnie:

W projekcie Eclipse / Maven miałem klasy Javy w src/test/java, w których używałem wzorca this.getClass().getResource("someFile.ext"); do szukania zasobów w src/test/resources, gdzie plik zasobu znajdował się w tej samej lokalizacji pakietu w folderze źródłowym zasobów, co Klasa testowa w folderze źródłowym testów. Nadal nie udało się ich zlokalizować.

Kliknij prawym przyciskiem myszy na folderze źródłowym src/test/resources, Utwórz ścieżkę, a następnie "skonfiguruj filtry włączenia / wykluczenia"; dodałem nowy filtr włączenia **/*.ext, Aby upewnić się, że moje pliki nie zostały wyczyszczone; moje testy mogą teraz znaleźć swoje pliki zasobów.

 0
Author: Mikeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 21:27:55