[ 
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

Reply via email to