5

現在のJavaアプリケーションにパッチを適用するプロセスを作成しようとしているので、ユーザーはアプリケーション全体ではなく、diffのみをダウンロードする必要があります。ほとんどのjarファイルは小さいので、バイナリ差分ほど低レベルにする必要はないと思います。したがって、jarファイル全体を置き換えることはそれほど大きな問題にはなりません(おそらく最大で5MB)。

変更されたファイルを判別し、それらのパッチを生成するための標準ツールはありますか?xdeltaやvpatchのようなツールを見たことがありますが、それらはバイナリレベルで機能すると思います。

私は基本的に、どのファイルを追加、置換、または削除する必要があるかを把握したいと思います。パッチを実行すると、(レジストリ設定から)ソフトウェアの現在のバージョンがチェックされ、パッチが正しいバージョンであることが確認されます。そうである場合は、必要な変更を加えます。これを自分で実装するのは難しいとは思えませんが、他の人がすでにこれを行っているのではないかと思いました。違いがあれば、インストーラーとしてNSISを使用しています。

ありがとう、

ジェフ

4

4 に答える 4

6

これを行うときは注意してください。まったく行わないことをお勧めします。

最大の問題は public static 変数です。それらは実際にはターゲットにコンパイルされ、参照されません。これは、Java ファイルが変更されていない場合でも、クラスを再コンパイルする必要があることを意味します。そうしないと、古い値を引き続き参照することになります。

また、メソッド シグネチャの変更にも細心の注意を払う必要があります。メソッド シグネチャを変更し、そのメソッドを呼び出すすべてのファイルを再コンパイルしないと、非常に微妙なバグが発生します。呼び出し元の Java ファイルが実際に再コンパイルする必要がない場合でもです。変更します (たとえば、パラメーターを int から long に変更します)。

この道をたどる場合は、お客様のサイトで複製できない非常にデバッグしにくいエラー (通常、トレースや重要な兆候はなく、受信した番号と送信した番号が一致しないなどの奇妙な動作) に備える必要があります。顧客を怒らせた。

編集(コメントするには長すぎます):

クラスファイルのバイナリ差分は機能するかもしれませんが、ある種のバージョン番号または日付がコンパイルされ、理由もなくコンパイルごとに少しずつ変更されると思いますが、それは簡単にテストできます。

public final staticsを使用せず (非公開にする)、すべての変更メソッド シグネチャを使用しない (代わりに非推奨にする) という厳密な開発プラクティスを採用することもできますが、考えられるすべての問題を知っているとは確信していません。遭遇した問題を知っているだけです。 .

また、Jar ファイルのバイナリ diff は役に立ちません。クラスを比較して、それらを jar に再​​統合する必要があります (追跡するのは簡単ではありません)。

リソースを個別にパッケージ化して、コードを少し最小限に抑えることはできますか? 文字列を引き出す (i18n に適しています) -- 常に完全なビルド/出荷を行うのに十分なクラス ファイルをトリミングできるかどうか疑問に思っているだけです。

一方で、Sun は、以前の JRE リリースと完全に互換性のあるクラス ファイルを作成するという順調な仕事をしているように見えるので、どこかにガイドラインがあるはずです。

于 2010-09-17T20:08:46.423 に答える
2

Java WebStart は、やりたいことを正確に実行するように設計されているため、Java WebStart が役立つかどうかを確認したい場合があります。

ドキュメントに増分更新の作成方法と実行方法が記載されていることは知っていますが、アプリケーション全体が変更されることはめったにないため、アプリケーション全体をデプロイします。準備ができたら、JNLP を更新する必要があります。

于 2010-09-17T20:16:09.257 に答える
1

どのように展開されますか?

ローカル ネットワークでは、すべてを .class ファイルとしてフォルダーに残します。起動スクリプトは、robocopy または rsync を使用して、ネットワーク共有からローカルにコピーします。.class ファイルが異なる場合は、同期されます。そうでない場合、同期されません。

非ローカル ネットワーク用に、独自のアップデーターを作成しました。md5sums のテキスト ファイルをダウンロードし、ローカル ファイルと比較します。異なる場合は、http からファイルを取得します。

于 2010-09-18T02:01:34.763 に答える
0

ずっと前にこれを解決する方法は、クラスパスと jar ファイルを使用することでした。私たちのアプリケーションは Jar ファイルでビルドされ、ランチャー Jar ファイルがありました。ランチャーのクラスパスには、メインの application.jar の前にクラスパスに読み込まれた patch.jar が含まれていました。これは、patch.jar を更新して、メイン アプリケーションの任意のクラスを置き換えることができることを意味していました。

しかし、これはずっと前のことです。よりシームレスなアプリケーションの更新を提供する Java Web Start タイプのアプローチのようなものを使用する方がよい場合があります。

于 2010-09-17T20:04:48.117 に答える