Java 为什么不能在jar中解析包名?
我正在使用spring集成的EclipseRCP应用程序,但在应用程序启动时spring框架初始化时出错 下面是我在Activator.java中的代码:Java 为什么不能在jar中解析包名?,java,eclipse,spring,eclipse-rcp,Java,Eclipse,Spring,Eclipse Rcp,我正在使用spring集成的EclipseRCP应用程序,但在应用程序启动时spring框架初始化时出错 下面是我在Activator.java中的代码: ... public void start(BundleContext context) throws Exception { super.start(context); initializeApplicationContext(); plugin = this; }
...
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.springframework.context.support.ClassPathXmlApplicationContext@be76c7: display name [org.springframework.context.support.ClassPathXmlApplicationContext@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
2010-07-13 16:38:42421信息[AbstractApplicationContext]-刷新org.springframework.context.support。ClassPathXmlApplicationContext@be76c7:显示名称[org.springframework.context.support]。ClassPathXmlApplicationContext@be76c7]; 启动日期【2010年7月13日星期二16:38:42 CST】;上下文层次结构的根
2010-07-13 16:38:42656信息[XmlBeanDefinitionReader]-从类路径资源[applicationContext.XML]加载XMLBean定义
org.springframework.beans.factory.BeanDefinitionStoreException:类路径扫描期间I/O失败;嵌套异常为java.io.FileNotFoundException:JAR条目net/intertimes/未在D:\Workspaces\MyEclipse 8.x\formicary-client2\lib\formicary-remote.JAR中找到
位于org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:222)
位于org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:201)
位于org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
位于org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:69)
位于org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1297)
位于org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1287)
位于org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)
位于org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:92)
位于org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:507)
位于org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398)
位于org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
位于org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
位于org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
位于org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
位于org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
位于org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
位于org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113)
位于org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:80)
位于org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
位于org.springframework.context.support.AbstractApplicationContext.GettainFreshBeanFactory(AbstractApplicationContext.java:422)
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139)
位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:93)
在net.intertimes.formicary.rcp.Activator.initializeApplicationContext(Activator.java:62)中
at net.intertimes.formicary.rcp.Activator.start(Activator.java:47)
...
原因:java.io.FileNotFoundException:JAR entry net/intertimes/未在D:\workspace\MyEclipse 8.x\formicary-client2\lib\formicary-remote.JAR中找到
位于sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:122)
位于sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:71)
... 65多
我的formicary remote.jar的包名以“net.intertimes”开头,所以我不明白,为什么包名不能被解析
谢谢你关注我的问题 我认为这可能是因为JAR文件(基本上是ZIP文件)每个文件都有一个条目,该文件的路径存储在其条目中,并且该文件路径中的任何目录都不必有条目(尽管这是允许的) 您可以使用
jar -tf <jar_file>
目录“a”和“b”在JAR中不一定有它们自己的条目(除非您单独添加它们)
你会看到这样的情况,如果是这样的话:
a
a/b
a/b/c.txt
查看一下jar文件(我们都知道它实际上是一个zip),spring需要一个路径
/net/interttimes/
里面。有时,在jar'ing类时,我们意外地将bin文件夹添加到jar中,并有如下内容
/bin/net/interttimes/
(这是我最常犯的错误。)谢谢大家
我的问题解决了。这是因为我使用eclipse导出jar,并且没有选中“添加目录条目”选项。我选中此选项后,它就可以工作了^_^ 谢谢大家!!我使用“jar-tf”检查了我的jar文件,输出:META-INF/MANIFEST.MF net/intertimes/formicary/remote/IRegistHessianService.class。。。
/bin/net/interttimes/