1

検索サービス (AbstractService) を含む osgi バンドルを実装しています。このサービスには、コンテンツ ノードのリストを NodeIterator オブジェクトとして取得するメソッドが含まれています。

 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;
    }

オンラインでエラーがあります:

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

セクションが原因で理解できません:

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

どんな体でも助けてくれる?前もって感謝します。

4

1 に答える 1

2

何?

このLinkageError種の は、多くの場合、不完全な OSGi メタデータが原因で発生します。現在の状況では、2 つのバンドル (1 つは読み込みAbstractService中、もう 1 つは読み込み中Workspace) が異なるバージョンの を持つことを許可していQueryManagerます。

そしていま?

システム内にこれのコピーが多すぎQueryManagerます。1 つを除いてすべて削除するか、正しいコピーが選択されるようにする必要があります。1 つ目は最も可能性が高く、2 つ目は手動でバンドルを構築した場合にのみ発生する可能性があります。

QueryManagerそれらすべてを支配するもの

複数のバンドルにこのクラスが含まれているかどうかを確認してください。バンドルをどのように構築したかはわかりませんが、おそらく、クラスを必要とするすべてのバンドルにクラスを配置する、非常に野心的なツールを持っているでしょう。これの一般的な原因は<Embed-Transitive>true</Embed-Transitive>、Maven POM での使用です。

1 つのバンドルにこのクラスを提供させ、パッケージをエクスポート (およびインポート! ) させます。

正しいものを選ぶ

正当な理由で複数のコピーがある場合は、すべてのバンドルがどれを使用するかについて合意していることを確認してください。次のことを確認してください。

  • バンドルがjavax.jcr.queryパッケージをエクスポートすると、パッケージもインポートされるため、リゾルバーは最も有用と思われるものを選択でき、オプションで
  • javax.jcr.query一部のバンドルが を使用するときに使用する必要があるのコピーについて明示しますjavax.jcr.queryusesエクスポートに制約を設定することでこれを行うことができますが、公平に言えば、ツール自体がそれを行う必要があります。

上で述べたように、このソリューションに頼る必要がある場合は、おそらく手作りのバンドルを持っているでしょう. bndtoolsなどのツールを使用してバンドルを構築することを検討してください。

于 2012-12-17T15:55:44.507 に答える