从 JAR 文件运行应用程序时找不到 hibernate.cfg.xml 错误

Posted

技术标签:

【中文标题】从 JAR 文件运行应用程序时找不到 hibernate.cfg.xml 错误【英文标题】:hibernate.cfg.xml not found error while running the application from JAR file 【发布时间】:2015-06-15 20:40:19 【问题描述】:

我已将我的项目导出到 JAR 文件中。我在 JAR 中有 hibernate.cfg.xml 文件,并且我创建了 hibernate.properties 文件,以更改休眠设置而不直接编辑 hibernate.cfg.xml 文件。但是通过运行 JAR 文件,我遇到了异常,期望 hibernate.cfg.xml 文件在 JAR 文件之外。但我只希望 hibernate.properties 文件位于 JAR 文件之外以提供数据库设置。

控制台异常:

INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
Initial SessionFactory creation failed.org.hibernate.HibernateException: /hibern
ate.cfg.xml not found
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa
der.java:58)
Caused by: java.lang.ExceptionInInitializerError
        at DataLayer.HibernateAdapter.buildSessionFactory(HibernateAdapter.java:
37)
        at DataLayer.HibernateAdapter.<clinit>(HibernateUtil.java:13)
        at DataLayer.ApplicationDbContext.<init>(DatabaseContext.java:10)
        at ScanningServer.MainProg.init(TestMain.java:58)
        at ScanningServer.MainProg.main(TestMain.java:25)
        ... 5 more
Caused by: org.hibernate.HibernateException: /hibernate.cfg.xml not found
        at org.hibernate.internal.util.ConfigHelper.getResourceAsStream(ConfigHe
lper.java:173)

buildSessionFactory():

private static SessionFactory buildSessionFactory() 
        Properties hibernateProperties = new Properties();
        Properties hib = new Properties();
        if (sessionFactory == null)
            try 
                hibernateProperties.load(HibernateUtil.class.getClassLoader().getSystemClassLoader()
                                                          .getResourceAsStream("hibernate.properties"));
                Configuration configuration = new Configuration().configure();
                serviceRegistry = new StandardServiceRegistryBuilder()
                        .applySettings(configuration.getProperties()).build();
                sessionFactory = configuration.addAnnotatedClass(Account.class)
                        .addAnnotatedClass(Consumer.class).addAnnotatedClass(Order.class)
                        .addAnnotatedClass(Customer.class)
                        .addAnnotatedClass(Products.class)
                        .addAnnotatedClass(Category.class)
                        .addAnnotatedClass(Schedules.class)
                        .addAnnotatedClass(Alert.class)
                        .mergeProperties(hibernateProperties)
                        .configure("hibernate.cfg.xml").buildSessionFactory(serviceRegistry);
             catch (Exception e) 
                System.err.println("Initial SessionFactory creation failed." + e);
                throw new ExceptionInInitializerError(e);
            
           
        return sessionFactory;
    

hibernate.properties:

hibernate.connection.url=jdbc:mysql://localhost/MyProjectDB?createDatabaseIfNotExist=true
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.username=root
hibernate.connection.password=Admin123!

请帮助我克服这个问题!

【问题讨论】:

如果 jar 在您的类路径中,您可以像这样使用包/文件位置:configure(“com/bla/hibernate.cfg.xml”) 应该可以工作 @Paizo:jar 文件在资源文件夹中。在 Eclipse 中运行项目时,它运行良好。但我只能通过在 jar 文件之外运行导出的 jar 文件以及“hibernate.properties”文件来解决问题 【参考方案1】:

使用

URL input = HibernateUtil.class.getResource("hibernate.cfg.xml");  
configure(input).buildSessionFactory(serviceRegistry); 

抱歉,试试这个

public class HibernateUtil     

 private static final SessionFactory sessionFactory = buildSessionFactory();

 private static SessionFactory buildSessionFactory() 
     try                        
         ClassLoader classLoader = HibernateUtil.class.getClassLoader();             
         File file = new File(classLoader.getResource("Hibernate.properties").getFile());                                           
         Properties hibernateProperties = new Properties();          
         hibernateProperties.load(new FileInputStream(file));                                           
         Configuration configuration = new Configuration();          
         configuration.configure("/resources/hibernate.cfg.xml");            
         configuration.addProperties(hibernateProperties);           
         configuration.addAnnotatedClass(User.class);                               
         StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());             
         SessionFactory sf = configuration.buildSessionFactory(builder.build());
         return sf;          
      catch (Throwable ex) 
         ex.printStackTrace();
         System.err.println("SessionFactory creation failed." + ex);
         throw new ExceptionInInitializerError(ex);
     
 

 public static SessionFactory getSessionFactory() 
     return sessionFactory;
 

 public static void shutdown() 
     // Close caches and connection pools
     getSessionFactory().close();
 

    我创建了一个带有休眠依赖的 maven 项目。 将项目导出为可运行的jar文件并勾选“将需要的库打包到生成的jar中” 使用“java -jar myjar.jar”运行

【讨论】:

我尝试了同样的方法并得到以下异常:'INFO:HHH000040:配置资源:/hibernate.cfg.xml 2015 年 4 月 13 日上午 11:12:19 org.hibernate.cfg.Configuration doConfigure信息:HHH000041:已配置 SessionFactory:空 2015 年 4 月 13 日上午 11:12:19 org.hibernate.cfg.Configuration 配置信息:HHH000044:从 URL 配置:空初始 SessionFactory 创建失败。java.lang.NullPointerException 线程“main”中的异常" java.lang.ExceptionInInitializerError'

以上是关于从 JAR 文件运行应用程序时找不到 hibernate.cfg.xml 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Palantir Gradle 插件构建 Docker 容器时找不到 .jar 文件

Java通过Eclipse运行时找不到文件

Scala:运行fat jar时找不到主类

java运行时找不到主类

解决springboot项目打jar包运行时找不到main方法方案

grunt:从终端运行时找不到命令