[英]Porting my existing java project on Netbeans to another machine and then running it gives a UnsupportedClassVersionError
我開始使用RMI(遠程方法調用)在Java上為客戶端-服務器計算機編碼。 該代碼在我的機器上正常工作。 它基本上將命令提供給客戶端計算機,然后客戶端處理這些命令並做出相應的響應。 執行命令后,機器將其狀態發送回服務器。 一個示例是,服務器從客戶端請求圖像提要,然后客戶端將圖像返回給服務器。
我使用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 7.03之后卸載了所有以前的JDK和JRE,並重新編譯了代碼。 它仍然給出相同的例外。
為什么會發生這種情況,我該如何糾正?
您可能認為您已經刪除了所有其他JDK和JRE,但我強烈懷疑您還沒有。
您沒有說過如何運行服務器代碼,但是我建議您System.getProperty("java.version")
登錄System.getProperty("java.version")
-我確定您會發現您正在使用較早的JRE比你想像的要好。
Classfile版本51.0是Java 7,如果使用JDK 7進行編譯,這是很有意義的。這正是您用來運行代碼的問題。
如果您只是在跑步:
java ...
從命令行,我建議您嘗試顯式運行特定版本的Java,包括可執行文件的完整路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.