2013-03-19 91 views
0

我有一個插件,我在Equinox容器中運行。在插件jar中,包含一個/ bin目錄,其中包含我想運行的可執行文件和相關的共享庫。我試圖讓可執行文件(/ bin)中的父路徑,但我收到以下異常:OSGI/Equinox Bundle Resource:URI Scheme不是文件

Exception in thread "SpringOsgiExtenderThread-88" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testLauncher' defined in URL [bundleentry://105.fwk10703525/META-INF/spring/service.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.test.TestLauncher]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: URI scheme is not "file" 
     at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:288) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
     at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$1600(AbstractDelegatedExecutionApplicationContext.java:69) 
     at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:355) 
     at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) 
     at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) 
     at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) 
     at java.lang.Thread.run(Thread.java:619) 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.test.TestLauncher]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: URI scheme is not "file" 
     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141) 
     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:108) 
     at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:280) 
     ... 16 more 
Caused by: java.lang.IllegalArgumentException: URI scheme is not "file" 
     at java.io.File.<init>(File.java:366) 
     at com.test.TestLauncher.<init>(TestLauncher.java:23) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126) 
     ... 18 more 

下面的代碼顯示了我的構造函數試圖獲取資源變量的父路徑(如/ bin) 。在新的File(binPath.getURI())命令中拋出異常。資源變量使用下面的spring context定義傳入。

public Launcher(Resource resource) { 
    try { 
     binFile = resource.getURL().getFile();    
     String binPath = new File(binPath.getURI()).getParentFile().getAbsolutePath(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     System.out.println("TestLauncher Exception found"); 
     e.printStackTrace(); 
    } 
} 

Spring上下文定義:

<bean id="testResource" class="org.springframework.core.io.ClassPathResource"> 
    <constructor-arg value="\bin\test" /> 
</bean> 

回答

0

我認爲,所有你需要做的是一個文件URI,如提供路徑值:

<bean id="testResource" class="org.springframework.core.io.ClassPathResource"> 
    <constructor-arg value="file:../test" /> 
</bean> 

在這裏,我只需根據我認爲是您的類路徑來猜測您需要的路徑即可。您可能需要嘗試使用不同的路徑值才能使其工作。

祝你好運!