maven-download-pluginでjava.io.StreamCorruptedException: invalid stream header: 00000000が出たときの対処法

とりあえず使ってたmaven-download-plugin1.2.0と古かったので、1.4.0にバージョンアップしたら直った。

詳細な発生条件や原因はちゃんと調べられていないが、覚書としてメモしておく。

 

 

[前提条件]

とあるMavenプロジェクトで、テスト用にDynamoDB Localをダウンロードして利用するようにしていた。

pom.xmlの記述を一部抜粋するとこんな感じ。

<plugin>
    <groupid>com.googlecode.maven-download-plugin</groupid>
    <artifactid>download-maven-plugin</artifactid>
    <version>1.2.0</version>
    <executions>
        <execution>
            <id>install-dynamodb-local</id>
            <phase>initialize</phase>
            <goals>
                <goal>wget</goal>
            </goals>
            <configuration>
                <url>https://s3-us-west-2.amazonaws.com/dynamodb-local/dynamodb_local_2019-02-07.tar.gz
                <unpack>true</unpack>
                <outputdirectory>dynamodb_local</outputdirectory>
                <md5>86fe3f4a4919a37163207a086db6d86b</md5>
            </configuration>
        </execution>
    </executions>
</plugin>

 

また、この時利用していたOSは何故か64bitのWindows 8(正確にはWindows 8.1)であった*1。本当に、どうしてWindows 8でビルドなんかしたんだろう……。

 

[問題の詳細]

これでmvn installコマンドを実行すると、ビルドが始まるのだが、上の部分を実行しようとすると次のようなエラーがでる。

[ERROR] Failed to execute goal com.googlecode.maven-download-plugin:
download-maven-plugin:1.2.0:wget (install-dynamodb-local) on project XXXXXXXX: 
IO Error: invalid stream header: 00000000 -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: 
Failed to execute goal com.googlecode.maven-download-plugin:
download-maven-plugin:1.2.0:wget (install-dynamodb-local) on project XXXXXXXX: 
IO Error
  at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
  at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
  at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
  at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
  at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
  at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
  at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)
  at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355)
  at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
  at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
  at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216)
  at org.apache.maven.cli.MavenCli.main(MavenCli.java:160)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:497)
  at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
  at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
  at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
  at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.MojoExecutionException: IO Error
  at com.googlecode.WGet.execute(WGet.java:260)
  at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)
  at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
  ... 19 more
Caused by: java.io.StreamCorruptedException: invalid stream header: 00000000
  at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806)
  at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
  at com.googlecode.DownloadCache.loadIndex(DownloadCache.java:103)
  at com.googlecode.DownloadCache.getEntry(DownloadCache.java:44)
  at com.googlecode.DownloadCache.getArtifact(DownloadCache.java:72)
  at com.googlecode.WGet.execute(WGet.java:210)
  ... 21 more

 

DownloadCacheという文字列が見えたので、キャッシュ関連の問題を疑い、コマンドをmvn clean installに変更して実行してみるも状況は変わらず。

 

[解決策]

最終的な解決策としては、冒頭で記したようにプラグインのバージョンを上げることで解決した。pom.xmlプラグインのバージョンを指定している箇所を以下のように修正して、ビルドが正常終了することを確認した。

-    <version>1.2.0</version>
+    <version>1.4.0</version>

 

プラグインGitHubリポジトリを調べたが、似たようなissueは見つけることが出来なかった。もしかしたら、今回ダウンロード対象にしていたファイル限定で何か問題があったのかもしれない*2

github.com

 

また、エラーメッセージで重要そうな「StreamCorruptedException: invalid stream header: 00000000」でググってみても、それらしい解決策を記載したページは見つけることが出来なかった。

 

検索で行き詰まりを感じたので、王道に戻ってプラグインのバージョンを確認し、自分の利用しているバージョンが古いことに気づき、何とか解決策を見つけることが出来た。とはいえ結局根本的な原因がなんなのかは全くわからないままなので、若干の気持ち悪さが残る。気持ち悪さというか、原因を特定出来ない自分の不甲斐なさというか。モヤモヤ。

 

その後、さらに検証として以下のことを行った。

  • プラグインのバージョンを1.3.0に変更してビルドが正常終了することを確認
  • プラグインのバージョンを1.2.0に戻して、ビルドが同じエラーで異常終了することを確認

プラグインバージョンを1.2.0に戻すと再発することが確認出来たので、やはり変なファイルキャッシュがローカルにある、という線は薄そう。プラグインのバージョンアップによってファイルキャッシュのダウンロード先が変更になった、とかだとしたら変なファイルが1.2.0で利用しているローカルディレクトリに存在しているという可能性も捨てきれない。モヤモヤ。

 

[まとめ]

  • ライブラリやツールの動作に問題がある場合はとりあえずバージョンを上げてみるといいかも

*1:後で64bitのWindows 10端末でビルドを実行したところ、プラグインバージョン1.2.0でも特に問題は発生しなかった。

*2:しかしダウンロード対象のファイルに問題があるのならWindows 10でも同じ問題が起きるはずなので、やはりその線ではなくプラグイン自体に問題がありそう。