It's this piece of code in PersistenceUnitParsingDeployer that doesn't like your virtual file:
@Override protected PersistenceUnitsMetaData parse(VFSDeploymentUnit unit, VirtualFile file, PersistenceUnitsMetaData root) throws Exception { VirtualFile persistenceRoot = file.getParent().getParent(); // We can't pass in a VFS url. //URL persistenceUnitRootUrl = persistenceRoot.toURL(); // FIXME: is this a supported hack? // This introduces severe regression, will go the jar: url way (EJB-326) //URL persistenceUnitRootUrl = new URL("jarjar:" + persistenceRoot.getHandler().toURL()); // http://opensource.atlassian.com/projects/hibernate/browse/EJB-326 URL persistenceUnitRootUrl = persistenceRoot.getHandler().toURL(); assert persistenceUnitRootUrl.getProtocol().equals("jar") || persistenceUnitRootUrl.getProtocol().equals("file") : "expected a jar or file url, but was " + persistenceUnitRootUrl; URL persistenceXmlUrl = file.toURL(); PersistenceUnitsMetaData metaData = new PersistenceUnitsMetaData(persistenceUnitRootUrl, PersistenceXmlLoader.deploy(persistenceXmlUrl, new HashMap<String, String>(), new EJB3DTDEntityResolver(), PersistenceUnitTransactionType.JTA)); log.info("Found persistence units " + metaData); // FIXME: if in EAR then unscoped else scoped return metaData; }