簡體   English   中英

將我現有的Java項目在Netbeans上移植到另一台機器上,然后運行它會出現UnsupportedClassVersionError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM