2

ここに質問を投稿するのはこれが初めてです。質問をできるだけ明確にしようとします。

Java Web アプリケーションを開発するための最適なプロセスを見つけようとしています。何ヶ月にもわたる試行錯誤の後、私の Web 開発環境は次の部分で構成されています。

フレームワーク: Apache Wicket 1.4.16
IDE: m2eclipse プラグインを使用した eclipse Galileo
ビルド ツール: Maven 2
データ アクセス: JPA 2.0 経由の EclipseLink 2.1.1 (StaticWeave を使用)
RDBMS: jTDS を使用した MSSQL 2005 以降
DI: Google Guice 2.0
Web コンテナーの開発: Maven Jetty プラグインに組み込まれた Jetty サーバー。
対象の Web コンテナー: Tomcat 6.x 以降

Maven Jetty プラグインを使用して Web アプリケーションをテスト実行し、行精度のトレースが必要なときに JPDA を有効にします。

ソース コードに変更が加えられるたびに、アプリをリロードして有効にする必要があります。ENTER を押してリロードしても問題ありませんが、数回リロードした後 (PermGen の設定に応じて約 3 ~ 5 回)、OutOfMemoryException がスローされ、アプリをシャットダウンして再起動する必要があります。構成によって自動リロードを実現できることは知っていますが、(過剰なリロードによる) OOME の高速化につながるだけです。

グーグルで調べたところ、メモリリークの問題に関連していることがわかりました。MaxPermSize 設定を拡大しようとしましたが、リグの RAM は限られているため、非常に大きな値に設定するのは合理的ではありません。ところで、メモリ リーク検出は Tomcat 7 で導入されました。ほとんどのメモリ リークは jTDS、Google Guice、および Wicket 自体からのものであることがわかりましたが、それについては何もできません。

開発プロセスを加速するためにできることはありますか? リロード時間を短縮するには、Glassfish などのより高度な Web コンテナーに移行する必要があります (ここでは WebLogic や WebSphere を使用する余裕がありません)。

事前に感謝します。コメントは大歓迎です!

4

2 に答える 2

5

私はJRebelを使用しています。これは本当に役に立ちます。サーバーを時々再起動する必要がありますが、ほとんどの変更は機能します。これは、Wicket のような Java 中心のフレームワークに完全に適合します。開発用の JDK の「ハッキング」バージョンを使用できる場合は、DCEVMを試すこともできます。

于 2011-04-24T19:13:57.690 に答える
0

Eclipse で webapp を開始するための単純な Jetty ラッパーがあります。デバッグ モードで起動すると、メソッド シグネチャまたはフィールド名を変更しない限り、リロードは必要ありません。コンテキストのリロードは必要ありません。

    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.webapp.WebAppContext;

    public static void main(String[] args) {
       Properties properties= ...//read properties from text file
       Server server = new Server(properties.getPort());
       WebAppContext webapp = new WebAppContext(
              properties.getWebApplicationPath(), properties.getContextPath());
    server.start();
       //.... and here can be key capture for stopping Jetty

    }

ここで、properties.getWebApplicationPath() は ./WebContent です (または、Maven プロジェクトの構造によっては異なる場合があります)。

これは、Tomcat にデプロイするときのメモリ リークを解決しませんが、開発プロセスでは非常に役立ちます。私も Wicket と Guice を使用していますが、メモリ リークに気付きませんでした。

于 2011-04-23T15:45:40.500 に答える