3

ワークスペースにいくつかのプロジェクトがあります:

AndroidMonitoring # an android application
MonitoringModel # an android library project
DataServlet # servlet project

AndroidMonitoring (MonitoringModel に依存し、

プロジェクト プロパティの Android セクションで)

コンパイルして正常に実行されますが、DataServlet プロジェクトでも MonitoringModel クラスを使用できるようにする必要があります。モデルを依存関係として DataServlet プロジェクトの Java ビルド パスに追加しましたが、次のようになります。

java.lang.NoClassDefFoundError: gr/uoa/di/monitoring/model/Battery
    gr.uoa.di.monitoring.server.servlets.DataCollectionServlet.doGet(DataCollectionServlet.java:20)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

モデルにはAndroidクラスが含まれているだけでなく、サーブレット内のファイルを解析するメソッドも含まれているため、モデルをAndroidライブラリプロジェクトにする必要があります-可能ですか? これをどのように設定すればよいですか?

編集:MonitoringModelはこちら

4

2 に答える 2

2

解決しました!

  1. DataServlet の Java ビルド パスから依存関係を削除します
  2. プロジェクトに移動してMonitoringModelライブラリ属性を削除し、Android アプリとして実行してライブラリに作り直します (ここから)MonitoringModel プロジェクトをクリーンアップする
  3. bin/ から monitoringmodel.jar を取得し、DataServlet/WEB-INF/lib
  4. リフレッシュしてサーバー上で実行
  5. やった

このハックを改善しようとします(ところで、外部jarへのリンクは機能していないようです)-より良いアイデアは答えとして受け入れられます-しかし、今のところこれを閉じます.

EDIT : どうやらステップ 3. から monitoringmodel.jar へのハード リンクを作成することで置き換えることができますDataServlet/WEB-INF/lib/monitoringmodel.jarただし、シンボリック リンクは機能していないようです - これをバグとして報告しました

EDIT2:以下の手順もうまくいくようですが、手動の手順は間違いなくうまくいくのでそのままにしておきます

  1. DataServlet の Java ビルド パスから依存関係を削除します
  2. monitoringmodel.jar を bin/ から および にハード リンクしDataServlet/WEB-INF/libます。私はシェルリンク拡張機能を使用しましたが、これは:

    mklink /H c:\path\to\WebContent\WEB-INF\lib\monitoringmodel.jar c:\path\to\bin\monitoringmodel.jar
    

    も動作するはずです

  3. 監視モデルを変更するたびに、jar が更新されます。サーブレット プロジェクトを更新するだけで済みます (デフォルトではサーバー上に再デプロイされます)。

明確化:もちろん、サーブレットプロジェクトはandroid.*クラスを使用することを意図していません-これは私の問題ではありません-私の問題はモデルコードを1か所に置くことであり、この場所はAndroidライブラリでなければなりませんでした

于 2013-09-03T14:16:27.173 に答える