Jenkins + Maven3.2.1 で IllegalAccessError on AbstractMapBasedMultimap
メモ。時間があるときに調べる。
Maven3.2.1とJenkins1.581のCoreとで依存しているGuavaのバージョンが違っていることが遠因になっていくつかのプラグインが動かなくなっている。(下記参照)
[#JENKINS-22252] Maven 3.2.1: IllegalAccessError on AbstractMapBasedMultimap - Jenkins JIRA
JenkinsでMavenプロジェクトを作って静的解析をしていて下記のようなエラーが出ていたらこの問題に該当すると思って良さそう。PMD, CheckStyle, FindBugs全て同じ。静的解析以外でも問題が起きそうだけど、今のところ聞いてない。
java.io.IOException: Remote call on channel failed at hudson.remoting.Channel.call(Channel.java:748) at hudson.remoting.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:168) at com.sun.proxy.$Proxy7.execute(Unknown Source) at hudson.maven.MavenBuildProxy$Filter.execute(MavenBuildProxy.java:206) at hudson.plugins.analysis.core.HealthAwareReporter.registerResultsOnMaster(HealthAwareReporter.java:325) at hudson.plugins.analysis.core.HealthAwareReporter.postExecute(HealthAwareReporter.java:316) at hudson.maven.Maven3Builder$MavenExecutionListener.recordMojoEnded(Maven3Builder.java:628) at hudson.maven.Maven3Builder$MavenExecutionListener.mojoSucceeded(Maven3Builder.java:610) at hudson.maven.Maven3Builder$JenkinsEventSpy.onEvent(Maven3Builder.java:306) ... Caused by: java.lang.LinkageError: Failed to load com.google.common.collect.AbstractMapBasedMultimap at hudson.remoting.RemoteClassLoader.loadClassFile(RemoteClassLoader.java:326) at hudson.remoting.RemoteClassLoader.findClass(RemoteClassLoader.java:236) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:270) at hudson.remoting.MultiClassLoaderSerializer$Input.resolveClass(MultiClassLoaderSerializer.java:113) ... Caused by: java.lang.IllegalAccessError: class com.google.common.collect.AbstractMapBasedMultimap cannot access its superclass com.google.common.collect.AbstractMultimap at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.lang.ClassLoader.defineClass(ClassLoader.java:643) at hudson.remoting.RemoteClassLoader.loadClassFile(RemoteClassLoader.java:322) ... 39 more
Workaroundとしては、Mavenプロジェクトをやめてフリースタイルプロジェクトで作るか、Mavenのバージョンを3.0.5くらいまで落とせば一応動く。細かいバージョンの組み合わせは試してないが、まあ3.0.5まで落とせば大丈夫っぽい、という程度の理解をしている。
これ結構直すのは面倒そうだなあ。JenkinsのGuavaバージョンをあげるのか、各プラグイン側でWorkaroundな修正を入れるのか。。
maven-archetype-quickstartが未だにJUnit3.8.1使ってる件
どうにかならないんでしたっけ。。
mvn archetype:generateすると、下記のように344(maven-archetype-quickstart)を勧められて、
$ mvn archetype:generate 略 913: remote -> tk.skuro:clojure-maven-archetype (A simple Maven archetype for Clojure) 914: remote -> uk.ac.rdg.resc:edal-ncwms-based-webapp (-) Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 344:
言われるがままにプロジェクトを作って、出来上がったpomを見ると、JUnit3.8.1。。
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
この問題は既に下記チケットで報告され、既に修正されているっぽく*1、次回リリースの1.2に含まれそうだが。。
http://jira.codehaus.org/browse/MARCHETYPES-41
セントラルリポジトリを見てみるとまだ1.2はリリースされてない。。
http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.apache.maven.archetypes%22%20AND%20a%3A%22maven-archetype-quickstart%22
ちょ、困るんですけど。。maven-archetype-quickstartのMLどこなん。。とりあえずチケットAssigneeのOlivierってのにメールしてみたけど。。。
*1:Diffくらい貼れよと思った
Scalaのカバレッジツールの定番scctがMaven Central Repoに
アップロードされてました。(com.github.scctの方。com.github.seratch.reaktorの方は id:seratch さんでしょう)
http://search.maven.org/#search%7Cga%7C1%7Cscct
誰がやったんだろ。
このスレ見る限り、まだ本人からのコメントはないけど。
https://github.com/mtkopone/scct/issues/43
zshめも
#maven function listMavenCompletions { reply=(cli:execute cli:execute-phase archetype:generate compile clean install test test-compile deploy package cobertura:cobertura hpi:create hpi:run eclipse:eclipse jetty:run -Dmaven.test.skip=true -DarchetypeCatalog=http://tapestry.formos.com/maven-snapshot-repository -Dtest= `if [ -d ./src ] ; then find ./src -type f | grep -v svn | sed 's?.*/\([^/]*\)\..*?-Dtest=\1?' ; fi`); } compctl -K listMavenCompletions mvn #google function google() { local str opt if [ $# != 0 ]; then # 引数が存在すれば for i in $*; do str="$str+$i" done str=`echo $str | sed 's/^\+//'` #先頭の「+」を削除 opt='search?num=50&hl=ja&ie=euc-jp&oe=euc-jp&lr=lang_ja' opt="${opt}&q=${str}" fi open http://www.google.co.jp/$opt #引数がなければ $opt は空になる } alias ggl=google
JSONICをMavenで使う方法
いっつも忘れるのでメモ。
JSONICはSeasarのMavenリポジトリに置いてあるので、Mavenで使いたい場合にはpom.xmlに下記のように書いてやる必要がある。
<repositories> <repository> <id>seasar.org</id> <url>http://maven.seasar.org/maven2/</url> </repository> </repositories> <dependencies> <dependency> <groupId>net.arnx.jsonic</groupId> <artifactId>jsonic</artifactId> <version>1.2.0</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies>
JSONICはJavaで書かれたJsonライブラリ。
下記参照。
http://jsonic.sourceforge.jp/