サードパーティライブラリの依存関係でバグのホットフィックス

StackOverflow https://stackoverflow.com/questions/19848440

  •  29-07-2022
  •  | 
  •  

質問

私が使用しているより大きなアプリケーションフレームワークでマイナーなバグを見つけました。固定では、単一のクラスで2行を変更する必要があります。問題を修正し、プロジェクトのリポジトリへの変更をプッシュしました。

ただし、明日リリースする必要があります。したがって、ライブラリが新しいバージョンをリリースするまで待つことはできません。パッチされたバージョンを私のプロジェクトに統合するための最良の方法は何だろうと思っています。

  • プロジェクトの構築:これは非常に難しいと思います。スナップショットリポジトリでは非常に多くのユニットテストが壊れているため、適切に構築することさえできません。単体テストがなくても、見つからない依存関係が明らかに欠落しているため、それほど遠くはありません。 Maven Centralで。また、Maven Centralで見つけることができないため、固定バージョンを他のすべての開発者に送信する必要があります。 (私たちはネットで作業していますが、独自のネクサスを持っていません。)

  • プロジェクトに新しいモジュールを追加して、修正したクラスのコピーを保持しています。次に、このモジュールをクラスのOverridenバージョンを使用するすべてのモジュールへの依存関係として追加します。しかし、JVMは実際にどのクラスをロードするかをどのように決定していますか? 2つが見つかります - 同じ名前のクラスを含むファイル。実際にロードするのはどれですか?この作業を行うことができれば、これによりクラスの変更されたバージョンをプロジェクトと統合できるようになり、プロジェクトと一緒にパッチを配布し、バグが修正されたら、モジュールを削除できます。

  • 変更されたクラスファイルを影響を受けるモジュール自体に含めています。これまでのところ、これはJVMが常に同じJARからクラスを最初にロードするため、私にとって最も簡単な解決策として表示されます。 (私は正しいですか?少なくともそれは私が私のテストで観察したことです。)

これに関する入力をありがとう。

役に立ちましたか?

解決

最終的にプロジェクトを個別に構築し、このバージョンを別の名前空間に移動することになりました。これは明らかにそれほど珍しいことではありません。たとえば、Hibernateは、APIの変更によるバージョンの競合を回避するために、CGLIBを独自の名前空間に保持します。

  • 最初に提案されたソリューションには、私が使用したプロジェクトが別の依存関係でも使用されたときに問題がありました。 正常 バージョンはクラスパスにあり、紛争の命名により非常に奇妙な振る舞いにつながったものでした。

  • 2番目と3番目の提案には、最初の提案と同様の問題がありました。さらに、依存関係の他のバージョンとの互換性を破りました。

痛みを伴うように聞こえます。名前空間から出て、個別のビルドを提供することは、コードの数行しか変更しなくても、必須です。

他のヒント

プロジェクトの依存関係をカスタムネームスペースに移動することは、いくつかの理由で最適ではないと思います。

  • あなたの変更は、依存関係の元の開発者に送り返されることはないでしょう。
  • 新しい依存関係バージョンに追いつくのは難しいので、サードパーティの開発者や貢献者からのバグフィックス、新機能、脆弱性の修正はもうありません。
  • 私の経験は、時間が経つにつれて忘れられているということです どうやってどうして カスタムネームペース依存関係が変更されました。これは、プロジェクトのこの部分が非推奨であるだけでなく、触れられないことになります。

Jitpackを使用したワークフローが最良のソリューションであることに同意します。わずか数分のオーバーヘッドでそれを行うための詳細なガイドを含むブログ投稿を書きました: https://5am.technology/2016/12/fix-bugs-third-party-dependency-jitpack/

tl; dr;

訪問 https://jitpack.io そして、それがどのように機能するかを読んでください


問題を解決するための手順

サードパーティのライブラリがGitHubにあると仮定し、プロジェクトを単純にクローンして修正します。

次に、使用します https://jitpack.io. 。 jitpackはあなたのリポジトリから.jarを作成し(コードを修正した場所)、あなたのように依存関係を生成します

<dependency>
    <groupId>GITHUB_USER</groupId>
    <artifactId>REPOSITORY</artifactId>
    <version>COMMIT</version>
</dependency>

また、このリモートリポジトリを明示的に追加する必要があります

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
  • 速い回避策
  • 簡単です
  • 元に戻すのは簡単です
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top