У меня есть устаревшее веб-приложение, использующее следующую настройку:
- Пружина 3.1.0
- Mybatis 3.0.3
- Tomcat 6.0.43
Проект развертывает веб-приложение (.war) с несколькими модулями maven (т.е. .jar-зависимостями). Сейчас я пытаюсь позволить Tomcat обнаруживать mybatis mapper .xml как в приложении, так и в зависимостях.
У меня есть следующее определение:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:*-mappers.xml" />
</bean>
Это прекрасно работает для обнаружения XML-файлов в модуле, который создается как .war. Если я заменю это абсолютным путем к ресурсам .xml в .jar, это успешно обнаружит эти другие ресурсы:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="jar:file:/my-repository/my-project/my-app/target/my-app-1.0.0/WEB-INF/lib/my-dependency.jar!/*-mappers.xml" />
</bean>
Однако эта формулировка слишком явная, так как она должна указывать как путь к моим зависимостям в развернутом приложении, так и имя зависимости. Кроме того, эта вторая формулировка исключает ресурсы, найденные в основном веб-приложении.
Итак, мой вопрос: как мне определить мой mapperLocations
, чтобы он мог найти ресурсы .xml как в .war-приложении, так и в зависимых .jar-файлах, или полный список зависимостей.
Я отлаживаю содержимое массива, который при запуске поступает в качестве параметра в org.mybatis.spring.SqlSessionFactory.setMapperLocations(Resources[])
. Это позволяет мне увидеть, какие файлы mybatis mapper .xml обнаруживаются.
Несколько дополнительных подробностей:
- Первая ссылка общего пути к классам успешно обнаруживает оба ресурса с помощью tomcat8.
- Даже с tomcat6 классы из зависимости .jar загружаются нормально. Однако, очевидно, что tomcat6 имеет другой способ разрешения ресурсов по сравнению с classpath.
Обновление: я видел, что PathMatchingResourcePatternResolver не маркирует значение mapperLocations
, поэтому предоставление нескольких значений не будет успешно проанализировано.
Update2: я извлек соответствующий вопрос о том, как сделать шаблон пути как относительный путь в отдельном вопросе .