7

非常に特殊な状況に直面しており、アドバイスが必要です。同じ会社の別のプロジェクトに依存するプロジェクトに取り組んでおり、依存関係にいくつかの変更を適用する必要があります。私が抱えている問題は、依存関係からのソースコードが失われたことです。そのため、リポジトリ内の Maven 依存関係と対応する jar ファイルだけが残っています。その上、JiBX パーサーを使用して作成された Jar ファイル内のいくつかのクラスは、私が持っていないいくつかの XSD ファイルをマッピングし、結果のクラスは合成であり、それらを適切に処理できる逆コンパイラが見つかりませんでした。

そのすべての唯一の良い点は、変更する必要があるクラスを適切に逆コンパイルできることです。そのため、次のようにしました。

  • jar ファイル全体を逆コンパイルしたところ、いくつかのクラス (JiBx のクラス) が空であるか、メソッドが正しく実装されていませんでした。
  • 間違ったメソッドの本体をコメントアウトしてスタブ オブジェクトを作成し、必要な変更を正しいクラスに適用して再コンパイルしました。
  • 古い Jar ファイルを取得して開き、手動で古いクラスを新しいクラスに置き換えました。

結果のJarは期待どおりに機能しました。

ここで私の質問は、Maven を使用してそのすべてを実行できますか?

アイデアは、JiBX クラス ファイルをリソースとして配置し、同等のスタブをソース ファイルとして保持してから、maven に次のようにさせることです。

  • 通常どおりすべてをコンパイルし、コンパイルされたすべてのクラス ファイルをターゲット フォルダーに配置します。
  • ターゲット フォルダーからスタブ クラス ファイルを削除し、それらを古いプリコンパイル済みクラス ファイルに置き換えます。
  • ジャーをパッケージ化します。

どのアプローチをお勧めしますか?

アップデート

依存プロジェクトの構造について、さらに詳しく説明します。

すべてのクラスは同じパッケージ内にあります。

my.project.domain.JiBX__c_GeneratedObfuscatedClass1.java
my.project.domain.JiBX__c_GeneratedObfuscatedClass2.java
my.project.domain.JiBX__c_GeneratedObfuscatedClass3.java
my.project.domain.CustomizableClass1.java
my.project.domain.CustomizableClass2.java
my.project.domain.CustomizableClass3.java

JiBX クラスは依存関係として適切にインポートされず、CustmizableClasses のいずれかをプロジェクト ソースに配置して、JiBX クラスを依存関係に含めようとすると、コンパイラは不足しているメソッドを報告します。

提案どおりに Shade プラグインも使用してみましたが、JiBX クラスをソース パスに含める必要があるため、jar 依存関係とコンパイルされた CustomizableClasses からパッケージ JiBX クラスに含める必要がありますが、jar dep から CustomizableClasses をスキップしてコンパイルしますJiBX クラス。

私はそれがうまくいくように見えますが、私はまだそれを行う方法を見つけられなかったことを認めます. 手がかりは大歓迎です。

更新 2 (解決策)

他の誰かが同じことをする必要がある場合に備えて、提案されているようにシェードプラグインを使用して最終的にこれをどのように管理したかをここで説明します:

最後に、同じパッケージ内に逆コンパイルされたクラスを含むプロジェクトを作成し、逆コンパイルしたくないメソッドをコメントアウトしたままにしました。

pom.xml に以下を追加しました。

<build>
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <artifactSet>
                        <includes>
                            <include>${project.groupId}:${project.artifactId}</include>
                            <include>TheDamnedProject:WithoutSources</include>
                        </includes>
                    </artifactSet>
                    <filters>
                        <filter>
                            <artifact>TheDamnedProject:WithoutSources</artifact>
                            <includes>
                                <!-- These classes will be taken directly from dependency JAR -->
                                <include>my/package/ClassWhichCouldNotBeDecompiled1.class</include>
                                <include>my/package/ClassWhichCouldNotBeDecompiled2.class</include>
                                <include>my/package/ClassWhichCouldNotBeDecompiled3.class</include>
                                <include>my/package/ClassWhichCouldNotBeDecompiled4.class</include>
                            </includes>
                        </filter>
                        <filter>
                            <artifact>${project.groupId}:${project.artifactId}</artifact>
                            <excludes>
                                <!-- These classes will be overridden by the ones inside the JAR -->
                                <exclude>my/package/ClassWhichCouldNotBeDecompiled1.class</exclude>
                                <exclude>my/package/ClassWhichCouldNotBeDecompiled2.class</exclude>
                                <exclude>my/package/ClassWhichCouldNotBeDecompiled3.class</exclude>
                                <exclude>my/package/ClassWhichCouldNotBeDecompiled4.class</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>

ありがとう!

カルレス

4

1 に答える 1

6

これが私がそれを行う方法です:

  • パッケージ タイプjarを使用して、この Jar ファイル用の新しい Maven プロジェクトを作成します。
  • 元の Jar ファイルを依存関係として含める
  • 1 つの逆コンパイルされた .java ファイルを src フォルダーに追加します。

jar ファイルの他のクラスが使用可能であるため、これで .java ファイルをコンパイルできるようになります。

これで 2 つの Jar ファイルができました。1 つは元のファイルで、もう 1 つは再コンパイルされて変更された単一のクラスを含む必要があります。

両方をアプリケーション クラス パスに追加しても機能する場合がありますが、クラスパスの順序によって異なります。

最終的に 1 つの jar ファイルが必要な場合は、Maven Shade プラグイン( http://maven.apache.org/plugins/maven-shade-plugin/ ) を参照することをお勧めします。複数のソースからのコンテンツを含む新しい Jar ファイル。これにより、新しい Jar ファイルに入る内容をフィルタリングできます。

Maven Shade プラグインを使用すると、各アーティファクトのどのクラスを含めるかを指定できます。ここで説明されているように、ワイルドカードと include/exclude タグを使用します: http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

その Jar ファイルが作成されたら、Maven Release プラグインを使用してリリースし、そのアーティファクトをダウンストリームに含めます。これにより、パッチが適用された Jar が本当に必要な場合にのみ更新できるようになります。おそらくすべてのビルドで行う必要はありません。ただし、それは使用パターンによって異なります。

新しい Jar ファイルのバージョン番号については、オリジナルのバリエーションを使用することをお勧めします。同じgroupIdとを使用してartifactId、バージョン番号を変更します。元のファイルに が含まれている場合、ソースに基づいていることを示すために1.0.2、パッチを適用した新しいファイルを としてリリースする必要があります。追加の変更が必要な場合は、そのままリリースしてください。これにより、パッチがどのバージョンに基づいているかを簡単に理解できるようになり、パッチ番号が増加するため、リリースを区別する手段が得られます。1.0.2-11.0.21.0.2-2

于 2013-02-12T11:06:50.350 に答える