2012-12-17 33 views
1

我正在實現一個包含搜索服務(AbstractService)的osgi包。 此服務包含一種獲取內容節點列表作爲NodeIterator對象的方法。調用session.getWorkspace()。getQuery()導致錯誤

public NodeIterator getNodes(Session session, String query, long count) throws RepositoryException{ 
      NodeIterator nodeIterator = null; 

      QueryManager queryManager = session.getWorkspace().getQueryManager(); 

      Query qry = queryManager.createQuery(query, Query.SQL); 
      qry.setLimit(count); 
      QueryResult result = qry.execute(); 
      nodeIterator = result.getNodes(); 


     return nodeIterator; 
    } 

我有一個錯誤就行:

Caused by: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.jcr.Workspace.getQueryManager()Ljavax/jcr/query/QueryManager;" the class loader (instance of org/apache/felix/framework/ModuleImpl$ModuleClassLoaderJava5) of the current class, org/dapa/ime/service/AbstractService, and the class loader (instance of org/apache/felix/framework/ModuleImpl$ModuleClassLoaderJava5) for resolved class, javax/jcr/Workspace, have different Class objects for the type javax/jcr/query/QueryManager used in the signature 

可以在任何身體幫助:

QueryManager queryManager = session.getWorkspace().getQueryManager(); 

錯誤

org.apache.sling.api.SlingException: An exception occurred processing JSP page /apps/IMEApp/Content/Category/../../General/html_marketCommentary.jsp at line 49 
    at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.handleJspExceptionInternal(JspServletWrapper.java:571) 
    at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:496) 
    at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:442) 
    at org.apache.sling.scripting.jsp.JspServletWrapperAdapter.service(JspServletWrapperAdapter.java:59) 
    at org.apache.sling.scripting.jsp.JspScriptEngineFactory.callJsp(JspScriptEngineFactory.java:173) 
    at org.apache.sling.scripting.jsp.JspScriptEngineFactory.access$100(JspScriptEngineFactory.java:84) 
    at org.apache.sling.scripting.jsp.JspScriptEngineFactory$JspScriptEngine.eval(JspScriptEngineFactory.java:388) 
    at org.apache.sling.scripting.core.impl.DefaultSlingScript.call(DefaultSlingScript.java:358) 
    at org.apache.sling.scripting.core.impl.DefaultSlingScript.eval(DefaultSlingScript.java:170) 
    at org.apache.sling.scripting.core.impl.DefaultSlingScript.service(DefaultSlingScript.java:456) 
    at org.apache.sling.engine.impl.request.RequestData.service(RequestData.java:529) 
    at org.apache.sling.engine.impl.SlingRequestProcessorImpl.processComponent(SlingRequestProcessorImpl.java:274) 
    at org.apache.sling.engine.impl.filter.RequestSlingFilterChain.render(RequestSlingFilterChain.java:49) 
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:64) 
    at org.apache.sling.engine.impl.debug.RequestProgressTrackerLogFilter.doFilter(RequestProgressTrackerLogFilter.java:59) 
    at org.apache.sling.engine.impl.filter.AbstractSlingFilterChain.doFilter(AbstractSlingFilterChain.java:60) 
    at org.apache.sling.engine.impl.SlingRequestProcessorImpl.processRequest(SlingRequestProcessorImpl.java:161) 
    at org.apache.sling.engine.impl.SlingMainServlet.service(SlingMainServlet.java:183) 
    at org.apache.felix.http.base.internal.handler.ServletHandler.doHandle(ServletHandler.java:96) 
    at org.apache.felix.http.base.internal.handler.ServletHandler.handle(ServletHandler.java:79) 
    at org.apache.felix.http.base.internal.dispatch.ServletPipeline.handle(ServletPipeline.java:42) 
    at org.apache.felix.http.base.internal.dispatch.InvocationFilterChain.doFilter(InvocationFilterChain.java:49) 
    at org.apache.felix.http.base.internal.dispatch.HttpFilterChain.doFilter(HttpFilterChain.java:33) 
    at org.apache.felix.http.base.internal.dispatch.FilterPipeline.dispatch(FilterPipeline.java:48) 
    at org.apache.felix.http.base.internal.dispatch.Dispatcher.dispatch(Dispatcher.java:39) 
    at org.apache.felix.http.base.internal.DispatcherServlet.service(DispatcherServlet.java:67) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:926) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 
Caused by: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.jcr.Workspace.getQueryManager()Ljavax/jcr/query/QueryManager;" the class loader (instance of org/apache/felix/framework/ModuleImpl$ModuleClassLoaderJava5) of the current class, org/dapa/ime/service/AbstractService, and the class loader (instance of org/apache/felix/framework/ModuleImpl$ModuleClassLoaderJava5) for resolved class, javax/jcr/Workspace, have different Class objects for the type javax/jcr/query/QueryManager used in the signature 
    at org.dapa.ime.service.AbstractService.getNodes(AbstractService.java:43) 
    at org.dapa.ime.service.NewsService.getListOfNews(NewsService.java:35) 
    at org.dapa.ime.service.NewsService.getListOfTopNews(NewsService.java:57) 
    at org.apache.jsp.apps.IMEApp.Content.Category.html_jsp._jspService(html_jsp.java:1995) 
    at org.apache.sling.scripting.jsp.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.apache.sling.scripting.jsp.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419) 
    ... 37 more 

我無法理解的部分引起的? 在此先感謝。

回答

2

什麼?

這種類型的LinkageError往往造成不完整的OSGi元數據:在當前形勢下,您已經允許了兩個包(一個裝載AbstractService和一個裝載Workspace)有不同版本的QueryManager

現在呢?

您的系統中有很多QueryManager的副本,您需要刪除除一個之外的所有副本,或者確保選擇正確的副本。第一個是最有可能的,第二個只有在你手動建立你的捆綁包時纔可能發生。

一個QueryManager統治他們所有

檢查多個包是否包含這個類。我不知道你是如何構建你的捆綁包的,但是你可能有一些過於雄心勃勃的工具,把這個類放入需要它的每個包中。造成這種情況的一個常見原因是在Maven POM中使用<Embed-Transitive>true</Embed-Transitive>

有一個包提供這個類,並將它導出(and import!)這個包。

選擇正確的一個

如果你有多個副本,一個很好的理由,確保所有束上使用哪一個一致。確保,

    當包導出 javax.jcr.query
  • ,還進口,所以解析器可以選擇一個它認爲最有用的,和可選
  • 是明確有關必須使用javax.jcr.query副本當一些捆綁使用javax.jcr.query。您可以通過將uses constraint放置在您的導出上來完成此操作,但公平地說,您的工具本身也應該這樣做。

如上所述,如果您需要使用此解決方案,您可能手工製作了捆綁包。考慮使用像bndtools這樣的工具來爲您構建捆綁軟件。