Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > hibernate.cfg.xml в папку conf томката


Автор: Samotnik 4.10.2010, 19:19
привет. 
Хочу, чтобы hibernate.cfg.xml загружался по пути  /conf/Catalina/localhost/hibernate.cfg.xml
Как это можно сделать ? 
Знаю вариант в классе HibernateUtil указать прямой путь, что-то вроде
Код

private static SessionFactory buildSessionFactory() {
        try {
            return new AnnotationConfiguration()
       .configure("c:\\tomcat\\conf\\Catalina\\localhost\\hibernate.cfg.xml" ).buildSessionFactory();
        }
        catch (Throwable t) {
         logger.fatal(t, t);
            throw new ExceptionInInitializerError(t);
        }
    }

Но это не подходит, нужно решение, чтобы без хардкода. 
 smile 

Автор: Egik2 4.10.2010, 22:25
Если тебе нужно просто составить относительный путь от корня tomcata, то его корневую директорию можешь получить из переменных окружения:
Код

System.getProperty("catalina.home")

И отсюда например плясать:

Код

private static SessionFactory buildSessionFactory() {
        char delim = File.pathSeparatorChar;
        try {
            return new AnnotationConfiguration()
       .configure(System.getProperty("catalina.home") + delim + "conf" + delim + "Catalina" + delim + "localhost" + delim + "hibernate.cfg.xml" ).buildSessionFactory();
        }
        catch (Throwable t) {
         logger.fatal(t, t);
            throw new ExceptionInInitializerError(t);
        }

Автор: Samotnik 5.10.2010, 11:22
не очень изящное решение. 
Может еще есть варианты ?

Автор: Samotnik 5.10.2010, 12:07
Вобщем сделал вот так 
Код

    private static SessionFactory buildSessionFactory() {
        try {
         File file  = new File(System.getProperty("catalina.home") + PATH_TO_HIBERNATE_CONFIG_FILE);
            return new AnnotationConfiguration().configure(file).buildSessionFactory();
        }
        catch (Throwable t) {
         logger.fatal(t, t);
            throw new ExceptionInInitializerError(t);
        }
    }

Приложение работает. Но, не понятно почему примерно каждые 10 сек, пишутся логи в консоль томката
Цитата

INFO: Server startup in 18002 ms
05.10.2010 12:06:13 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:06:15 org.apache.catalina.startup.HostConfig deployDescriptor
SEVERE: Error deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:06:25 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:06:27 org.apache.catalina.startup.HostConfig deployDescriptor
SEVERE: Error deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:06:37 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:06:38 org.apache.catalina.startup.HostConfig deployDescriptor
SEVERE: Error deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:06:48 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:06:50 org.apache.catalina.startup.HostConfig deployDescriptor
SEVERE: Error deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:07:00 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:07:01 org.apache.catalina.startup.HostConfig deployDescriptor
SEVERE: Error deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:07:11 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:07:12 org.apache.catalina.startup.HostConfig deployDescriptor
SEVERE: Error deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:07:22 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Deploying configuration descriptor hibernate.cfg.xml
05.10.2010 12:07:24 org.apache.catalina.startup.HostConfig deployDescriptor
SEVERE: Error deploying configuration descriptor hibernate.cfg.xml


Автор: kkorsakoff 5.10.2010, 12:21
В этой папке томкет ожидает увидеть дескрипторы контекстов веб-приложений, а не конфиги hibernate:)
Оттуда и ошибки.

Автор: Egik2 5.10.2010, 12:41
Установи в server.xml 
для Hosta соотвествующего 
deployXML = false

Пример:
Код

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false" deployXML="false">

Автор: Samotnik 5.10.2010, 13:10
Цитата(kkorsakoff @  5.10.2010,  12:21 Найти цитируемый пост)
В этой папке томкет ожидает увидеть дескрипторы контекстов веб-приложений, а не конфиги hibernate:)

о как )
а куда можно тогда положить конфиг хибернета ?
сюда, например, можно ? 
c:\TomcatPushNotification\shared\classes\alfa\hibernate.cfg.xml 
у меня уже там файл с пропертями приложения есть

Автор: Egik2 5.10.2010, 13:19
По идее если у тебя файл лежит в класспасе то он должен сам найтись  smile.
То есть просто пишешь hibernate.cfg.xml

Автор: Samotnik 5.10.2010, 13:32
Egik2,  smile 
Код

    private static SessionFactory buildSessionFactory() {
        try {
            return new AnnotationConfiguration().configure(new File("hibernate.cfg.xml")).buildSessionFactory();
        } catch (Throwable t) {
         logger.fatal(t, t);
            throw new ExceptionInInitializerError(t);
        }
    }

Цитата

