The article is nice, and I'm going to look at using your technique in the future (maybe this time if I keep having issues). I am actually working towards something much simpler though.
My Task:
Code:
private void setupBeanFactory() throws BeansException, FileNotFoundException, ClassNotFoundException{
Class.forName("org.springframework.jdbc.datasource.DriverManagerDataSource");
FileSystemXmlApplicationContext cp2 = new FileSystemXmlApplicationContext("etc/config/config.xml");
}
/**
* The main point of entry when ant calls our custom task.
*/
public void execute() throws BuildException {
try {
setupBeanFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
My config.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- our jndi datasource -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url">
<value>jdbc:mysql://localhost/dbName?autoReconnect=true</value>
</property>
<property name="username">
<value>password</value>
</property>
<property name="password">
<value>password</value>
</property>
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
</bean>
<!-- create the session factory with the correct dialect with our datasource -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
net.sf.hibernate.dialect.MySQLDialect
</prop>
<!-- <prop key="hibernate.show_sql">
true
</prop>-->
</props>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>classpath:my class mappings directory</value>
</list>
</property>
</bean>
<!-- create the hibernate template based on our session factory -->
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</beans>
Now when Ant executes I get this stack trace:
Code:
[exportDomainData] (xml.XmlBeanDefinitionReader 119 ) Loading XML bean definitions from file [C:\java\eclipse\workspace\hit\etc\config\config.xml]
[exportDomainData] org.springframework.beans.factory.BeanDefinitionStoreException: Error registering bean with name 'dataSource' defined in file [C:\java\eclipse\workspace\hit\etc\config\config.xml]: Bean class [org.springframework.jdbc.datasource.DriverManagerDataSource] not found; nested exception is java.lang.ClassNotFoundException: org.springframework.jdbc.datasource.DriverManagerDataSource
[exportDomainData] java.lang.ClassNotFoundException: org.springframework.jdbc.datasource.DriverManagerDataSource
[exportDomainData] at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
[exportDomainData] at java.security.AccessController.doPrivileged(Native Method)
[exportDomainData] at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
[exportDomainData] at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
[exportDomainData] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
[exportDomainData] at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
[exportDomainData] at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
[exportDomainData] at java.lang.Class.forName0(Native Method)
[exportDomainData] at java.lang.Class.forName(Class.java:219)
[exportDomainData] at org.springframework.beans.factory.support.BeanDefinitionReaderUtils.createBeanDefinition(BeanDefinitionReaderUtils.java:60)
[exportDomainData] at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.parseBeanDefinition(DefaultXmlBeanDefinitionParser.java:306)
[exportDomainData] at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.parseBeanDefinition(DefaultXmlBeanDefinitionParser.java:274)
[exportDomainData] at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.registerBeanDefinitions(DefaultXmlBeanDefinitionParser.java:186)
[exportDomainData] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:175)
[exportDomainData] at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:133)
[exportDomainData] at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:99)
[exportDomainData] at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:102)
[exportDomainData] at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:70)
[exportDomainData] at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:87)
[exportDomainData] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:262)
[exportDomainData] at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:82)
[exportDomainData] at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:67)
[exportDomainData] at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:58)
[exportDomainData] at com.sourceallies.hit.util.ant.DomainDataExportTask.setupBeanFactory(Unknown Source)
[exportDomainData] at com.sourceallies.hit.util.ant.DomainDataExportTask.execute(Unknown Source)
[exportDomainData] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[exportDomainData] at org.apache.tools.ant.Task.perform(Task.java:364)
[exportDomainData] at org.apache.tools.ant.Target.execute(Target.java:341)
[exportDomainData] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[exportDomainData] at org.apache.tools.ant.Project.executeTarget(Project.java:1214)
[exportDomainData] at org.apache.tools.ant.Project.executeTargets(Project.java:1062)
[exportDomainData] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:387)
[exportDomainData] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:136)
Note the call to Class.forName() that loads the same class right before I try to load the ApplicationContext. It succeeds, and you can see from the stack trace that my Spring configuration file is being propertly loaded and read, but barfs when trying to instantiate the DriverManager. Why?
I'm a relative Spring newbie, and I'm pretty sure there's something fundamental I'm missing here, but what is it?
BTW - nice article. I've bookmarked it for future use as I wish to do more Ant/Spring stuff, but this is a quick and dirty and I can't make that work.
Why won't the FileSystemXmlApplicationContext load a class from the same classpath that the code on the preceding line is using?
Thanks again for the help.
Brian