3

どうした? 私はMinecraftサーバー管理者/サーバーホスト/プラグイン開発者ですが、コアゲームの新しいリリースごとに自分の個人用プラグインを更新しなければならないのは絶対に面倒です。いつもそうだったわけではありません。過去にプラグインを壊すことなく、20のバージョンで動作させてきました。毎月1回、40個のプラグインを傍観して更新する必要があることは、ご想像のとおり、これまでこれを行う必要がなかったことを考えると、私の人生で不必要な煩わしさです。

問題の原因は何ですか? 新しいリリースごとに、コンパイルされたjarファイルで異なるインポートを使用する必要があるため、古い(ただしまだ機能している可能性がある)jarファイルを強制的に破棄します。私を信じてください。エラーログを読んで、実際に外に出て新しいアップデートをダウンロードする必要がある時期を知ることができます。今は自分から守る必要はありません。それはただのゲームです、私はそれにあまり乗っていません。

それで私はそれについて何をしたいですか? この目的のために、すべてのプラグインを自動的に更新する簡単なプログラムを作成したいと思います。(プラグインはパッケージ化された.jarファイルの形式で提供されます。)次のことを行う必要があります。

  1. X_Folder内のすべてのjarファイルのリストを取得します
  2. jarファイルごとに、すべてのクラスをケースに入れます。
  3. クラスファイルごとに、Y_STRINGのインスタンスを検索し、それをZ_STRINGに置き換えます。
  4. すべてがjarファイルに正しく戻されることを確認してください。
  5. 終わり。

質問? クラスファイル編集メソッドをどのようにコーディングしますか?どうやって始めたらいいのかわからない。

免責事項 私はこれに取り組んでいないように聞こえて申し訳ありません。私は、バイトコード操作の経験がありません。いくつかの例を見てきましたが、インポートの名前変更についてはまだ何も見ていません。うまくいけば、ここの誰かが私を助けることができます。ありがとうございました!

4

2 に答える 2

3
  1. X_Folder内のすべてのjarファイルのリストを取得します
  2. jarファイルごとに、すべてのクラスをケースに入れます。
  3. クラスファイルごとに、Y_STRINGのインスタンスを検索し、それをZ_STRINGに置き換えます。
  4. すべてがjarファイルに正しく戻されることを確認してください。
  5. 終わり。

1)これは基本的なファイル操作です。java.io.File#listFiles()またはその過負荷を調べます。

2)JARファイルは、特定の内容のZIPファイルです。調べるjava.util.jar.JarFilejava.util.zip.ZipInputStream; エントリ(JarFile#entries())を繰り返し処理し、()内の各クラスファイルを解凍しますJarFile#getInputStream(ZipEntry)

3)クラスファイルはバイナリ形式ですが、非常によく文書化されています。一般的なレイアウトはウィキペディアに記載されています:http://en.wikipedia.org/wiki/Java_class_file#General_layout

特に興味深いのは、クラスファイルのバイト10から始まり、クラスファイル内から参照されるすべての定数を列挙する定数プールです。繰り返しになりますが、ウィキペディアに文書化されています:http: //en.wikipedia.org/wiki/Java_class_file#The_constant_pool。そのエントリ数は、バイト8および9(ビッグエンディアン)に格納されます。

定数プール内で特に興味深いのは、文字列とクラス参照です。

文字列は、最初のバイトが。であることによって識別され1ます。次の2バイトは文字列のバイト長であり、残りのバイトは(ほぼ)UTF-8です。UTF-8とは異なり、上位プレーンはサロゲートペア(4ではなく6バイト)として格納され、コードポイント0は非正規化されて格納されます。

クラス参照は、クラスの完全修飾名を指す定数プールへのポインターに他なりません。完全修飾名は、完全修飾名()を区切るために、ドットではなくスラッシュで格納されますjava/lang/Object。タイプ7としてマークされています。

定数プール内の他のエントリ:タイプ3,4、9-12は4バイト、タイプ7および8は2バイトです。タイプ5と6は8バイトですが、定数プールで2つのスロットも使用します。

定数プールのバイト長が変更されても、クラスファイルの残りの部分は気にしないようです。定数プールの最後にエントリを追加することも安全のようです(定数プールの長さを必ず更新してください)。

4)jarファイルは単なるzipファイルであるため、必要なのは、元のファイルを更新された内容で再パッケージ化することだけです。これがインプレースで可能になるとは思わないので、ファイルのシャッフルが必要になる場合があります。java.util.zip.ZipOutputStream実装を調べてください。

于 2012-12-30T20:48:06.390 に答える
1

プラグインを逆コンパイルし、IDEにロードして手動で更新することもできますが、よりグローバルなソリューションが必要です。その上、これはJavaの新しいスキルを学ぶ良い機会です。

あなたが学ばなければならないスキルは次のとおりだと思います。

  • コードをIDEにロードするソースから再構築できるビルドツール(AntやMavenなど)、および

  • ストリームエディタ(sedやawkなど)を使用してソースコードを更新する方法、またはマクロプリプロセッサ(cppやm4など)を使用してソースコードを生成する方法。

ただし、Minecraftプラットフォームの性質を考えると、Java/Javaスキルを学ぶのに適した場所としてはお勧めしません。確かに、バイトコードファイルのハッキング/微調整/マッサージは、ほとんどのプロのJava開発者が通常必要としないスキルです。

于 2012-12-30T20:15:29.430 に答える