SEVERE: org.hibernate.HibernateException: could not find file: hibernate.cfg.xml
org.hibernate.HibernateException: could not find file: hibernate.cfg.xml
        at org.hibernate.cfg.Configuration.configure(Configuration.java:1557)
        at org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:1206)
        at de.my.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:20)
        at de.my.util.HibernateUtil.<clinit>(HibernateUtil.java:14)
        at de.my.ContextListener.contextInitialized(ContextListener.java:16)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
        at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
        at org.apache.catalina.core.StandardService.start(StandardService.java:519)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.io.FileNotFoundException: hibernate.cfg.xml (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at org.hibernate.cfg.Configuration.configure(Configuration.java:1554)

Автор: Skipy 5.10.2010, 13:32
Цитата(Samotnik @ 5.10.2010,  13:10)
а куда можно тогда положить конфиг хибернета ?

В WEB-INF/classes. Ему там самое место.

Автор: Samotnik 5.10.2010, 13:36
Цитата(Skipy @  5.10.2010,  13:32 Найти цитируемый пост)
В WEB-INF/classes. Ему там самое место. 

Самый умный ?  smile  туда нельзя. 
Если бы можно было, то я бы эту тему не создавал
 smile 

Автор: Egik2 5.10.2010, 13:44
А эта папка в classpath входит?

Автор: Samotnik 5.10.2010, 13:48
Вообще, вроде как проблема тривиальна, почему нету решения такого же ? 
Вот смотрите. Вы написали веб приложение. К нему у вас есть hibernate конфиг файл и какой то проперти файл для самого приложения. 
И отдаете вы это приложение сотни заказчикам. Но ведь наверняка эти два файла будут у всех различаться. Поэтому логично положить эти два файла не в веб приложение (чтобы при каждом деплое в webapps не перезаписывать эти конфиги), а куда - то отдельно в одно место самого томката, а в приложении считывать от туда.

Добавлено через 7 минут и 32 секунды
Egik2, что в classpath положить нужно ? 
c:\tomcat\shared\classes\name\hibernate.cfg.xml  
ето ?

Автор: Samotnik 5.10.2010, 14:13
так что. 
Останавливаться на этом варианте ? Больше идей нету ? 
Код

    private static SessionFactory buildSessionFactory() {
        try {
         File file = new File(System.getProperty("catalina.home") + "/shared/classes/my/hibernate.cfg.xml");
            return new AnnotationConfiguration().configure(file).buildSessionFactory();
        } catch (Throwable t) {
         logger.fatal(t, t);
            throw new ExceptionInInitializerError(t);
        }
    }


?

Автор: Egik2 5.10.2010, 14:22
Пропиши путь к твоей директории где лежит конфиг
в classpath.

Логично это сделать в файле $catalina_home/bin/setclasspath.bat
Там есть строка вида:
Код

set CLASSPATH=%JAVA_HOME%\lib\tools.jar


Добавь свой путь:
set CLASSPATH=%JAVA_HOME%\lib\tools.jar;c:\tomcat\shared\classes\name\

Теперь при запуске tomcata будет класспас показывать в твою папку и получить доступ к нему можно так:
Код

InputStream is = this.getClass().getClassLoader().getResourceAsStream("hibernate.cfg.xml");


Больше путей нигде не надо указывать.

Автор: Samotnik 6.10.2010, 12:31
Сделал, работает. Вот такой вот HibernateUtil получился
Код

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {

    private static final Log logger = LogFactory.getLog(HibernateUtil.class);
    private static final SessionFactory sessionFactory = buildSessionFactory();
    private static final String HIBERNATE_CONFIG_FILE = "hibernate.cfg.xml";    

    private static SessionFactory buildSessionFactory() {
        try {
         logger.info("Start buildSessionFactory()");
         URL url = HibernateUtil.class.getClassLoader().getResource(HIBERNATE_CONFIG_FILE);
            return new AnnotationConfiguration().configure(url).buildSessionFactory();
        } catch (Throwable t) {
         logger.fatal(t, t);
            throw new ExceptionInInitializerError(t);
        }
    }

    public static SessionFactory getSessionFactory() {
     logger.info("Start session");
        return sessionFactory;
    }

    public static void closeSession(Session session) {
     logger.info("Close session");
        if (session != null && session.isOpen()) {
            session.close();
        }
    }
}
 
Теперь внимание вопрос. А правильно ли ложить hibernate.cfg.xml в папку shared/classes томката ? 

Автор: Egik2 6.10.2010, 12:59
Цитата(Samotnik @  6.10.2010,  12:31 Найти цитируемый пост)
А правильно ли ложить hibernate.cfg.xml в папку shared/classes томката ? 


Правильней всего ложить его в WEB-INF/classes  smile.
Но раз так не получается, то о каком-либо "стандартном" месте для таких настроек я по крайней мере не слышал.
Ложи куда хочешь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)