2011-08-10 46 views
4

我們使用部署到OSGi包中的EclipseLink製作RCP應用程序。當我們在eclipse中運行應用程序時,它完美的工作,在Linux上部署後效果很好,但是當我們在Windows下部署它時,它會崩潰。爲什麼我無法從OSGi/RCP/EclipseLink應用程序加載persistence.xml?

異常occures在下面的代碼:

Map<String, Object> connectionProperties = new HashMap<String, Object>(); 
connectionProperties.put(PersistenceUnitProperties.CLASSLOADER, 
     this.getClass().getClassLoader()); 
PersistenceProvider pp = new PersistenceProvider(); 
entityManagerFactory = pp.createEntityManagerFactory(
     "persistence_unit", connectionProperties); 

PersistenceProvider類是從org.eclipse.persistence.jpa.osgi包,ConnectionProperties中

這段代碼運行之後,我們得到由java.net.MalformedURLException引起了org.eclipse.persistence.exceptions.PersistenceUnitLoadingException。後來大量的調試,我可以告訴OSGi明確地發現這個persistence.xml(我們有一個persistence.xml位於錯誤的目錄,我們有不同的例外,說沒有可用的定義該持久單元的包),它可以很容易地檢索它(通過手動加載和讀取進行測試)。在我看來,PersistenceUnitProcessor無法在findPersistenceArchives方法中加載正確的存檔(看起來,它在找到META-INF/persistence.xml文件後返回一個存檔,但此存檔爲空)。

我在鏈接http://www.eclipse.org/forums/index.php/mv/msg/218408/693584/#msg_693584下找到類似的東西。雖然它不完全相同,但它涵蓋了eclipse和eclipseLink,但它不適用於我們的項目。

我認爲對庫進行更深入的調試是毫無意義的,錯誤必須是產品導出配置或代碼中的一些錯誤。

兩個系統(Windows XP和Ubuntu的11.04)使用相同的Eclipse 3.7添加了完全相同的包裝,都有Java的1.6u26,的EclipseLink 2.3.0

任何想法?

編輯:

只是爲了確保它不是別的東西,我們可能會在我們的項目已經搞砸了(因爲它現在是相當大的),我做了以下這些步驟清潔新項目:

  • 使用Hello RCP模板和產品配置創建新的插件項目。在SRC包
  • 創建META-INF/persistence.xml文件與以下內容:

    <?xml version="1.0" encoding="UTF-8"?> 
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
        <persistence-unit name="pu" transaction-type="RESOURCE_LOCAL"> 
        <class>DummyEntity</class> 
        <properties> 
         <property name="javax.persistence.jdbc.url" 
          value= database-url /> 
         <property name="javax.persistence.jdbc.user" value= database-user /> 
         <property name="javax.persistence.jdbc.password" value= database-password /> 
         <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" /> 
        </properties> 
    </persistence-unit> 
    </persistence> 
    
  • 類創建DummyEntity。

  • 加入到MANIFEST.MF文件:

    Import-Package: javax.persistence;jpa="2.0";version="2.0.3", 
    org.eclipse.persistence.config;version="2.3.0.v20110604-r9504", 
    org.eclipse.persistence.jpa;version="2.3.0.v20110604-r9504", 
    org.eclipse.persistence.jpa.osgi;version="2.3.0.v20110604-r9504" 
    JPA-PersistenceUnits: pu 
    
  • 加入需要的依賴於產品配置,製成DummyEntity JPA實體

  • 添加了代碼Activator.start:

    import javax.persistence.EntityManagerFactory; 
    import org.eclipse.persistence.config.PersistenceUnitProperties; 
    import org.eclipse.persistence.jpa.osgi.PersistenceProvider; 
    
    ... 
    
    Map<String, Object> connectionProperties = new HashMap<String, Object>(); 
    connectionProperties.put(PersistenceUnitProperties.CLASSLOADER, this 
         .getClass().getClassLoader()); 
    
    try { 
        EntityManagerFactory emf = new PersistenceProvider() 
          .createEntityManagerFactory("pu", connectionProperties); 
    
        log("Connection established"); 
    } catch (Exception e) { 
          // here some code to log the exception stack trace 
    } 
    
  • 導出到很好的可執行文件包。

雖然從eclipse下它流暢運行,運行部署包退換如下:

