4

好的,所以一周前我的 localhost:9000 工作得很好,自从我将项目移到 Eclipse 后,我就收到了这个错误。即使我拥有最基本形式的代码,它也会产生一个被 Play 捕获的 Netty 错误。

这是我的错误:

 [info] play - Application started (Prod)
 [info] play - Listening for HTTP on /0.0.0.0:9000
 [error] p.nettyException - Exception caught in Netty
 java.lang.NoSuchMethodError: org.jboss.netty.handler.codec.http.HttpRequest.headers()Lorg/jboss/netty/handler/codec/http/HttpHeaders;
 at play.core.server.netty.PlayDefaultUpstreamHandler.getHeaders(PlayDefaultUpstreamHandler.scala:366) ~[na:na]
 at play.core.server.netty.PlayDefaultUpstreamHandler.messageReceived(PlayDefaultUpstreamHandler.scala:87) ~[na:na]
 at com.typesafe.netty.http.pipelining.HttpPipeliningHandler.messageReceived(HttpPipeliningHandler.java:62) ~[na:na]
 at org.jboss.netty.handler.codec.http.HttpContentDecoder.messageReceived(HttpContentDecoder.java:100) ~[na:na]
 at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) ~[na:na]
 [error] p.nettyException - Exception caught in Netty
 java.lang.NoSuchMethodError: org.jboss.netty.handler.codec.http.HttpRequest.headers()Lorg/jboss/netty/handler/codec/http/HttpHeaders;
 at play.core.server.netty.PlayDefaultUpstreamHandler.getHeaders(PlayDefaultUpstreamHandler.scala:366) ~[na:na]
 at play.core.server.netty.PlayDefaultUpstreamHandler.messageReceived(PlayDefaultUpstreamHandler.scala:87) ~[na:na]
 at com.typesafe.netty.http.pipelining.HttpPipeliningHandler.messageReceived(HttpPipeliningHandler.java:62) ~[na:na]
 at org.jboss.netty.handler.codec.http.HttpContentDecoder.messageReceived(HttpContentDecoder.java:100) ~[na:na]
 at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) ~[na:na]
 [error] p.nettyException - Exception caught in Netty
 java.lang.NoSuchMethodError: org.jboss.netty.handler.codec.http.HttpRequest.headers()Lorg/jboss/netty/handler/codec/http/HttpHeaders;
 at play.core.server.netty.PlayDefaultUpstreamHandler.getHeaders(PlayDefaultUpstreamHandler.scala:366) ~[na:na]
 at play.core.server.netty.PlayDefaultUpstreamHandler.messageReceived(PlayDefaultUpstreamHandler.scala:87) ~[na:na]
 at com.typesafe.netty.http.pipelining.HttpPipeliningHandler.messageReceived(HttpPipeliningHandler.java:62) ~[na:na]
 at org.jboss.netty.handler.codec.http.HttpContentDecoder.messageReceived(HttpContentDecoder.java:100) ~[na:na]
 at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) ~[na:na] 

这是基本的表单代码:

public class Application extends Controller /*implements Runnable*/ {

public static RequestBody print;
//private static RemoteWebDriver driver;
//private static int ok;

public static Result index() {
    return ok(index.render("Your new application is ready."));
}

// Step that prints the object once the JSON is received
@BodyParser.Of(BodyParser.Json.class)
public static Result receive(){
    JsonNode json = request().body().asJson();
    if(json == null)
        // As long as the json is null it will display this
        return badRequest("Expecting data");
    else{
        RequestBody body = request().body();
           print = body;
           return ok("Data received.\n" + body.asJson());
    }
}

public static Result show(){
    if(print == null){
        return ok("Expecting data.");
    }
    //(new Thread(new Application())).start();
    return ok(print.asJson());
}
}
4

1 回答 1

3

tl;dr使用evicted命令,excludeforce()在构建中提供非常有用的报告target/resolution-cache/reports/。不要忘记sbt-dependency-graph

Exclude specific transitive deps中所述:

有时需要进行一些侦探工作才能确定要排除哪些传递依赖。

我遇到了非常相似的问题,解决方案是使用 Netty 库的正确依赖(或者排除一个让assembly通过)。

[microservice]> evicted
[info] Updating {file:/Users/jacek/work/.../}microservice...
[info] Resolving jline#jline;2.12 ...
[info] Done updating.
[warn] There may be incompatibilities among your library dependencies.
[warn] Here are some of the libraries that were evicted:
[warn]  * xml-apis:xml-apis:1.0.b2 -> 1.4.01 (caller: xerces:xercesImpl:2.11.0, dom4j:dom4j:1.6.1)
[warn]  * io.netty:netty:(3.6.6.Final, 3.6.3.Final) -> 3.9.3.Final (caller: com.typesafe.netty:netty-http-pipelining:1.1.2, com.typesafe.play:play_2.11:2.3.7, org.apache.cassandra:cassandra-all:2.0.8, com.netflix.astyanax:astyanax-cassandra:1.56.48)
[warn]  * joda-time:joda-time:1.6.2 -> 2.3 (caller: com.typesafe.play:play-json_2.11:2.3.7, com.netflix.astyanax:astyanax-core:1.56.48, com.typesafe.play:play_2.11:2.3.7, com.netflix.astyanax:astyanax-cassandra:1.56.48, com.netflix.astyanax:astyanax-recipes:1.56.48, com.netflix.astyanax:astyanax-thrift:1.56.48)
[warn]  * jline:jline:1.0 -> 2.11 (caller: com.tinkerpop:gremlin-groovy:3.0.0.M6, org.apache.cassandra:cassandra-all:2.0.8)
[success] Total time: 5 s, completed Feb 20, 2015 6:42:14 PM

正如您在上面的代码片段中可能已经注意到的那样,我面临着三个不同版本的 Netty 之间的依赖版本不匹配-3.6.6.Final和.3.6.3.Final3.9.3.Final

我需要3.6.6.Final被选中,所以我使用force()了我明确添加到构建中的版本(使用build.sbt):

libraryDependencies += "io.netty" % "netty" % "3.6.3.Final" force()

在构建中使用上述行,执行evicted显示:

[warn]  * io.netty:netty:(3.9.3.Final, 3.6.6.Final) -> 3.6.3.Final (caller: com.typesafe.netty:netty-http-pipelining:1.1.2, org.apache.cassandra:cassandra-all:2.0.8, com.typesafe.play:play_2.11:2.3.7, com.netflix.astyanax:astyanax-cassandra:1.56.48, my.company:microservice_2.11:0.6.1)

该构建是针对my.company:microservice_2.11:0.6.1上述输出中出现的(最后一个库)。

但是,有时您应该使用exclude以下方式删除冲突的依赖项:

libraryDependencies ~= { _ map(m => m.exclude("commons-logging", "commons-logging")) }
于 2015-02-20T21:53:46.140 回答