2010-07-13 26 views
2

我在Spring集成的Eclipse RCP應用程序中工作,但在彈出框架初始化應用程序啓動時出現錯誤。爲什麼包名不能在jar中解析?

我在Activator.java代碼如下:

... 
    public void start(BundleContext context) throws Exception { 
     super.start(context); 

     initializeApplicationContext(); 

     plugin = this; 
    } 

    private void initializeApplicationContext() { 
     ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); 
     try { 
      Thread.currentThread().setContextClassLoader(
        this.getClass().getClassLoader()); 
      ctx = new ClassPathXmlApplicationContext(SPRING_CONFIGS); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } finally { 
      Thread.currentThread().setContextClassLoader(oldLoader); 
     } 
    } 
... 

唯一的例外是:

2010-07-13 16:38:42,421 INFO [AbstractApplicationContext] - Refreshing org[email protected]be76c7: display name [org[email protected]be76c7]; startup date [Tue Jul 13 16:38:42 CST 2010]; root of context hierarchy 
2010-07-13 16:38:42,656 INFO [XmlBeanDefinitionReader] - Loading XML bean definitions from class path resource [applicationContext.xml] 
org.springframework.beans.factory.BeanDefinitionStoreException: I/O failure during classpath scanning; nested exception is java.io.FileNotFoundException: JAR entry net/interttimes/ not found in D:\Workspaces\MyEclipse 8.x\formicary-client2\lib\formicary-remote.jar 
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:222) 
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:201) 
    at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84) 
    at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:69) 
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1297) 
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1287) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:92) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:507) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:80) 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123) 
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:422) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93) 
    at net.interttimes.formicary.rcp.Activator.initializeApplicationContext(Activator.java:62) 
    at net.interttimes.formicary.rcp.Activator.start(Activator.java:47) 
    ... 
Caused by: java.io.FileNotFoundException: JAR entry net/interttimes/ not found in D:\Workspaces\MyEclipse 8.x\formicary-client2\lib\formicary-remote.jar 
    at sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:122) 
    at sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:71) 
    ... 65 more 

我的蟻巢,remote.jar的包名開始,所以我 'net.interttimes。'不明白,爲什麼包名不能被解析?

謝謝你關注我的問題!

回答

0

我認爲這可能是因爲JAR文件(基本上是ZIP文件)每個文件都有一個條目,並且該文件的路徑存儲在其條目中,並且不必爲條目該文件路徑中的任何目錄(儘管這是允許的)。

可以使用

jar -tf <jar_file> 

檢查您的JAR文件如果您看不到您正在搜索的目錄,這可以解釋爲什麼你會得到一個FileNotFoundException異常單獨的一行。

例如,對於一個條目:

a/b/c.txt 

的目錄「a」和「B」不必在JAR自己的條目(除非您單獨添加的話)。

你會看到這樣的事情,如果是這樣:

a 
a/b 
a/b/c.txt 
+0

謝謝!我使用'jar -tf'檢查了我的jar文件,輸出: META-INF/MANIFEST.MF net/interttimes/formicary/remote/IRegistHessianService.class ... – newton 2010-07-13 09:32:12

0

深入瞭解JAR文件中(這實際上是一個zip大家都知道),春季預計的路徑

/net/interttimes/ 

裏面。有時同時jar'ing的類,我們意外地添加bin文件夾中的罐子,有一些像

/bin/net/interttimes/ 

(這將是我最常見的錯誤。)

2

謝謝大家了!

我的問題解決了。這是因爲我使用eclipse導出jar文件,並沒有檢查'Add directory entries'選項。它在我檢查這個選項後有效。^_^

相關問題