最近我一直在尝试向Hibern8IDE添加自定义类加载,以便它可以动态加载模型和数据库驱动类。
这使我们能够独立运行Hibern8IDE,而不是要求用户从他们的实际项目运行它(当然,这仍然可行;)
“技巧”如下
Thread thread = Thread.currentThread(); ClassLoader prevCl = thread.getContextClassLoader(); try { List urls = ... // a list of paths/zips/jars for the classloader if(urls.size()>0) { URLClassLoader _newLoader = new URLClassLoader((URL[]) urls.toArray(new URL[0]), thread.getContextClassLoader()); thread.setContextClassLoader(_newLoader); } // convince DriverManager that you can use our specified driver! String driverClass = props.getProperty("hibernate.connection.driver_class"); if(driverClass!=null) { try { Class driverClazz = ReflectHelper.classForName(driverClass); DriverManager.registerDriver(new FakeDelegatingDriver((Driver) driverClazz.newInstance())); } catch (... e1) { } } configuration = new Configuration(); configuration = configuration.setProperties(props); configuration = configuration.configure(configfile); Iterator hbms = mappings.iterator(); while (hbms.hasNext()) { hbm = (File) hbms.next(); configuration = configuration.addFile(hbm.toString()); } initialize(); // build sessionfactory etc. } catch (... e) { } finally { thread.setContextClassLoader(prevCl); }
代码做了两件事:在加载映射和jdbc驱动时安装Hibern8IDE自定义类加载器,以及安装一个FakeDelegatingDriver来让java.sql.DriverManager相信它可以从系统类加载器之外的其他地方加载jdbc驱动。
这确实有效,但是在尝试通过Java Webstart启用Hibern8IDE时却失败了:)
尽管JNLP文件中有
模型类和驱动程序的加载工作顺利,但一旦驱动程序试图连接到数据库,就会抛出一个安全异常,表示应用程序不允许连接到数据库机器上的端口:)
因此,目前Hibern8IDE只提供独立版本,遗憾的是,由于Java Webstart的严格性,无法通过Java Webstart提供!
欢迎提出任何有创意的想法!