【问题标题】:Apache Mahout and REST Java Web Application IntegrationApache Mahout 和 REST Java Web 应用程序集成
【发布时间】:2014-06-20 02:37:53
【问题描述】:

我在链接这两个东西时遇到问题 - Apache Mahout 和 Java Web 应用程序集成。

我使用标准 Java Web 应用程序 Maven 项目和 Jersey 2.4 来构建我的网络服务。我的应用服务器是 Apache Tomcat 7。

当我在没有 Mahout 的情况下运行这个项目并尝试:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" 'http://myhost:8089/ensembleRestApi/recommeng/algorithm/articleCore/cf?limit=5'

我得到了响应,也可以通过源代码(带调试器)

但是当我将 Mahot 依赖项添加到我的 pom.xml 文件时:

<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-core</artifactId>
    <version>0.9</version>
</dependency> 

并尝试执行相同的 curl 命令,但在我的源代码中调用 webservice 方法中的断点之前,我得到了这个 AbstractMethodError:

请问您知道问题出在哪里吗?

SEVERE: Servlet.service() for servlet [jersey-serlvet] in context with path     [/ensembleRestApi] threw exception [Servlet execution threw an exception] with root cause
java.lang.AbstractMethodError:     javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:286)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)
at    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

【问题讨论】:

  • 我会假设你没有添加一个真正的实现(AbstractMethodError)?
  • 这是什么意思? AbstractMethodError 通常是由不兼容的 Jersey 版本引起的(参见 google - tinyurl.com/lh8s9pm)......但这不是我的问题。我已经实现了基于用户的协同过滤(这里是pastebin.com/k2WjsQhV),它作为一个独立的 Java 应用程序工作。但是当我将它添加到这个 Web 应用程序中时.. 出现上述错误。

标签: rest maven mahout jersey-2.0


【解决方案1】:

好的,所以如果有人会用同样的东西打架,请记住这个例外是因为:

当应用程序尝试调用抽象方法时抛出。一般, 这个错误被编译器捕获;此错误只能在运行时发生 如果某个类的定义从那时起发生了不兼容的更改,则时间 当前执行的方法最后一次编译。 Oracle

这意味着您在库中存在一些冲突(在依赖项中)

所以我尝试降级我的 mahout-core 库版本,使用 0.7 版一切正常。

【讨论】:

  • 您找到使用最新版 mahout 的解决方案了吗?
  • 不,从那以后我就没用过。
【解决方案2】:

我刚刚遇到了同样的问题,这是因为 Jersey 版本的冲突。对于我的端点,我使用的是 Jersey 2.14。但是 Mahout 0.9 依赖于 hadoop-core 1.2.1,它有几个 Jersey 1.8 依赖项。 AbstractMethodError 是因为您的端点使用的是 Jersey 1.8 类而没有定义此方法。

【讨论】:

    【解决方案3】:

    从你的 pom.xml 中排除所有 com.sun.jersey 依赖项...这里我使用的是 gradle:

    compile ('org.apache.mahout:mahout-integration:0.11.1'){
        exclude group: 'com.sun.jersey'
    }
    

    在 Eclipse 中,您可以转到项目中的“Maven 依赖项”文件夹->右键单击->“Maven”->“排除 Maven Artifact...”以获取所有“jersey1.xxx”依赖项,排除项将被添加到你的 pom.xml 文件中

    【讨论】:

      猜你喜欢
      • 2015-05-15
      • 2014-07-17
      • 2021-04-19
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2011-07-27
      相关资源
      最近更新 更多