我正在尝试在OSGI中运行Apache Wink,并使用Felix白板将资源注册为服务。在极简主义的OSGI环境中,捆绑包按预期工作。但是,然后我将这个包转移到了Eclipse Equinox环境中,在那里我正在开发一个依赖于它的插件。我开始收到这个错误。
May 22, 2013 11:19:59 AM org.apache.wink.server.internal.application.ApplicationProcessor processWinkApplication
SEVERE: An exception occurred during processing of the com.yarcdata.rest.Repositories instance. This instance is ignored.
java.lang.IllegalArgumentException: interface javax.servlet.http.HttpServletRequest is not visible from class loader
at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:461)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:690)
at org.apache.wink.common.internal.registry.ContextAccessor.getContextFromAccessor(ContextAccessor.java:92)我想我已经安装了所有必需的捆绑包,如果我开始查找导出HttpServletRequest的捆绑包,我会看到:
g! lb | grep ervlet
311|Resolved | 4|Servlet API Bundle (3.0.0.v201112011016)
394|Starting | 4|Http Services Servlet (1.1.300.v20120912-130548)
444|Resolved | 4|Jetty :: Servlet Handling (8.1.3.v20120522)
578|Resolved | 4|jersey-servlet (1.12.0)
580|Resolved | 4|jersey-servlet (1.17.1)
588|Active | 4|Java Servlet API (3.0.1)
589|Resolved | 4|javax.servlet.api (2.5.0)
590|Resolved | 4|javax.servlet.jstl (1.1.2)
622|Active | 4|Servlet Specification API (2.5.0)
678|Resolved | 4|Spring Web Servlet (2.5.6)
g! bundle 588
javax.servlet-api_3.0.1 [588]
Id=588, Status=ACTIVE Data Root=/wspaces/tbcPlugin/.metadata/.plugins/org.eclipse.pde.core/Eclipse Application/org.eclipse.osgi/bundles/588/data
"No registered services."
No services in use.
Exported packages
javax.servlet; version="3.0.0"[exported]
javax.servlet.descriptor; version="3.0.0"[exported]
javax.servlet.annotation; version="3.0.0"[exported]
javax.servlet.http; version="3.0.0"[exported]
No imported packages
No fragment bundles
Named class space
javax.servlet-api; bundle-version="3.0.1"[provided]
No required bundles因此,由于Wink的完整包是javax.servlet.http.HttpServletRequest,我希望捆绑包588处于活动状态来解决Wink的问题。它是活动的,并且它会导出包,还需要什么吗?让我们来看看它正在寻找的是什么版本:
g! lb | grep mdatu
595|Resolved | 4|Amdatu Web - JAX RS (1.0.0)
596|Active | 4|Amdatu Web - Apache Wink Application (1.0.1)
g! bundle 596
org.amdatu.web.rest.wink_1.0.1 [596]
Id=596, Status=ACTIVE Data Root=/wspaces/tbcPlugin/.metadata/.plugins/org.eclipse.pde.core/Eclipse Application/org.eclipse.osgi/bundles/596/data
"Registered Services"
{org.amdatu.web.rest.jaxrs.JaxRsSpi}={service.id=139}
{javax.servlet.Servlet}={init.applicationConfigLocation=/conf/application.properties, alias=/myresource, service.id=140}
{javax.servlet.Servlet}={init.applicationConfigLocation=/conf/application.properties, alias=/protocol, service.id=141}
{javax.servlet.Servlet}={init.applicationConfigLocation=/conf/application.properties, alias=/repositories, service.id=142}
{org.osgi.service.cm.ManagedService}={service.pid=org.amdatu.web.rest.wink, org.amdatu.tenant.pid=org.amdatu.tenant.PLATFORM, service.id=143}
Services in use:
{java.lang.Object}={osgi.command.function=[confapply], osgi.command.scope=equinox, service.id=110}
...
No exported packages
Imported packages
javax.activation; version="0.0.0"<org.eclipse.osgi_3.8.2.v20130124-134944 [0]>
javax.annotation; version="0.0.0"<org.eclipse.osgi_3.8.2.v20130124-134944 [0]>
javax.servlet; version="3.0.0"<javax.servlet-api_3.0.1 [588]>
javax.servlet.http; version="3.0.0"<javax.servlet-api_3.0.1 [588]>发布于 2013-05-23 05:39:06
看起来您有多个包可以导出Servlet API包(例如588、589和622,可能还有其他包)。因此,您的捆绑包导入的包可能与Apache Wink捆绑包导入的包不同。在普通的Java类加载规则下,只有当两个包具有相同的名称和由相同的类加载器加载时,它们才被认为是“相同的”;在OSGi下,这意味着它们需要由相同的包导出。
Wink报告说您无法查看servlet包...这实际上意味着您无法看到它正在使用的同一个servlet包。
尽管OSGi可以处理同一包的多个版本化导出,但如果您尝试仅从一个捆绑包中导出每个包,您的工作就会轻松得多。因此,在第一个实例中,您应该删除所有这些多余的API包。
发布于 2013-05-23 06:11:51
您可以在ContextAccessor.java:92上找到以下代码片段
(T)Proxy.newProxyInstance(Injectable.class.getClassLoader(),
new Class[] {contextClass},
...如您所见,使用的可注入类的类加载器也在wink-common.jar中。但是,如果您查看wink-commons.jar的MANIFEST.MF文件,您将看到javax.servlet.http包不是由该模块导入的。
我不知道这门课的真正逻辑。如果程序员没有很好的理由使用类加载器加载的可注入组件,那么使用contextClass的类加载器来生成代理可能更好。你可以问一下wink开发人员。
https://stackoverflow.com/questions/16701329
复制相似问题