0

私は一種のオンライン プログラミング コンテストを Java で実装しています。アイデアは、競争の参加者がアプリケーションのコントローラーを作成し、それを競争サーバーに送信するというものです。そのカスタム コントローラーは、API の基本クラスから派生する必要があります。

すべての参加者は、おそらく他のカスタム クラスも含めて、独自のコントローラー クラスを作成できます。コントローラーのメイン クラスは API の (抽象) 基本クラスから派生しているため、サーバー上のアプリケーションは、子の特定のメソッドを簡単に呼び出すことができます。アプリケーションを制御するために、特定の間隔でクラス (つまり、カスタム コントローラー) を変更します。

私の質問は次のとおりです。カスタムコントローラーの実装を動的にロードする便利な方法を可能にするために、API の観点からこのシナリオを処理する方法について何か提案はありますか?

私が避けたいのは、参加者が API jar ファイルを Java プロジェクト (Eclipse など) にインクルードしてから、コントローラー クラスを記述し、すべてを実行可能な jar に再​​度入れて、それを競技サーバーにアップロードする必要があることです。サーバー上で完全にカスタム化されたアプリケーションを実行したくはありません。

むしろ、参加者がカスタム コントローラー クラスのみをアップロードできるようにしたいと考えています。次に、サーバー上で、このクラスがアプリケーションの一部として自動的にロードされます。ここには基本的に2つのオプションがあります。

  1. コンパイルされた .class ファイルをサーバーにアップロードします。また
  2. Java ソース コード ファイルをアップロードし、サーバー上でコンパイルする

これら 2 つのオプションのどちらを提案しますか? また、その理由は何ですか?
または:別のより良い代替手段はありますか?

さらに、複数のクラスのアップロードをどのように処理すればよいですか? 可能であれば、参加者がメインのコントローラー クラスのほかに追加のユーティリティ クラスを作成できるようにしたいと考えています。

あなたのすべてのアイデアを前もってありがとう!

4

2 に答える 2

1

Webサーバー、Eclipse、およびその他のプラットフォームで使用されるパターンは、スキーマを指定することによってデプロイメント記述子(通常はXMLファイル)を指定することです。この場合のデプロイメント記述子は、jarファイルの名前(通常はデプロイメント記述子と同じディレクトリにあります)とJavaクラスの完全修飾名(この場合はカスタムコントローラー)を識別します。

デプロイメント記述子を読み取るプログラムを作成して、jarファイルの名前(クラスローダーを介してアクセスする)とカスタマーコントローラーの名前(クラスローダーを使用してロードする)を検出します。

これにより、それぞれが独自のディレクトリに含まれているエントリをいくつでも取り込むことができます。

デプロイメント記述子をjar自体に明確に定義された名前のファイルにして、jarを完全に制限されたエントリにすることで、さらに凝ったものにすることができます。

于 2012-11-15T03:04:50.323 に答える
1

まず、開発者が Eclipse プロジェクトに API jar を含めたからといって、それを完全なアプリケーションとして実行する必要があるわけではありません。実際、API jar を開発者に渡す必要があります。ただし、開発者は、独自に開発したクラスのみを含む JAR を提供する必要があります。

「ソースコードを受け取ってサーバーでコンパイルする」というアプローチはとらないことをお勧めします。状況を不必要に複雑にしているだけです。

サーバーが JAR を受け取ったら、対応するクラスローダーを作成してコードをロードするだけです。

次の質問は、JAR からどのクラスをロードするかをどのように判断するかです。

方法はたくさんありますが、ここでは最も簡単な方法を 2 つ紹介します。

1)@ChrisGerkenが提案したのと同様に、「デプロイメント記述子」を用意してください。簡単に言えば、配置記述子は、事前定義された場所にある、事前定義された形式の単なるテキスト ファイルです。コードは、提供された JAR からこのファイルを読み取ることができ、開発者に (実装クラスの) クラス名を記述子に入れるように依頼することができ、リフレクションを通じてクラスを簡単にインスタンス化できます。

2) 別のアプローチは、SLF4J がアダプターをロードする方法に似ています。開発者は、定義済みのパッケージで、定義済みのクラス名を使用して実装を作成する必要があります。リフレクションによって実装クラスを簡単に作成でき、記述子ファイルを読み取るステップを節約できます。しかし、あなたは柔軟性を失いました。

どちらの方法でも機能するはずです。ニーズに合ったものを選択してください (最初に 2 を選択することをお勧めします。後で 1 のサポートを追加できます)。

于 2012-11-15T03:53:55.063 に答える