Есть ли портативный способ получить путь к ресурсу в проекте Maven? - PullRequest
0 голосов
/ 29 июля 2011

Один из моих модульных тестов основан на данных испытаний, хранящихся в src/test/resources/testData.txt. Поскольку Maven скопирует содержимое src/test/resources в target/test-classes/, находящееся в пути к классам, я могу легко прочитать этот файл из пути к классам, не заботясь об его абсолютном имени. Пока все хорошо.

Сейчас я нахожусь в процессе просмотра некоторого кода, который обновит этот файл данными, извлеченными из удаленной системы. Этот код будет запускаться редко, а не как часть сборки. Обновленный файл будет зафиксирован в исходном хранилище. Чтобы добавить файл, мне нужно знать путь к исходному файлу в src/test/resources (добавление к файлу в target/test-classes/, очевидно, не будет работать).

Как определить этот путь переносимым способом? Я бы предпочел не использовать жесткий код src/test/resources/, потому что эти имена каталогов могут измениться. Кроме того, это сломалось бы, если бы выполнялось с текущим рабочим каталогом, отличным от базового каталога моего проекта.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

Лучший способ, вероятно, будет с ${project.basedir}/src/test/resources. Каталог тестовых ресурсов вряд ли изменится, и он будет безопасно преобразован в правильный путь независимо от вашего рабочего каталога. Попытка ссылаться на каталог тестовых ресурсов через свойство проблематично, поскольку может быть определено и часто определяется несколько тестовых ресурсов. Как бы вы узнали, какой выбрать?

0 голосов
/ 30 июля 2011

Мое предпочтительное решение для этого - настроить плагин surefire для показа ${project.basedir} в качестве переменной среды во время выполнения теста. Модульные тесты могут затем прочитать эту информацию из среды, если это необходимо. Это сохраняет всю конфигурацию в POM и не потребует никаких изменений, если этот путь когда-либо изменится:

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            ...
            <configuration>
                ...
                <environmentVariables>
                    <maven.project.basedir>${project.basedir}</maven.project.basedir>
                </environmentVariables>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>

Другие решения могут быть реализованы с использованием фильтрации ресурсов (как предложено Райаном) или путем настройки подключаемого модуля surefire для добавления ${project.basedir}/src/test/resources/ в путь к классам.

...