[ https://issues.apache.org/jira/browse/OPENJPA-1962?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Joshua Shrader closed OPENJPA-1962. ----------------------------------- Resolution: Invalid Sorry... this isn't a bug. It was a problem with the classloader and JNDI, as explained here http://download.oracle.com/javase/jndi/tutorial/beyond/misc/classloader.html. For future reference, my chunk of code really needs to be ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); URLClassLoader loader = new URLClassLoader(new URL[]{new URL(URL_OF_JAR)}, this.getClass().getClassLoader()); try { Thread.currentThread().setContextClassLoader(loader); Class<Runnable> clazz = (Class<Runnable>) loader.loadClass("test.CustomerTestRunner"); clazz.newInstance().run(); } finally { Thread.currentThread().setContextClassLoader(contextClassLoader); } > openjpa uses application ClassLoader for resolving BrokerFactory (revisited > again) > ---------------------------------------------------------------------------------- > > Key: OPENJPA-1962 > URL: https://issues.apache.org/jira/browse/OPENJPA-1962 > Project: OpenJPA > Issue Type: Bug > Affects Versions: 2.1.0 > Reporter: Joshua Shrader > Labels: classloader, url > > Previous references to the "The named BrokerFactory > 'org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory' is not valid." exception > thrown in Bootstrap.getFactoryClass() have applied to OSGi environments. > We're having the same problem, although we are not using OSGi. > Our environment may be a bit non-standard, but I think it is (or should be) a > valid use case. It is also possible that I'm missing a classloader subtlety, > but I don't think so. > We developed a very simple application that uses openjpa to insert a couple > items into a database. We jar the application, including the > openjpa-all-2.1.0.jar, and deploy it on a webserver. We then use a > URLClassLoader from a host program to access a class from this jar. For > example, in the host program: > URLClassLoader loader = new URLClassLoader(new URL[]{new URL(URL_OF_JAR)}, > this.getClass().getClassLoader()); > Class<Runnable> clazz = (Class<Runnable>) > loader.loadClass("test.CustomerTestRunner"); > clazz.newInstance().run(); > The application accessing the jar on the webserver knows nothing about > openjpa. The test.CustomerTestRunner uses openjpa to create and persist a > couple entities. This causes the error: > Exception in thread "main" javax.persistence.PersistenceException: Explicit > persistence provider error(s) occurred for "testjpa" after trying the > following discovered implementations: > org.apache.openjpa.persistence.PersistenceProviderImpl from provider: > org.apache.openjpa.persistence.PersistenceProviderImpl > which is ultimately caused by > Caused by: java.lang.ClassNotFoundException: > org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory > at java.net.URLClassLoader$1.run(URLClassLoader.java:202) > at java.security.AccessController.doPrivileged(Native Method) > at java.net.URLClassLoader.findClass(URLClassLoader.java:190) > at java.lang.ClassLoader.loadClass(ClassLoader.java:307) > at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) > at java.lang.ClassLoader.loadClass(ClassLoader.java:248) > at java.lang.Class.forName0(Native Method) > at java.lang.Class.forName(Class.java:247) > at > org.apache.openjpa.kernel.Bootstrap.getFactoryClass(Bootstrap.java:164) > ... 11 more > Putting the jar directly on the classpath fixes the problem, but defeats the > purpose. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira