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.
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.
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łowybin
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
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
.
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 (
- 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.
src/test/java
).
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(...)
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.
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.
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");
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.
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