0

私は、RMIを使用してファイルとその内容をJSONで読み取る(やや複雑な)アプリケーションを開発してきました。このアプリをNetbeans6.7でコーディングしているため、次のようなフォルダ構造になっています。

C:\ MyAppの下:

-建てる

- - クラス

-------MyApp<---それはパッケージです。私の.classファイルはそこにあります。また、ここからrmiregistryを実行しました。

-距離

---lib

---------[いくつかの.jarライブラリ]

-src

..。

[いくつかのファイル]

私のアプリケーションは、dist \ libsフォルダーのライブラリを使用しており、現在のディレクトリの[一部のファイル]セクションから読み取るために1つのファイルをロードします。

ただし、次を使用してアプリケーションを実行するときはいつでも(build \ classesフォルダーから)

java -cp .;..\..\dist\lib\gson-1.4.jar;..\..\..\MyApp -Djava.security.policy=C:\java.policy MyApp.Main

ClassNotFoundExceptionエラーが発生し続け、RMIインターフェイスに関するエラーのリストが見つかりません。一度実行すると、読み取る必要のあるファイルが見つかりませんでした。(私のアプリでNullPointerExceptionを取得しました)。

私が間違っていることを教えてもらえますか?クラスパスに関連していると思います。

また、Netbeans自体からRMIアプリケーションを実行する方法があれば、それは素晴らしいことですが、検索中にこれを実行する方法を見つけることができませんでした。

ああ、rmiregistryが実行されています。そして、私のポリシーファイルには、単純な1行の許可Allが含まれています。

助けてください!ありがとう!

4

2 に答える 2

1

c:\MyApp\build\classesクラスパスで提供する必要があると思いますが..\..\..\MyApp、私が理解しているのはプロジェクトのベースディレクトリではありません。

少なくとも...これで、Javaはプロジェクトのクラスにアクセスできるようになります。

編集:RMIRegistryを使用しないアプリケーションの例

通常、アプリケーション(サーバー側)を実行する場合は、rmiregistyツールを使用せずにRMIオブジェクトを公開できます。選択したポートで予約およびリッスンする独自のレジストリを作成するだけです。

これは、私が作成したアプリケーションの実例です。

クライアントアプリケーションは、そのクラスパスにオブジェクトのインターフェイス(そしてもちろん、参照されているすべてのインターフェイスとクラス)を持っているだけで済みます。

BatchServerRMIインターフェース(BatchService)を実装し、特に何も拡張しないRMIオブジェクトです。

public static void publishAndRun(int port, String name, BatchServer server) throws RemoteException, AlreadyBoundException, NotBoundException
{
    Registry registry = LocateRegistry.createRegistry(port);
    GPRSService stub = (BatchService) UnicastRemoteObject.exportObject(server, 0);
    try
    {
        registry.bind(name, stub);
        try
        {
            server.run();
        }
        finally
        {
            registry.unbind(name);
        }
    }
    finally
    {
        UnicastRemoteObject.unexportObject(server, true);
    }
}

クライアントアプリケーションは、machine:portでレジストリを検索し、nameオブジェクトを要求する必要があります。

    Registry registry = LocateRegistry.getRegistry(server, port);
    BatchService gprs = (BatchService)  registry.lookup(name);
于 2010-01-15T15:25:32.513 に答える
1

ヘリオスありがとう。あなたの答えは有益です。必要に応じて後で参照できるように保存しました。

とにかく、答えが投稿される前に、私はなんとか問題を解決することができました。コードベースやWebサーバーなどの複雑なものは使いたくありませんでした。

まず、build \ classesフォルダーに移動し、そこからrmiregistryを実行しました。クラスパスでクラスを検出した場合、コードベースパラメータを無視することを私は知っています。それが私が欲しかったものです。

次に、そのクラスパスパラメータをより単純なものに変更しました。プロジェクトルートに移動し、そこから必要なライブラリを参照しました。

-classpath .;dist\lib <the jar files I needed>;build\classes

最後に、クライアントの場合、メインプロジェクトパッケージに直接RMIインターフェイスファイルがありました。サーバー上と同じパッケージに含まれている必要があります。そこで、クライアントで必要なパッケージを作成し、そこにRMIインターフェイスを配置しました。クライアントでCodeBaseを開始として使用していましたが、「$ Proxy0をキャストできません」というエラーが発生し続け、パッケージに関する解決策が得られました。

今、すべてが機能しているようです。クライアントはサーバーと通信できます。今のところローカルホストでのみテストしましたが、ネットワーク上のマシンで機能するかどうかはわかりません。ClassNotFoundの例外は、RMIレジストリが適切に開始されていない(クラスが見つからなかった)ためだと思います。

私の解決策が実際に適切であることを願っています。私はそのコードベースのことを理解していません。クラスなどを動的にダウンロードする方法。私はまだJava/RMIの学生/初心者です。

于 2010-01-15T19:53:15.483 に答える