Mavenの無効なLOCヘッダーエラーの処理

1. 前書き

ローカルのlink:/maven[Maven]リポジトリのjarが破損している場合、エラー「_Invalid LOC Header_」が表示されることがあります。
このチュートリアルでは、それがいつ発生するか、そしてそれをどのように処理し、*時にはそれを防ぐか*について学習します。

2. 「無効なLOCヘッダー」はいつ発生しますか?

Mavenは、プロジェクトの依存関係をlink:/maven-local-repository[local repository]というファイルシステム上の既知の場所にダウンロードします。 Mavenがダウンロードするすべてのアーティファクトには、SHA1およびMD5チェックサムファイルも伴います。
link:/uploads/localrepo-1-100x32.png%20100w []
これらのチェックサムの目的は、関連するアーティファクトの整合性を保証することです。 *ネットワークとファイルシステムは、他のものと同じように*失敗する可能性があるため、アーティファクトが破損し、アーティファクトの内容が署名と一致しない場合があります。
これらの状況では、Mavenビルドは「無効なLOCヘッダー」エラーをスローします。
**解決策は、破損したjarをリポジトリから削除することです。 **いくつかの方法を見てみましょう。

3. ローカルリポジトリを削除する

エラーの簡単な修正方法は、* Mavenローカルリポジトリ全体を削除して、プロジェクトを再度ビルドすることです*。
rm -rf ${LOCAL_REPOSITORY}
これにより、ローカルキャッシュが消去され、プロジェクトのすべての依存関係が再ダウンロードされます-*あまり効率的ではありません。*
デフォルトのローカルリポジトリは、_https://maven.apache.org/guides/mini/guide-configuring-maven.html [settingsで指定しない限り、_ $ \ {user.home} /。m2 / repository_にあることに注意してください。 .xml] <localRepository> _タグ。 コマンドでローカルリポジトリを見つけることもできます:_mvn help:evaluate -Dexpression = settings.localRepository_

4. 破損した瓶を​​見つける

別の解決策は、*特定の破損したjarを識別し、ローカルリポジトリから削除することです*。
Maven出力スタックトレースコマンドを使用すると、処理に失敗したときに破損したjarの詳細が含まれます。
buildコマンドに-Xを追加することにより、デバッグレベルのログを有効にできます。
mvn -X package
結果のスタックトレースは、ログの終わりに向かって破損したjarを示します。 破損したjarを特定したら、ローカルリポジトリで見つけて削除できます。 ビルド時に、Mavenはjarのダウンロードを再試行します。
また、_zip -T_コマンドを使用してアーカイブの整合性をテストできます。
find ${LOCAL_REPOSITORY} -name "*.jar" | xargs -L 1 zip -T | grep error

5. チェックサムの検証

前述の2つのソリューションは、Mavenにjarの再ダウンロードのみを強制します。 もちろん、この問題は今後のダウンロードで再び発生する可能性があります。 *リモートリポジトリからアーティファクトをダウンロードするときにチェックサムを検証するようにMavenを構成することにより、これを防ぐことができます。*
Mavenコマンドに_–strict-checksumsまたは-C_オプションを追加できます。 これにより、計算されたチェックサムがチェックサムファイルの値と一致しない場合、Mavenはビルドに失敗します。
チェックサムが一致しない場合にビルドを_失敗_する2つのオプションがあります:
-C,--strict-checksums
または_warn_(デフォルトオプション):
-c,--lax-checksums
今日、Mavenでは、中央リポジトリにアーティファクトをアップロードする際にhttps://central.sonatype.org/pages/requirements.html#sign-files-with-gpgpgp[signature files]が必要です。 ただし、中央リポジトリには署名ファイルがないアーティファクトがあります*、特に歴史的なものがあります。 そのため、デフォルトのオプションは_warn_です。
より永続的な解決策として、Mavenのhttps://maven.apache.org/ref/current/maven-settings/settings.html[_settings.xml_]ファイルで_checksumPolicy_を構成できます。 このプロパティは、アーティファクトチェックサムの検証が失敗したときの動作を指定します。 将来の問題を回避するために、チェックサムが失敗した場合にダウンロードが失敗するようにsettings.xmlファイルを編集しましょう。
<profiles>
    <profile>
        <repositories>
            <repository>
                <id>codehausSnapshots</id>
                <name>Codehaus Snapshots</name>
                <releases>
                    <enabled>false</enabled>
                    <updatePolicy>always</updatePolicy>
                    <checksumPolicy>fail</checksumPolicy>
                </releases>
            </repository>
        </repository>
    </profile>
</profiles>
もちろん、設定済みのリポジトリごとにこれを行う必要があります。

6. 結論

この簡単な記事では、無効なLOCヘッダーエラーが発生する可能性がある場合と、その処理方法のオプションについて説明しました。