Портирование моего существующего проекта Java на NetBeans на другой компьютер и последующее его выполнение дает UnsupportedClassVersionError - PullRequest
0 голосов
/ 03 марта 2012

Я начал писать код для клиент-серверной машины на Java, используя RMI (Remote Method Invocation). Код отлично работает на моей машине. Он в основном дает команды клиентскому компьютеру, а клиент обрабатывает эти команды и отвечает соответствующим образом. После выполнения команды машина отправляет обратно свой статус на сервер. Примером может служить то, что сервер запрашивает канал изображения у клиента, а клиент возвращает изображение на сервер.

Я использовал git для клонирования текущего проекта и передачи его на другую машину. Когда я выполняю код на стороне клиента, он работает совершенно нормально, а другая машина (на которую я отправил исходный код) отвечает так, как должна.

Однако, когда я запускаю код на стороне сервера для кодирования на другом компьютере, он дает загадочную ошибку, которая говорит:

C:\Users\RdX\Desktop\Thiswa
javax.naming.NamingException [Root exception is java.rmi.ServerError: Error occurred in          server thread; nested exception is: 
java.lang.UnsupportedClassVersionError: javadrone/Server (Unsupported major.minor   version 51.0)]
at com.sun.jndi.rmi.registry.RegistryContext.rebind(RegistryContext.java:159)
at com.sun.jndi.toolkit.url.GenericURLContext.rebind(GenericURLContext.java:249)
at javax.naming.InitialContext.rebind(InitialContext.java:427)
at javadrone.server.ServerImpl.<init>(ServerImpl.java:46)
at javadrone.server.DroneServer.<init>(DroneServer.java:45)
at javadrone.server.DroneServer.main(DroneServer.java:84)
Caused by: java.rmi.ServerError: Error occurred in server thread; nested exception is: 
java.lang.UnsupportedClassVersionError: javadrone/Server (Unsupported major.minor    version 51.0)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:349)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:207)
at sun.rmi.transport.Transport$1.run(Transport.java:148)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:534)
at     sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at com.sun.jndi.rmi.registry.RegistryContext.rebind(RegistryContext.java:157)
...5 more

При проверке трассировки стека код, генерирующий исключение:

package javadrone.server;


import javadrone.Drone;
import javadrone.Server;

import javadrone.command.CommandQueue;


import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import java.util.HashMap;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public abstract class ServerImpl extends UnicastRemoteObject implements Server {
public static final String            RMI_PROT = "rmi:";
private static Context                namingContext;
private static HashMap<String, Drone> registeredDrones;
private String                        name;

public ServerImpl(String name) throws RemoteException, NamingException {
    this.name     = name;
    namingContext = new InitialContext();
    namingContext.rebind(RMI_PROT + name, ServerImpl.this);
    registeredDrones = new HashMap<>();
}

@Override
public String getName() throws RemoteException {
    return name;
}

@Override
public Drone registerDrone(String droneName) throws RemoteException {
    System.out.println("Remote client registered...");

    DroneImpl d = new DroneImpl(new CommandQueue(), droneName);

    registeredDrones.put(droneName, d);
    hasRegistered(d);

    return d;
}

public Drone getDrone(String droneName) {
    return registeredDrones.get(droneName);
}

@Override
public long getTime() throws RemoteException {
    return System.currentTimeMillis();
}

public abstract void hasRegistered(DroneImpl d);
}

Чтобы быть точным,

namingContext.rebind(RMI_PROT + name, ServerImpl.this)

- это строка, которая генерирует ошибку.

Я искал много мест, и они говорят, что если компилятор JDK имеет более высокую версию, чем версия JRE, он может выдать такую ​​ошибку.

Однако я удалил все предыдущие JDK и JRE и перекомпилировал код после установки JDK 7.03. Это все еще дает то же исключение.

Почему это происходит и как я могу это исправить?

1 Ответ

0 голосов
/ 03 марта 2012

Вы можете подумать , что вы удалили все другие JDK и JRE, но я сильно подозреваю, что вы на самом деле этого не сделали.

Вы не сказали, как вы запускаетесерверный код, но я предлагаю вам записать System.getProperty("java.version") как можно раньше - я уверен, вы обнаружите, что используете более раннюю версию JRE, чем вы думаете.

Classfile версии 51.0 - это Java 7Это имеет смысл, если вы скомпилировали его с JDK 7. Это именно то, что вы используете для запуска кода, который является проблемой.

Если вы просто запускаете:

java ...

из командной строки, я предлагаю вам явно запустить конкретную версию Java, включая полный путь к исполняемому файлу.

...