对返回进行解组时出错;嵌套异常为:java.lang.ClassNotFound
我一直在使用RMI开发一个小程序,我想尝试将我的客户端作为一个jar进行测试(可能将它放在另一台计算机上,使用我自己的本地主机作为要连接的ip),但每次我用Intellij和VM选项编译它时:对返回进行解组时出错;嵌套异常为:java.lang.ClassNotFound,java,permissions,intellij-idea,rmi,executable-jar,Java,Permissions,Intellij Idea,Rmi,Executable Jar,我一直在使用RMI开发一个小程序,我想尝试将我的客户端作为一个jar进行测试(可能将它放在另一台计算机上,使用我自己的本地主机作为要连接的ip),但每次我用Intellij和VM选项编译它时: -Djava.security.manager -Djava.security.policy=src/test.policy 这是我的测试。政策: grant { permission java.security.AllPermission; permission java.net.SocketPer
-Djava.security.manager -Djava.security.policy=src/test.policy
这是我的测试。政策:
grant {
permission java.security.AllPermission;
permission java.net.SocketPermission "*:1024-65535",
"connect,accept,resolve";
};
当我在Intellij中编译它时,在我放入主机(localhost)后,它会在标题中给我消息
error unmarshalling return; nested exception is: java.lang.ClassNotFound: ServerImplements_Stub
我想问的是,如何让它在jar中工作,或者甚至在Intellij中编译
这是我整个项目的代码
Client.java
import java.rmi.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class Client extends JFrame {
JTextField textField = new JTextField();
JPanel p = new JPanel(new BorderLayout());
JButton b = new JButton("Send message");
RemoteInterface s;
String name;
JTextArea textArea = new JTextArea();
public Client() {
super("Chat client v1.0 by Jurko Guba");
setSize(250, 250);
setLocation(300, 300);
getContentPane().add(p);
p.add(textField, BorderLayout.NORTH);
p.add(textArea, BorderLayout.CENTER);
p.add(b, BorderLayout.SOUTH);
try {
textArea.setText(s.returnChat());
} catch (Exception e) {System.out.println(e);}
try {
String ipp = JOptionPane.showInputDialog("Enter IP Address to Connect");
name = JOptionPane.showInputDialog("Enter chat username ie. Jurko");
String ip = "rmi://" + ipp + "/RMIAPPLICATION";
s = (RemoteInterface)Naming.lookup(ip);
} catch (Exception exp) {
JOptionPane.showMessageDialog(null, exp.getMessage());
}
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
s.addChatMessage(name + ": " + textField.getText());
textArea.setText(s.returnChat());
textArea.repaint();
System.out.println("Client message added: "+textField.getText() + " under the name of: "+name);
} catch (Exception epx) {System.out.println(epx.getMessage());}
}
});
}
public static void main(String args[]) {
System.setSecurityManager(new SecurityManager());
System.setProperty("java.security.policy", "file:test.policy");
System.out.println(java.security.Policy.getPolicy());
Client c = new Client();
c.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
c.setVisible(true);
}
}
Server.java
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.rmi.Naming;
/**
* Created with IntelliJ IDEA.
* User: jurkoguba
* Date: 2013-09-10
* Time: 9:14 PM
* To change this template use File | Settings | File Templates.
*/
public class Server {
public static void main (String args[]) {
try {
System.setSecurityManager(new SecurityManager());
System.setProperty("java.security.policy", "file://test.policy");
ServerImplements s = new ServerImplements();
Naming.rebind("RMIAPPLICATION", s);
System.out.println("Server has been started!");
JFrame f = new JFrame("Server");
f.setSize(250, 250);
f.setLocation(100, 100);
f.getContentPane().add(s.textArea);
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setVisible(true);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
RemoteInterface.java
import javax.swing.*;
import java.rmi.*;
/**
* Created with IntelliJ IDEA.
* User: jurkoguba
* Date: 2013-09-10
* Time: 8:56 PM
* To change this template use File | Settings | File Templates.
*/
public interface RemoteInterface extends Remote {
public void addChatMessage(String message) throws Exception;
public String returnChat() throws Exception;
}
ServerImplements.java
import javax.swing.*;
import java.rmi.Remote;
import java.rmi.server.UnicastRemoteObject;
/**
* Created with IntelliJ IDEA.
* User: jurkoguba
* Date: 2013-09-10
* Time: 9:01 PM
* To change this template use File | Settings | File Templates.
*/
public class ServerImplements extends UnicastRemoteObject implements RemoteInterface {
public ServerImplements() throws Exception {
super();
}
final JTextArea textArea = new JTextArea("Brand new chat!");
public void addChatMessage(String message) {
textArea.append('\n'+message);
System.out.println("Message appended: "+ message);
textArea.repaint();
}
public String returnChat() throws Exception {
return textArea.getText();
}
}
多谢各位 当我在Intellij中时,如果我直接从那里以“客户机”作为主文件构建程序,那就是当我收到此错误时。我唯一能正确运行程序的时间是使用java client在终端中运行客户端,或者单击finder中的client.class。如果我还没有说清楚,请告诉我我真的很想这样做,因为这将解决我未来的许多问题,谢谢!你还没有回答这个问题。我给了你三个选择。是哪一个?我建议您在问题中包含堆栈跟踪。EJP,我很抱歉,但我不明白您在这3个选项中的意思是什么?如果导出是指构建工件并将其变成一个罐子?当我把它变成一个罐子,它甚至不会启动。我不知道什么是绑定,什么时候查找。我非常感谢你花时间来帮助我,但你能详细说明一下吗?非常感谢您,我更改了代码中的System.setSecurityManager(new SecurityManager());对于新的RMISecurityManager,当我在intellij中运行它时,它可以工作,但当我导出(转到jar)时,我无法启动它