Hmm. This one is a bit tricky... The big question on both our minds
is likely, what *is* in the classpath?
With maven it's easy to see via adding "-X" as an argument, which will
set the log level to debug and cause all sorts of information to be
printed, including the test classpath. It's a lot of output, so
you'll have to scan for a while to find it.
Alternatively... we can be a little naughty :) Here's a chunk of code
which will pull the classpath out of the classloader and print it. It
works on a URLClassLoader which is a superclass of nearly every
classloader out there.
import java.net.URLClassLoader;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.lang.reflect.Field;
public class PrintClasspath {
public static void printClasspath(URLClassLoader loader) throws
Exception {
String name = loader.getClass().getSimpleName() + "@" +
loader.hashCode();
for (URL url : getURLs(loader)) {
System.out.println(name + " = " + url.toExternalForm());
}
}
private static URL[] getURLs(URLClassLoader loader) throws
Exception {
return ((sun.misc.URLClassPath)
getUcpField().get(loader)).getURLs();
}
private static Field getUcpField() throws Exception {
return (Field) AccessController.doPrivileged(new
PrivilegedAction() {
public Object run() {
try {
Field ucp =
URLClassLoader.class.getDeclaredField("ucp");
ucp.setAccessible(true);
return ucp;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
}
Use this in your TestCase to get a clean and short printout of the
test classpath and again inside the bean factory.
The second thing I notice is that your TestCase is inheriting from
org.springframework.test.jpa.AbstractJpaTests, which makes me realize
your spring factory bean is likely to get executed before your test's
setUp() method. We should probably revise things so OpenEJB
initializes via your spring xml file as well.
The revised factories might look like this:
public class OpenEjbFactoryBean implements
org.springframework.beans.factory.FactoryBean {
private Properties properties = new Properties();
public OpenEjbFactoryBean() {
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.LocalInitialContextFactory");
}
public Properties getJndiEnvironment() {
return properties;
}
public void setJndiEnvironment(Properties properties) {
this.properties.putAll(properties);
}
public Object getObject() {
try {
return new InitialContext(properties);
} catch (NamingException e) {
throw new RuntimeException(e);
}
}
public Class getObjectType(){
return Context.class;
}
boolean isSingleton() {
return true;
}
}
public class EntityManagerFactoryBean implements
org.springframework.beans.factory.FactoryBean {
private Context context;
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public Object getObject() {
try {
ResourceLocal bean = (ResourceLocal)
context.lookup("ResourceBeanLocal");
return bean.getEntityManager();
} catch (NamingException e) {
throw new RuntimeException(e);
}
}
public Class getObjectType(){
return EntityManager.class;
}
boolean isSingleton() {
return true;
}
}
<bean id="OpenEjbContext" class="org.acme.OpenEjbFactoryBean">
<property name="jndiEnvironment">
<props>
<prop key="myDs">new://Resource?type=DataSource</prop>
<prop key="myDs.JdbcDriver">com.mysql.jdbc.Driver</prop>
<prop key="myDs.JdbcUrl">jdbc:mysql://localhost/midastest?
createDatabaseIfNotExist
=true&useUnicode=true&characterEncoding=utf-8</prop>
<prop key="myDs.UserName">root</prop>
<prop key="myDs.Password"></prop>
</props>
</property>
</bean>
<bean id="ApplicationEntityManager"
class="org.acme.EntityManagerFactoryBean">
<property name="context" ref="OpenEjbContext">
</bean>
Hope this helps, and thanks for posting. This will make a great doc
when we are done!
-David