对返回进行解组时出错;嵌套异常为:java.lang.ClassNotFound

对返回进行解组时出错;嵌套异常为: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

我一直在使用RMI开发一个小程序,我想尝试将我的客户端作为一个jar进行测试(可能将它放在另一台计算机上,使用我自己的本地主机作为要连接的ip),但每次我用Intellij和VM选项编译它时:

-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)时,我无法启动它