Java NoClassDefFoundError amf

Я пытаюсь скомпилировать фрагмент java в файл jar, я попал в классическое исключение времени выполнения java, но не могу решить проблему. Это код, заимствованный у Маркуса Вульфтанге:

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

С помощью пакета flex-messaging-core, расположенного в том же каталоге, я скомпилировал в банку с javac -cp flex...jar sourcefile.java.

Затем скомпилирован в банку с jar -cfm myjar.jar MANIFEST.ML myclass.class.

Но затем при запуске из оболочки с правильными аргументами java -jar myjar.jar -d 127.0.0.1 8000 он выдает исключение в threadmain java.lang.NoClassDefFoundError : flex/messaging/io/amf/MessageBody.

Я гуглил и пробовал все решения в течение 2 дней, но действительно не могу решить проблему самостоятельно, могу ли я попросить небольшую помощь?


person arold22    schedule 18.07.2017    source источник
comment
NoClassDef означает, что компилятор не нашел этот класс. Вы можете проверить, есть ли в пакете этот класс, все ли пути правильные, связали ли вы зависимости...   -  person Leonardo Alves Machado    schedule 18.07.2017
comment
Привет Леонардо, спасибо за ваш ответ, я уже проверил пакет, и у него есть класс нарушителя, который называется flex.messaging.io.amf.MessageBody. Также путь к классам и зависимости кажутся правильными   -  person arold22    schedule 18.07.2017
comment
Какой у вас Manifest.ml? Вероятно, вам следует использовать тот же путь к классам для выполнения jar, который вы использовали для компиляции класса: java -cp flex...jar -jar myjar.jar -d 127.0.0.1 8000   -  person Obenland    schedule 18.07.2017
comment
Мой manifest.ml содержит эти заголовки Версия манифеста: 1.0 Основной класс: Amf3ExternalizableUnicastRef Путь к классу: flex-messaging-core-4.7.2.jar   -  person arold22    schedule 18.07.2017
comment
Чтобы было ясно, jar компилируется и выполняется до тех пор, пока не вызовет класс Messagebody, я поместил некоторый System.out.println, чтобы точно определить   -  person arold22    schedule 18.07.2017


Ответы (1)


Разве это не должно быть MANIFEST.MF, а не MANIFEST.ML?

person Michael    schedule 05.06.2019