EXCEPTION 
    org.eclipse.persistence.exceptions.PersistenceUnitLoadingException : 
    Exception Description: An exception was thrown while trying to load persistence unit at url: bundleresource://34.fwk2279771 
    Internal Exception: Exception [EclipseLink-30004] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException 
    Exception Description: An exception was thrown while processing persistence.xml from URL: bundleresource://34.fwk2279771 
    Internal Exception: java.net.MalformedURLException 
    TRACE: 
    org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionLoadingFromUrl(PersistenceUnitLoadingException.java:99) 
    org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceArchive(PersistenceUnitProcessor.java:538) 
    org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.getPersistenceUnits(PersistenceUnitProcessor.java:444) 
    org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.initPersistenceUnits(JPAInitializer.java:282) 
    org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.initialize(JPAInitializer.java:265) 
    org.eclipse.persistence.jpa.osgi.PersistenceProvider.getInitializer(PersistenceProvider.java:91) 
    org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:71) 
    rcptest.Activator.start(Activator.java:66) 
    org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) 
    java.security.AccessController.doPrivileged(Native Method) 
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) 
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) 
    org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) 
    org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299) 
    org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:440) 
    org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:268) 
    org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) 
    org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:462) 
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216) 
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400) 
    org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476) 
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429) 
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417) 
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) 
    java.lang.ClassLoader.loadClass(Unknown Source) 
    org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:345) 
    org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:229) 
    org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1207) 
    org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) 
    org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) 
    org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) 
    org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) 
    org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:191) 
    org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
    org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
    org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) 
    org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    java.lang.reflect.Method.invoke(Unknown Source) 
    org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) 
    org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
    org.eclipse.equinox.launcher.Main.run(Main.java:1410) 

    org.eclipse.persistence.exceptions.PersistenceUnitLoadingException : 
    Exception Description: An exception was thrown while processing persistence.xml from URL: bundleresource://34.fwk2279771 
    Internal Exception: java.net.MalformedURLException 
    TRACE: 
    org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionProcessingPersistenceXML(PersistenceUnitLoadingException.java:117) 
    org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceXML(PersistenceUnitProcessor.java:579) 
    org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceArchive(PersistenceUnitProcessor.java:536) 
    org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.getPersistenceUnits(PersistenceUnitProcessor.java:444) 
    org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.initPersistenceUnits(JPAInitializer.java:282) 
    org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.initialize(JPAInitializer.java:265) 
    org.eclipse.persistence.jpa.osgi.PersistenceProvider.getInitializer(PersistenceProvider.java:91) 
    org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:71) 
    rcptest.Activator.start(Activator.java:66) 
    org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) 
    java.security.AccessController.doPrivileged(Native Method) 
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) 
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) 
    org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) 
    org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299) 
    org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:440) 
    org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:268) 
    org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) 
    org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:462) 
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216) 
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400) 
    org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476) 
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429) 
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417) 
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) 
    java.lang.ClassLoader.loadClass(Unknown Source) 
    org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:345) 
    org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:229) 
    org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1207) 
    org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) 
    org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) 
    org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) 
    org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) 
    org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:191) 
    org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
    org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
    org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) 
    org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    java.lang.reflect.Method.invoke(Unknown Source) 
    org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) 
    org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
    org.eclipse.equinox.launcher.Main.run(Main.java:1410) 

    java.net.MalformedURLException : null 
    TRACE: 
    java.net.URL.<init>(Unknown Source) 
    java.net.URL.<init>(Unknown Source) 
    java.net.URL.<init>(Unknown Source) 
    com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 
    com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(Unknown Source) 
    com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
    com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) 
    com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceXML(PersistenceUnitProcessor.java:577) 
    org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceArchive(PersistenceUnitProcessor.java:536) 
    org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.getPersistenceUnits(PersistenceUnitProcessor.java:444) 
    org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.initPersistenceUnits(JPAInitializer.java:282) 
    org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.initialize(JPAInitializer.java:265) 
    org.eclipse.persistence.jpa.osgi.PersistenceProvider.getInitializer(PersistenceProvider.java:91) 
    org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:71) 
    rcptest.Activator.start(Activator.java:66) 
    org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) 
    java.security.AccessController.doPrivileged(Native Method) 
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) 
    org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) 
    org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) 
    org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299) 
    org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:440) 
    org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:268) 
    org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) 
    org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:462) 
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216) 
    org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400) 
    org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476) 
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429) 
    org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417) 
    org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) 
    java.lang.ClassLoader.loadClass(Unknown Source) 
    org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:345) 
    org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:229) 
    org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1207) 
    org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) 
    org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) 
    org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) 
    org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) 
    org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:191) 
    org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
    org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
    org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) 
    org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    java.lang.reflect.Method.invoke(Unknown Source) 
    org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) 
    org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
    org.eclipse.equinox.launcher.Main.run(Main.java:1410) 
+0

這會更有幫助的是你可以包括整個堆棧跟蹤。 – Jon7

+1

完成,添加了一步一步的指示我做了什麼+堆棧跟蹤 – r3mbol

回答

1

回答這個問題是(與與I互聯網上找到一些類似的問題)遷移到休眠。

我認爲來自EclipseLink的PersistenceProvider不適用於bundleresource協議。無論如何,切換到Hibernate PersistenceProvider的工作就像一個魅力。

也許我補充說,這種遷移是相當容易,我們不得不主要問題是與re-attaching dettached entities with lazy-type joins(其實這個問題仍然纏着我們,現在我們已經實現了一個小的解決方法,但要回到它)。

+0

你真的認爲不可能使用Eclipselink作爲eclipse之外的包嗎? – Kris

+0

在EclipseLink 2.3.2 中修復了此問題我升級了,它消失了 – Kris

3

我們也有這個問題。

概括地說,我們的解決方案是子類ArchiveFactoryImpl(屬於JPA),覆蓋isJarInputStream方法,因此總是返回false(如果要執行更復雜的檢查變化..)

然後由系統屬性寄存器該亞類:

System.setProperty(SystemProperties.ARCHIVE_FACTORY, OurArchiveFactoryImpl.class.getName()); 

正常ArchiveFactoryImpl#isJarInputStream似乎反應從蝕3.7不同的起始(任何人可以證實這一點?)。 在該方法中,執行一個小技巧來檢查給定的url是否實際上是JarInputStream。看來eclipse 3.7有一個稍微不同的方法來解決導致isJarInputStream返回true的url。

相關問題