Как получить доступ к общим файлам ресурсов из нескольких проектов

В одном из моих проектов у меня есть ресурсы, хранящиеся в /src/test/resources (типичная структура каталога maven). Эти ресурсы используются классом утилиты, хранящимся в проекте.

Сам класс утилиты используется из других проектов (другие проекты зависят от этого). Я бы получил доступ к ресурсу:

final InputStream inputStreamDobs = 
    ClassLoader.class.getResourceAsStream("/dbunit/clear_db.xml");

но поскольку я использую его из разных проектов, путь неверен - он относится к current project that is being built/tested, а не к классу утилиты и ресурсам.

Любая мысль о том, как подойти к этому?

Мне нужно избегать абсолютных путей - хотелось бы иметь способ определения относительного пути к классу утилиты.

Я также не хочу реплицировать ресурсы по нескольким проектам. Приветствия.

EDIT: Чтобы дать контекст, у меня есть определение таблиц в XML файле, которые нужно очистить после тестов интеграции (очистить всю схему БД). Тесты интеграции находятся в нескольких проектах, но прозрачный script и файл ресурсов одинаковы для всех из них и находятся в общем родительском проекте.

EDIT2:

Бонусный вопрос: Я хотел бы получить доступ к общему файлу DTD (позвоните ему tables.dtd), который должен быть доступен из XML файлов из нескольких других проектов. (он будет находиться в общем исходном проекте).

В настоящее время я дублировал несколько проектов, и я ссылаюсь на него из XML с помощью директивы:

<!DOCTYPE dataset SYSTEM "src/test/resources/dbunit/dobs.dtd">

Как указать его в файл в другом проекте?

Ответ 1

Вы написали

... но так как я использую его из разных проектов, путь неправильный - это относительно текущего проекта, который строится/тестируется, а не тот, где класс и ресурсы утилит...

Относительные пути здесь не проблема. Вы используете абсолютный путь в своем примере, но даже если вы будете использовать относительный, это будет относиться к структуре пакета или каталогов. getResourceAsStream будет забирать их до тех пор, пока путь к классам будет правильным. Реальная проблема заключается в том, что вы ссылаетесь на тестовые ресурсы в другом проекте. Но тестовые ресурсы и классы не содержатся в артефакте проекта, поэтому они недоступны из модулей, которые включают это как зависимость. Если вам нужны эти ресурсы для тестов в нескольких проектах, я бы предложил создать новый проект (скажем, "projectxyz-testresources" ) с этими ресурсами, содержащимися в src/main/resources, и добавить это как зависимость с областью "тест", где это необходимо.

ИЗМЕНИТЬ ДОБАВИТЬ:

Если вы не хотите использовать отдельный проект для тестовых ресурсов, вы можете создать тестовую банку, содержащую тестовые классы и ресурсы, используя цель jar:test-jar и включить это как тестовую зависимость. Вы можете настроить плагин jar в своем pom, чтобы выполнить эту цель на регулярных сборках.

Ответ 2

Путь к классам среды выполнения не должен ссылаться на ресурсы src/test/resources. Maven скопирует все на таргетинг, чтобы вы могли получить его с помощью "/dbunit/clear_db.xml"

Ответ 3

В этом случае я бы предложил запрограммировать плагин maven для этой задачи, так что этот путь переменной можно настроить через свойства. Вы также получите выгоду от объекта проекта.

/**
 * Location of the file.
 */
@Parameter(defaultValue = "${basedir}/src/main/java", property = "sourceFolder", required = true)
private File sourceFolder;

@Parameter(defaultValue = "${basedir}/src/test/java", property = "testFolder", required = true)
private File testFolder;

@Parameter(defaultValue = "${project}", property = "project", readonly = true, required = true)
private MavenProject project;

Ответ 4

Пробовали ли вы использовать префикс "classpath:"? Вам не нужно указывать полные пути к ресурсам, если они доступны в пути к классам. Например:

<mvc:resources location="classpath:/META-INF/web-resources/" mapping="/resources/**" />

/META-INF/web-resources/поступает из Spring MVC JAR, который является одной из зависимостей проекта. Проект не должен знать, как добраться до этого ресурса "напрямую", вместо этого он использует путь к классам.

Ответ 5

Я думаю, вы можете использовать 2 под плагинами для этой цели. если ваш проект является веб-проектом, вы можете создать 2 веб-проекта, один из которых содержит файлы конфигурации, а другой проект - ваш основной проект, теперь вы можете накладывать проекты с помощью maven-war-plugin

Существует много типов для наложения, вы можете посетить эту страницу для получения дополнительной информации оверлей maven-war-plugin

для jar файлов вы можете объединить их в один с maven-assembly-plugin

maven-assembly-plugin

Ответ 6

У нас был похожий экземпляр, в котором у нас были некоторые файлы конфигурации, которые использовались для нескольких модулей в большом мультимодульном проекте maven. Итак, что мы сделали, разделили файлы conf на отдельный модуль, который просто загружает файлы конфигурации. И тогда какой бы модуль не нуждался в этих файлах, можно было бы объявить зависимость от файлов конфигурационных файлов и просто использовать файлы jar с файлами конфигурации и разархивировать их для их использования. Вы можете сделать что-то подобное для тестовых ресурсов. Создайте модуль только с ресурсами, а затем поместите их в соответствующий путь.

Ответ 7

Можете ли вы попробовать использовать Maven Overlays? Мы столкнулись с подобной ситуацией в прошлом и очень сильно решили использовать оверлеи. Обычно оверлеи используются для совместного использования общих ресурсов в нескольких веб-приложениях.

Ответ 8

Возможно, один из этих подходов:

Либо: вы передаете xml файлы и классы java (например, класс утилиты), которые нуждаются в доступе к ним в отдельную библиотеку, которую затем можно включить в несколько других проектов (удобно в качестве зависимостей maven).

Или: вы помещаете эти xml файлы в отдельное дерево VCS или репозиторий и включаете их в свое дерево проектов (например, как "внешнее" в SVN). Таким образом, вы можете обновлять эту ссылку отдельно в своих проектах, но вам нужно поддерживать только один исходный файл.