2016-10-18 10 views
1

アプリケーション全体を停止することなく、古い機能のjarファイルを新しい機能のjarファイルに置き換える方法を探しています。私はこのために少し(Unloading classes in java?Dynamically loadable and unloadable application modules in Java - how?)をGoogleで検索しており、3つの可能な解決策を発見した:私の目的のためにあまりにも複雑に見えますTomcat:Tomcatはクラスを内部的にどのようにアンロードしますか?

  1. OSGI、:クラスアンロードは、私はこの強力な仕様から必要な唯一のものです。
  2. 独自のClassloaderの作成、jarsのヘルプのロード、そしてjar-expose ClassloaderインスタンスをGCに却下し、GCがロードされたすべてのjarファイルを一緒に削除することを望む場合。
  3. スタッフのアプリケーションサーバーをコピー:)それは私の質問の目的です。

Tomcatがクラス(戦争)をアンロードする方法についての説明はありますか?私のアプリケーションでこれを再利用することは可能ですか?

PS 私は2つの奇妙なアイデアが頭に入ってきたこの記事を書いていただけながら:

  1. たちは瓶の新しいセットを使用してアプリケーションの別のインスタンスを起動し、入力データと出力データを切り替えることができかもしれから流れ古いものから新しいものへ状態を保持する場所がある場合は、完全再起動よりも速くなる場合があります。
  2. 春になるかもしれませんか?これは動的に豆を登録することができますが、これはやや醜い解決策のように見えますが、とにかくそれらをアンロードすることはできません。おそらく、春のブートが役立つかもしれない?
+1

OSGiは、多くのコーナーケースを処理する必要があるため、複雑に見えることがあります。あなたがルート2または3に行くなら、あなたはOSGiのかなりの部分を再実装することになりそうです--1829年の経験の恩恵なしで:-) –

答えて

1

私は部分的に質問に答えることができますが、何もありません...あなたは正しいです、モジュール性はかなり退屈な話題です(少なくともJava 9まで)。

Ad idea 2(Spring):私はすでにSpring Boot over hereにいくつかの考えを費やしており、OSGI(それに入る価値がある)または純粋なMicroserviceアーキテクチャに固執するとの結論に達しました。

+1

モジュール化はJava 9でも退屈な話題になります。 Java 9には魔法の妖精の塵が入っていません: –

1
  • 私はあなたがアプリケーションの全体の再デプロイメントを行っていないと仮定していますが、変更することなく、メソッドの機能を変更したい場合は、あなたがそれを

  • を開発している間、アプリケーション全体を毎回再起動する必要はありませんあなたが春を使用することができ、クラスやメソッドのシグネチャは

  • をロードプロジェクトhttps://mvnrepository.com/artifact/org.springframework/springloaded/1.2.6.RELEASE

  • 設定JVMオプション-javaagentに依存関係を追加します。パスの\ springloa除外バージョン。jarファイル-noverify

    • このオプションは、あなたが私には広葉樹eccomerceのウェブサイトを持っていると私はTomcatを埋め込みまたは実行するバッチスクリプト内MAVEN_OPTSにこのオプションを追加したTomcatの

    • 実行する方法に応じていくつかの方法で設定することができますあなたは

  • TomcatのVMオプションの実行コンフィギュレーションにこれを設定することができますhttp://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html

を読みます
+0

ありがとう、Zildyan!私が理解する限り、これはホットスワッピング技術に関連しています。しかし、私はロード/アンロードの技術にもっと興味があります。違いは、ホットスワッピングはメモリ内のいくつかのクラスインスタンスを置き換え、追加して完全に削除したいということです。 – MiamiBeach

2

クラスは、クラスローダとそのクラスローダに到達できないためにガベージコレクションに適格でない場合にのみアンロードできます。クラスローダーはロードされたすべてのクラスに到達することができ、クラスローダーによってロードされたすべてのクラスはそのクラスローダーに到達することができ、クラスのインスタンスであるすべてのオブジェクトはクラスに到達することができます。つまり、クラスローダー、それらのクラスのインスタンスであるすべてのオブジェクトはすべてに到達でき、ガーベジコレクションされる必要があります。そのときだけ、完全なオブジェクトグラフがガベージコレクションされたときにクラスを「アンロード」することができます。

関連する問題