Ресурс Classpath в банке - PullRequest
       42

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

22 голосов
/ 14 декабря 2009

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

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

Ответы [ 3 ]

48 голосов
/ 14 декабря 2009

Используйте 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 всегда является абсолютным.

5 голосов
/ 14 декабря 2009

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

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

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

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

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

2 голосов
/ 14 декабря 2009

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

...