Thanks for looking into this problem.... To answer your question, the file is a read/write object database. I tried externalizing the file instead of embedding it within the jar, unfortunately, using file://absolute_path throws the same exception.
As per your observation, I'm not sure I understand the last point. You mentioned " OsgiBundleResource try locate File by your bundle's location on the file system; But it doesn't exist, so exception raised." I'm trying to understand the fact where does it differ compared to a non-osgi environment ? I've the same code running w/o an issue as long as the file is in the classpath. On Thu, Jun 16, 2011 at 12:38 AM, ext2 <[email protected]> wrote: > > The immediate cause is : db4o/ ObjectContainerFactoryBean is ask for a file > on file system, so OsgiBundleResource cannot return the resource on the > classpath, the only thing OsgiBundleResource can do is try locate it from the > bundle's location, but it doesn't exists; > > I am not familiar with db4o, so I don't why it always ask for file , and > cannot ask for a input stream from class path resource; > > Is it a file only for read or a file for read/write? > 1) If it's a file only for read, maybe you can check the spring reference to > see if other properties could configure it; > 2) if it's a file for read/write (etc a database file store data), maybe you > should using store it on file system. > > > > > > > Spring dm 's OsgiBundleResource will try to locate the File from the location > where you bundle installed. > This means : > 1) resource has been find in classpath > 2) other application is try to use File relative to the bundle (here is the > Db4o.openFile). > 3) OsgiBundleResource try locate File by your bundle's location on the file > system; But it doesn't exist, so exception raised. > >> -----original ----- >> Sender: Shamik Bandopadhyay [mailto:[email protected]] >> Date: 2011/6/16 15:04 >> Receiver: [email protected] >> Subject: Re: Spring resource classpath issue >> >> I've checked that...here's the exception stack trace ... >> >> "caused by: java.io.FileNotFoundException: OSGi >> resource[classpath:taxonomy.db4o| >> nd.id=335|bnd.sym=taxonomydaoimplbundle] cannot be resolved to >> absolute file path >> at >> org.springframework.osgi.io.OsgiBundleResource.getFile(OsgiBundleResorce.j >> ava:345) >> at >> org.springmodules.db4o.ObjectContainerFactoryBean.afterPropertiesSet(bject >> ContainerFactoryBean.java:104) >> at >> org.springframework.beans.factory.support.AbstractAutowireCapableBeanactor >> y.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) >> at >> org.springframework.beans.factory.support.AbstractAutowireCapableBeanactor >> y.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) >> ... 45 more >> aused by: java.io.FileNotFoundException: OSGi >> resource[classpath:taxonomy.db4o|nd.id=335|bnd.sym=taxonomydaoimplbundle] >> cannot be resolved to absolute file pah because it does not reside in >> the file system: bundle://335.0:1/taxonomy.db4o >> >> at >> org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:242 >> >> at >> org.springframework.osgi.io.OsgiBundleResource.getFile(OsgiBundleReso >> rce.java:342) >> ... 48 more" >> >> The exception is being thrown from spring OsgiBundleResource.getFile() >> method. >> >> It happens when spring module ObjectContainerFactoryBean is trying to >> execute the following code : >> >> if (databaseFile != null) { >> container = Db4o.openFile(configuration, >> databaseFile.getFile().getAbsolutePath()); >> log.info("opened db4o local file-based objectContainer @" + >> ObjectUtils.getIdentityHexString(container)); >> } >> >> databaseFile is a org.springframework.core.io.Resource object whose >> value is being injected by spring app context, i.e. the db4o path >> (classpath:META-INF/spring/repo/test.db4o) . The exception is >> happening at OsgiBundleResource.getFile() when >> ObjectContainerFactoryBean is trying to execute >> databaseFile.getFile().getAbsolutePath()). >> >> Here's the getFile() method in OsgiBundleResource. >> >> public File getFile() throws IOException { >> // locate the file inside the bundle only known prefixes >> if (searchType != OsgiResourceUtils.PREFIX_TYPE_UNKNOWN) { >> String bundleLocation = bundle.getLocation(); >> int prefixIndex = >> bundleLocation.indexOf(ResourceUtils.FILE_URL_PREFIX); >> if (prefixIndex > -1) { >> bundleLocation = >> bundleLocation.substring(prefixIndex + >> ResourceUtils.FILE_URL_PREFIX.length()); >> } >> File file = new File(bundleLocation, path); >> if (file.exists()) { >> return file; >> } >> // fall back to the URL discovery (just in case) >> } >> >> try { >> return ResourceUtils.getFile(getURI(), >> getDescription()); >> } >> catch (IOException ioe) { >> throw (IOException) new >> FileNotFoundException(getDescription() >> + " cannot be resolved to absolute file >> path").initCause(ioe); >> } >> } >> >> On Wed, Jun 15, 2011 at 11:07 PM, ext2 <[email protected]> wrote: >> > According to your resource, the Spring has find the the resource in >> > classpath >> ( the url contains's the bundle id) >> > >> > But it seems the db4o is trying to use the classpath resource as a File. >> > Makesure if Db4o.openFile() can accept a classpath resource. if it cannot, >> Your exception will be reasonable;( I am not familiar with db4o, you can try >> it) >> > >> > I guess the exception is throw from Db4o, not from spring , is it? >> > >> > >> >> -----original----- >> >> Sender: Shamik Bandopadhyay [mailto:[email protected]] >> >> Date: 2011/6/15 9:25 >> >> Receiver: [email protected] >> >> Subject: Re: Spring resource classpath issue >> >> >> >> Well, even with setting the context class loader through activator, it >> >> didn't work out. I'm still facing the issue, not sure what else I can >> >> do at this point. I saw the following article which confirms that >> >> spring dm takes care of the thread context loader issue. >> >> >> >> >> http://blog.springsource.com/2008/05/02/running-spring-applications-on-osg >> >> i-with-the-springsource-application-platform/ >> >> >> >> On Tue, Jun 14, 2011 at 11:40 AM, Shamik Bandopadhyay <[email protected]> >> >> wrote: >> >> > Thanks for the link John...my understanding was spring-extender is >> >> > supposed to take care of setting the right classloader instead of us >> >> > doing it explicitly in activator. It doesn't seem to be very >> >> > efficient. I'll give it a try by writing an activator and load the >> >> > Spring application context .... >> >> > >> >> > On Tue, Jun 14, 2011 at 7:25 AM, <[email protected]> wrote: >> >> >> Take a look at this, >> >> >> >> >> >> http://www.dynamicjava.org/articles/osgi-matters/3rd-party-components-with >> >> >> -osgi/11-osgi-matters/43-3rd-party-components-incompatibility-problems?tmp >> >> l=component&print=1&page= >> >> >> >> >> >> Quoting Shamik Bandopadhyay <[email protected]>: >> >> >> >> >> >>> Well, that's the part which is puzzling. I don't see any reason why >> >> >>> Spring would use a seperate classloader.I've even tried including the >> >> >>> db4o file under >> >> >>> >> >> >>> >> >> >> <input-resource>META-INF/spring/repo/test.db4o=target/classes/META-INF/spr >> >> ing/repo/test.db4o</input-reource> >> >> >>> , but issue remains the same... >> >> >>> >> >> >>> On Mon, Jun 13, 2011 at 12:42 PM, <[email protected]> wrote: >> >> >>>> >> >> >>>> I'm no expert but my best guess would be that spring is trying to >> >> >>>> load >> >> >>>> the >> >> >>>> file from the wrong classloader. If I'm reading the spring source >> >> >>>> correctly, >> >> >>>> it will attempt to load "classpath:META-INF/spring/repo/test.db4o" >> from >> >> >>>> Thread.currentThread().getContextClassLoader() and then from >> >> >>>> ClassUtils.class.getClassLoader() if that fails. That's my 2 cents >> >> >>>> anyway. >> >> >>>> >> >> >>>> Quoting Shamik Bandopadhyay <[email protected]>: >> >> >>>> >> >> >>>>> The file is in the same bundle and located inside >> >> >>>>> src/resources/META-INF/spring/repo/test.db4o. I've confirmed this in >> >> >>>>> the generated bundle as well. >> >> >>>>> >> >> >>>>> On Mon, Jun 13, 2011 at 8:40 AM, Tribon Cheng <[email protected]> >> >> >>>>> wrote: >> >> >>>>>> >> >> >>>>>> Resources are loaded in the same way as classes. Make sure the file >> is >> >> >>>>>> under >> >> >>>>>> the classpath, and is exported if it is used in different bundle. >> >> >>>>>> 在 2011-6-13 下午11:25,"Shamik Bandopadhyay" <[email protected]> >> 写 >> >> 道: >> >> >>>>>>> >> >> >>>>>>> Hi, >> >> >>>>>>> >> >> >>>>>>> I'm trying to deploy a spring based bundle in osgi (fuse esb).In >> >> >>>>>>> spring context, I'm referring to a db4o file which is inside >> resources >> >> >>>>>>> folder. As per my understanding, a maven project will make sure >> >> >>>>>>> that >> >> >>>>>>> any file available under resources folder will be available in >> project >> >> >>>>>>> classpath. I've kept the file under >> >> >>>>>>> resources/META-INF/spring/repo/test.db4o. >> >> >>>>>>> >> >> >>>>>>> Here's the entry in spring context. >> >> >>>>>>> >> >> >>>>>>> <bean id="objectContainer" >> >> >>>>>>> class="org.springmodules.db4o.ObjectContainerFactoryBean"> >> >> >>>>>>> <property name="databaseFile" >> >> >>>>>>> value="classpath:META-INF/spring/repo/test.db4o" /> >> >> >>>>>>> </bean> >> >> >>>>>>> >> >> >>>>>>> Once I install and try to start the application, I'm getting the >> >> >>>>>>> following exception. >> >> >>>>>>> >> >> >>>>>>> "java.io.FileNotFoundException: OSGi >> >> >>>>>>> resource[classpath:META-INF/spring/repo/test.db4o|bnd.id >> >> >>>>>> >> >> >>>>>> =258|bnd.sym=taxonomydaoimplbundle] >> >> >>>>>>> >> >> >>>>>>> cannot be resolved to absolute file path because it does not >> >> >>>>>>> reside >> >> in >> >> >>>>>>> the file system: bundle://258.0:1/META-INF/spring/repo/test.db4o" >> >> >>>>>>> >> >> >>>>>>> I've tried different combinations, but Felix doesn't seem to >> recognize >> >> >>>>>>> this file. Any pointer will be appreciated. >> >> >>>>>>> >> >> >>>>>>> - Thanks >> >> >>>>>>> >> >> >>>>>>> >> >> --------------------------------------------------------------------- >> >> >>>>>>> To unsubscribe, e-mail: [email protected] >> >> >>>>>>> For additional commands, e-mail: [email protected] >> >> >>>>>>> >> >> >>>>>> >> >> >>>>> >> >> >>>>> >> >> --------------------------------------------------------------------- >> >> >>>>> To unsubscribe, e-mail: [email protected] >> >> >>>>> For additional commands, e-mail: [email protected] >> >> >>>>> >> >> >>>>> >> >> >>>> >> >> >>>> >> >> >>>> >> >> >>>> >> >> >>>> >> --------------------------------------------------------------------- >> >> >>>> To unsubscribe, e-mail: [email protected] >> >> >>>> For additional commands, e-mail: [email protected] >> >> >>>> >> >> >>>> >> >> >>> >> >> >>> >> --------------------------------------------------------------------- >> >> >>> To unsubscribe, e-mail: [email protected] >> >> >>> For additional commands, e-mail: [email protected] >> >> >>> >> >> >>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> --------------------------------------------------------------------- >> >> >> To unsubscribe, e-mail: [email protected] >> >> >> For additional commands, e-mail: [email protected] >> >> >> >> >> >> >> >> > >> >> >> >> --------------------------------------------------------------------- >> >> To unsubscribe, e-mail: [email protected] >> >> For additional commands, e-mail: [email protected] >> > >> > >> > >> > >> > --------------------------------------------------------------------- >> > To unsubscribe, e-mail: [email protected] >> > For additional commands, e-mail: [email protected] >> > >> > >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]

