Java NoClassDefFoundError amf

Java NoClassDefFoundError amf,java,deserialization,blazeds,amf,Java,Deserialization,Blazeds,Amf,我试图将一个java代码段编译成一个jar文件,我遇到了一个典型的java运行时异常,但我无法解决这个问题。 这是从Markus Wulftange那里借来的代码: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Arrays; import flex.messaging.io.Serialization

我试图将一个java代码段编译成一个jar文件,我遇到了一个典型的java运行时异常,但我无法解决这个问题。 这是从Markus Wulftange那里借来的代码:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;

import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.ActionContext;
import flex.messaging.io.amf.ActionMessage;
import flex.messaging.io.amf.AmfMessageDeserializer;
import flex.messaging.io.amf.AmfMessageSerializer;
import flex.messaging.io.amf.MessageBody;

public class Amf3ExternalizableUnicastRef {

public static void main(String[] args) throws IOException, ClassNotFoundException {
    if (args.length < 2 || (args.length == 3 && !args[0].equals("-d"))) {
        System.err.println("usage: java -jar " + Amf3ExternalizableUnicastRef.class.getSimpleName() + ".jar [-d] <host> <port>");
        return;
    }
    boolean doDeserialize = false;
    if (args.length == 3) {
        doDeserialize = true;
        args = Arrays.copyOfRange(args, 1, args.length);
    }

    // generate the UnicastRef object
    Object unicastRef = generateUnicastRef(args[0], Integer.parseInt(args[1]));

    // serialize object to AMF message
    byte[] amf = serialize(unicastRef);

    // deserialize AMF message
    if (doDeserialize) {
        deserialize(amf);
    } else {
        System.out.write(amf);
    }
}

public static Object generateUnicastRef(String host, int port) {
    java.rmi.server.ObjID objId = new java.rmi.server.ObjID();
    sun.rmi.transport.tcp.TCPEndpoint endpoint = new sun.rmi.transport.tcp.TCPEndpoint(host, port);
    sun.rmi.transport.LiveRef liveRef = new sun.rmi.transport.LiveRef(objId, endpoint, false);
    return new sun.rmi.server.UnicastRef(liveRef);
}

public static byte[] serialize(Object data) throws IOException {
    MessageBody body = new MessageBody();
    body.setData(data);

    ActionMessage message = new ActionMessage();
    message.addBody(body);

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    AmfMessageSerializer serializer = new AmfMessageSerializer();
    serializer.initialize(SerializationContext.getSerializationContext(), out, null);
    serializer.writeMessage(message);

    return out.toByteArray();
}

public static void deserialize(byte[] amf) throws ClassNotFoundException, IOException {
    ByteArrayInputStream in = new ByteArrayInputStream(amf);

    AmfMessageDeserializer deserializer = new AmfMessageDeserializer();
    deserializer.initialize(SerializationContext.getSerializationContext(), in, null);
    deserializer.readMessage(new ActionMessage(), new ActionContext());
  }
}    
import java.io.ByteArrayInputStream;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.util.array;
导入flex.messaging.io.SerializationContext;
导入flex.messaging.io.amf.ActionContext;
导入flex.messaging.io.amf.ActionMessage;
导入flex.messaging.io.amf.AmfMessageDeserializer;
导入flex.messaging.io.amf.AmfMessageSerializer;
导入flex.messaging.io.amf.MessageBody;
公共类AMF3ExternalizablenicAstref{
公共静态void main(字符串[]args)引发IOException,ClassNotFoundException{
如果(args.length<2 | |(args.length==3&&!args[0]。等于(“-d”)){
System.err.println(“用法:java-jar”+amf3externalizablenicastref.class.getSimpleName()+”.jar[-d]”;
返回;
}
布尔值doDeserialize=false;
如果(args.length==3){
doDeserialize=真;
args=Arrays.copyOfRange(args,1,args.length);
}
//生成UnicastRef对象
Object unicastRef=generateUnicastRef(args[0],Integer.parseInt(args[1]);
//将对象序列化为AMF消息
字节[]amf=序列化(unicastRef);
//反序列化AMF消息
if(十二烷基化){
反序列化(amf);
}否则{
系统输出写入(amf);
}
}
公共静态对象generateUnicastRef(字符串主机,int端口){
java.rmi.server.ObjID ObjID=new java.rmi.server.ObjID();
sun.rmi.transport.tcp.TCPEndpoint端点=新的sun.rmi.transport.tcp.TCPEndpoint(主机、端口);
sun.rmi.transport.LiveRef-LiveRef=新的sun.rmi.transport.LiveRef(objId,端点,false);
返回新的sun.rmi.server.UnicastRef(liveRef);
}
公共静态字节[]序列化(对象数据)引发IOException{
MessageBody=newmessagebody();
body.setData(数据);
ActionMessage=新建ActionMessage();
message.addBody(body);
ByteArrayOutputStream out=新建ByteArrayOutputStream();
AmfMessageSerializer=新的AmfMessageSerializer();
serializer.initialize(SerializationContext.getSerializationContext(),out,null);
序列化程序。writeMessage(消息);
return out.toByteArray();
}
publicstaticvoid反序列化(byte[]amf)抛出ClassNotFoundException、IOException{
ByteArrayInputStream in=新的ByteArrayInputStream(amf);
AmfMessageDeserializer反序列化器=新的AmfMessageDeserializer();
初始化(SerializationContext.getSerializationContext(),in,null);
readMessage(new ActionMessage(),new ActionContext());
}
}    
使用位于同一目录中的flex messaging core包,我用
javac-cpflex…jar sourcefile.java.

然后用
jar-cfm myjar.jar MANIFEST.ML myclass.class

但是,当使用适当的参数从shell运行时
java-jarmyjar.jar-d127.0.0.18000
它在threadmain
java.lang.NoClassDefFoundError:flex/messaging/io/amf/MessageBody
中引发异常


我在谷歌上搜索了两天,尝试了所有的解决方案,但我真的不能自己解决问题,我可以请求一些帮助吗?

应该是MANIFEST.MF,而不是MANIFEST.ML吗?

NoClassDef表示编译器没有找到那个类。您可以验证包是否有这个类,路径是否都正确,是否链接了依赖项……嗨,莱昂纳多,谢谢你的回答,我已经检查了包,它有“offer”类,即flex.messaging.io.amf.MessageBody。而且类路径和依赖项看起来是正确的。您的Manifest.ml是什么?可能您应该使用与编译类相同的类路径来执行jar:java-cp flex…jar-jar myjar.jar-d 127.0.0.1 8000My manifest.ml包含这些标题manifest版本:1.0主类:amf3externalizablenicastref类路径:flex-messaging-core-4.7.2.jar,jar编译并执行,直到它调用Messagebody类为止,我放置了一些System.out.println来确定这一点