Spring + Hibernate Session Factory: отображение файлового каталога внутри JAR - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть веб-проект, основанный на Hibernate и Spring (программная конфигурация). Отображения Hibernate предоставляются в пакете, который архивируется в JAR.

Когда дело доходит до инициализации фабрики сеансов, которую я использовал для вызова:

sessionFactory.
    setMappingDirectoryLocations(new Resource[]{
        new ClassPathResource("org/all/theway/to/hibernatemappings")});

, чтобы сообщить Hibernate, где искать файлы сопоставления. «org / all / theway / to / hibernatemappings» - это пакет, содержащий файлы hbm.xml. Это хорошо работало в Eclipse (режим разработки GWT), так как проект, содержащий отображение, также извлечен и связан с моим веб-проектом. Однако, как только я создаю войну и развертываю ее в Tomcat, он не может получить ресурс пути к классам.

Javadoc Springpath ClasspathResource подразумевает следующее: " Поддерживает разрешение как java.io.File, если ресурс пути к классам находится в файловой системе, но не для ресурсов в JAR. Всегда поддерживает разрешение как URL. "

Но что делать вместо этого? Я мог бы также использовать setMappingJarLocation вместо этого, но я не люблю жестко кодировать имя файла jar в моем контексте Spring. Кроме того, когда я попробовал это, он также работал только в IDE, но внутри Tomcat тот же путь к файлу (WEB-INF / lib / file.jar) не работал. Это также заставляет меня поверить, что это было бы уродливым решением.

Есть ли обходной путь, который работает без использования файла jar?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Это работает

// Все контексты приложения реализуют ResourcePatternResolver

ResourcePatternResolver resourcePatternResolver= applicationContext;
sessionFactory.setMappingDirectoryLocations(resourcePatternResolver.getResources("classpath*:org/all/theway/to/hibernatemappings/*.hbm.xml"));

РЕДАКТИРОВАТЬ: заменен DefaultResourceLoader на ResourcePatternResolver.

0 голосов
/ 24 ноября 2011

Не совсем решение исходной проблемы, но обходной путь, позволяющий избежать работы с именами файловой системы jar-файлов в коде конфигурации:

Я просто сказал муравью распаковать указанный JAR в папку WEB-INF / classes

<target name="unpack.hibernatemappings">
    <unzip dest="${war.dir}/WEB-INF/classes">
        <fileset dir="${lib.dir}">
            <include name="archive-containing-the-hbm-files.jar"/>
        </fileset>
    </unzip>
</target>

Теперь сопоставления Hibernate находятся в файловой системе и доступны как ClassPathResource (как в примере с вопросами).

...