I am trying to connect my Grails application to a Firebird database.
I am using:
So far, this is what I have done:
runtime "org.firebirdsql.jdbc:jaybird:2.2.2"
to the dependencies section.The dataSource section:
dataSource {
pooled = false
driverClassName = "org.firebirdsql.jdbc.FBDriver"
dialect = "org.hibernate.dialect.FirebirdDialect"
username = "SYSDBA"
password = "masterkey"
}
The hibernate section:
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = true
cache.provider_class = 'org.firebirdsql.pool.FBSimpleDataSource'
}
(I have also had cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory
and cache.provider_class = 'com.opensymphony.oscache.hibernate.OSCacheProvider'
in the above section on separate occasions, but neither made any difference.)
When running my Grails app, startup fails with a huge error that boils down to the following message:
java.lang.IllegalStateException: Could not load JDBC driver class [org.firebirdsql.jdbc.FBDriver]
I have searched the web far and wide, but I cannot find an example of a working Grails/Firebird configuration anywhere. There is a fix floating around that involves copying minij2ee.jar, but that is for a different error message. Also, people have suggested emptying the .grails folder – I have tried this, to no avail.
Could someone please advise, how can I get Grails to work with Firebird?
Here is the whole exception, though it seems to repeat a couple of times during startup:
->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 138 | run in java.util.concurrent.FutureTask
| 886 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run in ''
^ 662 | run . . in java.lang.Thread
Caused by BeanCreationException: Error creating bean with name 'sessionFactory':
Cannot resolve reference to bean 'dataSource' while setting bean property 'data
Source'; nested exception is org.springframework.beans.factory.BeanCreationExcep
tion: Error creating bean with name 'dataSource': Cannot resolve reference to be
an 'dataSourceUnproxied' while setting constructor argument; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean wi
th name 'dataSourceUnproxied': Error setting property values; nested exception i
s org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessE
xceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException:
Property 'driverClassName' threw exception; nested exception is java.lang.Illega
lStateException: Could not load JDBC driver class [org.firebirdsql.jdbc.FBDriver
]
Running --stacktrace with --verbose:
| Error Error running script --stacktrace --verbose: Cannot invoke method findAl
l() on null object
java.lang.NullPointerException: Cannot invoke method findAll() on null object
at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:7
7)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaC
lassSite.java:45)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSi
teArray.java:45)
at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.j
ava:32)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSi
teArray.java:45)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMeta
MethodSite.java:55)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCa
llSite.java:116)
at org.codehaus.groovy.grails.cli.ScriptNameResolver.resolvesTo(ScriptNa
meResolver.groovy:30)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner.getPotentialScripts
(GrailsScriptRunner.java:489)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner.executeScriptWithCa
ching(GrailsScriptRunner.java:429)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner.executeScriptWithCa
ching(GrailsScriptRunner.java:416)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner$executeScriptWithCa
ching.call(Unknown Source)
at org.codehaus.groovy.grails.cli.interactive.InteractiveMode.parseAndEx
ecute(InteractiveMode.groovy:280)
at org.codehaus.groovy.grails.cli.interactive.InteractiveMode$parseAndEx
ecute.callCurrent(Unknown Source)
at org.codehaus.groovy.grails.cli.interactive.InteractiveMode.run(Intera
ctiveMode.groovy:133)
at org.codehaus.groovy.grails.cli.interactive.InteractiveMode$run.call(U
nknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSi
teArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCa
llSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCa
llSite.java:112)
at RunApp$_run_closure7_closure11.doCall(RunApp:127)
at RunApp$_run_closure7_closure11.doCall(RunApp)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(Refl
ectiveInterceptor.java:1243)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:
90)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1082)
at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1106)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:906)
at groovy.lang.Closure.call(Closure.java:412)
at groovy.lang.Closure.call(Closure.java:406)
at groovy.lang.Closure.run(Closure.java:490)
at java.lang.Thread.run(Thread.java:662)
| Error Error running script --stacktrace --verbose: Cannot invoke method findAl
l() on null object
Here is the repositories block from my BuildConfig.groovy
file:
repositories {
inherits true // Whether to inherit repository definitions from plugins
grailsPlugins()
grailsHome()
grailsCentral()
mavenLocal()
mavenCentral()
// uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories
mavenRepo "http://snapshots.repository.codehaus.org"
mavenRepo "http://repository.codehaus.org"
mavenRepo "http://download.java.net/maven/2/"
mavenRepo "http://repository.jboss.com/maven2/"
}
SQL> CONNECT "/databases/firebird/MY_EMPLOYEE.FDB" If connecting remotely (using TCP/IP), use the CONNECT statement with the server name and complete file path of the database or, an alias. When using the full path, remember to ensure that the server name is separated from the database path with a colon.
The Firebird Project is a commercially independent project of C and C++ programmers, technical advisors and supporters developing and enhancing a multi-platform relational database management system based on the source code released by Inprise Corp (now known as Borland Software Corp) on 25 July, 2000.
You are probably missing a required dependency of Jaybird. You need to include the connector-api-1.5.jar
(in the lib
folder of the Jaybird distribution) on the classpath. The alternative is to use jaybird-full-2.2.2.jar
(which includes the classes of connector-api-1.5.jar
).
EDIT
Out of some curiosity, I installed grails and gave it a go. I initially also got a similar error (using grails console
) and the stacktrace showed me java.lang.NoClassDefFoundError: javax/resource/ResourceException
. It looks like grails - contrary to the documentation - does not retrieve transitive dependencies (this was a wong, see EDIT 2).
After I explicitly added a runtime dependency on 'javax.resource:connector-api:1.5'
, eg:
dependencies {
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
// runtime 'mysql:mysql-connector-java:5.1.22'
runtime 'org.firebirdsql.jdbc:jaybird-jdk17:2.2.2',
'javax.resource:connector-api:1.5'
}
With this additional dependency it worked. As the connector-api
is normally provided by an application server, it might be better to specify this one as provided
instead (you might want to check with your actual deployment environment).
If you need support for retrieval of generated keys (or Gorm might need it), then I'd suggest you also add 'org.antlr:antlr-runtime:3.4'
(as a runtime
dependency).
EDIT 2
After some additional testing, it looks like first installing the downloaded jaybird libraries into lib
, and then declaring a dependency will make ivy create a dependency on that local library instead of retrieving it from maven. After removing the jaybird library from the lib folder and removing the org.firebirdsql.jdbc
folder from my Ivy cache it correctly downloaded it from Maven, including the connector-api
dependency.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With