【问题标题】:How to Access hibernate.cfg.xml, config.properties, and log4j.properties from outside project folder如何从外部项目文件夹访问 hibernate.cfg.xml、config.properties 和 log4j.properties
【发布时间】:2013-10-27 00:26:06
【问题描述】:

我想将我的 java 项目(使用 eclipse)导出到可执行的 jar 中, 但我希望 hibernate.cfg.xml、config.properties 和 log4j.properties 将来可以编辑, 那么如何从外部项目文件夹中休眠访问该文件或以任何其他方式使该文件可编辑以备将来使用,

我已经尝试从外部项目文件夹访问 hibernate.cfg.xml 的代码

SessionFactory sessionFactory = new Configuration().configure("mon/hibernate.cfg.xml").buildSessionFactory();

但我收到了这个错误

mon/hibernate.cfg.xml not found
Exception in thread "main" java.lang.ExceptionInInitializerError

仍然不知道 config.properties 和 log4j.properties, 任何帮助都会很高兴:)

【问题讨论】:

    标签: java xml eclipse hibernate


    【解决方案1】:

    你的问题有我的解决方案:

    config.properties

    您通过设置为您的 JVM 的参数 -DconfigurationFile 定义您的配置文件。然后尝试在您的classpath(jar 内)中找到confiFile,如果未找到,则将搜索文件系统。好吧,最后属性将被 JVM 参数覆盖。

    Properties prop = new Properties();
    String configFile = System.getProperty("configurationFile",defaultConfigurationFile);
        try {
          InputStream classPathIo = getClass().getClassLoader().getResourceAsStream(configFile);
          if(classPathIo != null) {
            prop.load(classPathIo);
          } else {
            prop.load(new FileReader(configFile));
        } catch (FileNotFoundException e) {
          log.warn("The config file {} cannot be found. It can be setup by -DconfigurationFile parameter.",configFile);
        } catch (IOException e) {
          log.warn("The config file {} is not readable.",configFile);
        } finally {
          log.info("Configuration loaded! {} values found from configFile {}.",prop.entrySet().size(),configFile);
          prop.putAll(System.getProperties());
        }
    

    log4j.properties

    解决方案是使用以下 JVM 参数:

    -Dlog4j.configuration={path to file}
    

    如果文件不在类路径中(如果是 Tomcat,则在 WEB-INF/classes 中)但在磁盘的某个位置,请使用 file:,例如

    -Dlog4j.configuration=file:/somewhere/on/disk/log4j.properties
    

    hibernate.cfg.xml

    我不知道该怎么做。无论如何,发布后很难配置持久性,因为配置很难绑定到实现。我认为将其保留在类路径中是可以的。

    【讨论】:

    • 很抱歉,我之前从未使用过 JVM 参数...我是否为此代码 -Dlog4j.configuration=file:/somewhere/on/disk/log4j.properties 创建了一个新文件,或者我必须在哪里添加此代码??
    • 我只是创建一个 Java 项目而不是 Web 项目,否则......将来这个 java 将在命令提示符(可执行 jar)中运行这个命令 java -jar <jar file> 任何想法??
    • 然后添加java -Dlog4j.configuration=file:/somewhere/on/disk/log4j.properties -DconfigurationFile=/somewhere/config.properties -jar <jar file>
    • 仍然不适合我,我收到了这个错误log4j:WARN Caught Exception while in Loader.getResources. This may be innocuous. java.lang.IllegalArgumentException: name
    【解决方案2】:

    您可以指示hibernate从文件系统加载配置文件,

    有很多重载的configure() 方法可用,请参阅文档链接

    以下是你可以做的方式:

    File conf = new File(ABS_PATH_TO_CONFIG+File.separator+"hibernate.cfg.xml");
    Configuration configuration = new Configuration().configure(conf.getAbsoluteFile());
    
    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    

    http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/cfg/Configuration.html#configure(java.io.File)

    对于 log4j,您可以在 log4j 配置文件中提供 -D 参数

    点赞-Dlog4j.configuration={path to .properties or .xml }

    log4j 外部化的类似问题:How to initialize log4j properly?

    这也值得一读。

    【讨论】:

    • 对不起,我还是不明白...我必须在哪里添加此代码 File conf = new File(ABS_PATH_TO_CONFIG+File.separator+"hibernate.cfg.xml"); Configuration configuration = new Configuration().configure(conf.getAbsoluteFile()); 到我的控制器或 DBUtil 的文件??
    • @splatter_fadli:编辑了答案,把它放在你正在构建会话工厂的地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多