ikeike443のブログ

ソフトウェアビジネスに関心がある系のブログ

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めも

zshmavenの補完、google検索の実行

#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で使う方法

いっつも忘れるのでメモ。
JSONICSeasarMavenリポジトリに置いてあるので、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>

JSONICJavaで書かれたJsonライブラリ。
下記参照。
http://jsonic.sourceforge.jp/