Chonaso's Commentary

InternetやIT技術などについて知ったこと、試したこと、考えたことを書いていきます。

mavenデプロイで軽くハマった件

初期開発ベンダーの秘伝のタレのようなbuild.xmlから脱却して、コモディティ化されたビルド・依存性管理とビルド成果物の管理をきちんとやらなきゃダメ、ってアジし続けて最近になってようやく許しが出たのでSonatype Nexusをセットアップして既存プロジェクトとにらめっこしながらpom.xmlと格闘の日々。

JenkinsのプラグインとNexusがよく出来過ぎててMavenインハウスリポジトリの構築やデプロイ設定そのものはすごく簡単。

問題はpom.xml

「依存ライブラリのバージョンは移行前と完全一致」「ソースコードのantビルド結果とmavenビルド結果はバイナリ完全一致」といった多分そこまで頑張らなくてもいいんだろうけど、何かあったら絶対ツッ込まれるポイントはどうにかクリア。

Snapshotのビルドとデプロイまで上手くいったので次はRelease、と思ったら以下のエラーでハマる。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.3.2:prepare (default-cli) on project XXXXXX: Cannot prepare the release because you have local modifications :
[ERROR] [target/XXXXXX-0.0.1-SNAPSHOT.jar:unknown]
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.3.2:prepare (default-cli) on project XXXXXX: Cannot prepare the release because you have local modifications : 
[target/XXXXXX-0.0.1-SNAPSHOT.jar:unknown]

    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
    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:128)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
    at org.jvnet.hudson.maven3.launcher.Maven32Launcher.main(Maven32Launcher.java:132)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:330)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:238)
    at jenkins.maven3.agent.Maven32Main.launch(Maven32Main.java:181)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at hudson.maven.Maven3Builder.call(Maven3Builder.java:136)
    at hudson.maven.Maven3Builder.call(Maven3Builder.java:71)
    at hudson.remoting.UserRequest.perform(UserRequest.java:121)
    at hudson.remoting.UserRequest.perform(UserRequest.java:49)
    at hudson.remoting.Request$2.run(Request.java:326)
    at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.maven.plugin.MojoFailureException: Cannot prepare the release because you have local modifications : 
[target/XXXXXX-0.0.1-SNAPSHOT.jar:unknown]

    at org.apache.maven.plugins.release.PrepareReleaseMojo.prepareRelease(PrepareReleaseMojo.java:299)
    at org.apache.maven.plugins.release.PrepareReleaseMojo.execute(PrepareReleaseMojo.java:247)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    ... 31 more
Caused by: org.apache.maven.shared.release.ReleaseFailureException: Cannot prepare the release because you have local modifications : 
[target/XXXXXX-0.0.1-SNAPSHOT.jar:unknown]

    at org.apache.maven.shared.release.phase.ScmCheckModificationsPhase.execute(ScmCheckModificationsPhase.java:185)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:234)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:169)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:146)
    at org.apache.maven.shared.release.DefaultReleaseManager.prepare(DefaultReleaseManager.java:107)
    at org.apache.maven.plugins.release.PrepareReleaseMojo.prepareRelease(PrepareReleaseMojo.java:291)
    ... 34 more

なんかもう全然わからなくて泣きそうだったんですが、どうやらtargetディレクトリをリポジトリに書いちゃっていたのがまずかったようです。(target/**はignoreしてるけど、target自体は登録されていた)

とりあえずはワークフローを一本通せたのでひと段落。

あと、ときどきデプロイ時に

WARNING: Couldn't clean up oid=3 from null

というのが出るんですが、情報が見当たらず。デプロイ自体は問題なくうまくいっているので放置ですかね...

今まで「Mavenは依存性解決とビルドのためのツール」という感じしか持っていませんでしたが(SNAPSHOTの意味すらよくわかってなかった)、この件でいまさらながらMavenのことがそこそこわかってきたような気がします。