Ресурс classpath в банке

У меня есть проект A, содержащий некоторые java файлы и ресурс classpath R.txt. В рамках проекта я использую ClassLoader.getSystemResource( "R.txt" ); для извлечения R.txt.

Тогда у меня есть проект B, который включает jar файл проекта A. Теперь getSystemResource ( "R.txt" ) не найдет текстовый файл (и да, он все еще находится в корневом файле jar). Даже попытка "/R.txt", как было предложено на каком-то другом сайте, не работала. Есть идеи?

3 ответа

Используйте getResource вместо getSystemResource для использования ресурса, специфичного для данного загрузчика классов, а не для системы. Например, попробуйте выполнить одно из следующих действий:

URL resource = getClass().getClassLoader().getResource("R.txt");
URL resource = Foo.class.getClassLoader().getResource("R.txt");
URL resource = getClass().getResource("/R.txt");
URL resource = Foo.class.getResource("/R.txt");

Обратите внимание на косую черту при вызове Class.getResource вместо ClassLoader.getResource; Class.getResource относится к пакету, содержащему класс, если у вас нет ведущей косой черты, тогда как ClassLoader.getResource всегда является абсолютным.


По-видимому, ваш JAR не загружается системным загрузчиком классов, поэтому getSystemResource() не может работать. Это должно работать:

ClassFromProjectA.class.getClassLoader().getResource("R.txt")

IMO более удобно размещать ресурсы внутри того же пакета, что и классы, которые их используют, поэтому вы можете использовать более короткие

ClassFromProjectA.class.getResource("R.txt")

(или внутри этого класса просто getClass().getResource("R.txt"))


Работает ли ClassLoader.getResource()? На данный момент вы просто указываете, что должен использоваться системный загрузчик классов.

licensed under cc by-sa 3.0 with attribution.