2010-07-13 48 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'选项。它在我检查这个选项后有效。^_^

相关问题