2015-02-25 4 views
1

У меня есть два Maven проектов A и B. В зависит от А.Как читать файл из проекта зависимости Maven?

В А, У меня есть файл someFile.txt в папке src/main/resources.

public class SomeAClass 
{ 
    public void someMethod() 
    { 
     final InputStream inputStream = 
       Thread.currentThread() 
         .getContextClassLoader() 
         .getResourceAsStream("someFile.txt"); 
     final List<String> lines = IOUtils.readLines(inputStream); 

     ... 
    } 
} 

В тестах А это прекрасно работает.

Теперь представьте себе, что я хочу использовать тот же код в B, в том числе возможность считывать данные с src/main/resources/someFile.txt.

Прямо сейчас, вызывающий SomeAClass.someMethod() из проекта B вызывает исключение NullPointerException, и я подозреваю, что это потому, что src/main/resources/someFile.txt не может быть найден.

Как я могу изменить код для получения входного потока для src/main/resources/someFile.txt, чтобы он работал как в модульных тестах A, так и при выполнении B (B - консольное приложение на основе Spring Shell)?

+0

Вы используете данный код в IDE? –

+0

Нет, я запускаю 'mvn clean package', затем запускаю полученное приложение Spring Shell, используя' java -jar target/myjar.jar'. Здесь происходит NPE. –

+0

У вас есть 2 банки, не так ли? –

ответ

2

Уверены, что проблема в том, что у меня есть аналогичный подход, и он работает правильно.

Это была моя первая попытка

Если вы используете Somefile.txt в качестве ресурса в ваших тестах (и только там, если вы используете в главном проекте, игнорировать этот пост), вместо того, чтобы использовать src/main/resources, возможно, было бы лучше поставить этот файл и другие, которые используются в src/test/resources.

Но

Если поместить эти тестовые файлы в src/test/resources, помните, что тестовые ресурсы не входят в артефакт проекта, так что вы не можете получить доступ к ним Althoug включить зависимость в вашем ПОМ.

То, что я сделал (что-то, как у вас)

Создать новый модуль (тест-ресурсов) и положить ресурсы в src/main/resources. Модуль используется как зависимость в проектах, которые мне нужны с областью тестирования. Но я использовал ClassPathResource.

ClassPathResource resource = new ClassPathResource("the_file"); 
    resource.getInputStream() 
+0

Спасибо. Можете ли вы опубликовать здесь код, который вы используете для чтения файла (аналогично для Thread.currentThread(). GetContextClassLoader(). GetResourceAsStream ("someFile.txt"))? –

+1

ClassPathResource resource = new ClassPathResource ("the_file"); ресурс.getInputStream() –

+0

Использование 'ClassPathResource' фактически решило проблему. –

Смежные вопросы