Oracleでアーカイブログが大量に

運用中のOracleデータベースで、夜間にアーカイブログが大量に吐かれて停止寸前になった。
普段の10倍くらいのサイズになっていた。


ちなみにOracleのバージョンは11.2.0.1 (SE)。


最初はバッチ処理の不具合で、大量にレコードを更新したのだろうと思っていたが、アーカイブログのサイズの監視スクリプトを見直しても、アーカイブログが急増する時間帯にバッチ処理などはほとんど走っていない。


ただ、当該の時間帯に、Oracleにデフォルトで有効になっている自動データベース・メンテナンス・タスクが走っていた。


Oracleの自動データベース・メンテナンス・タスクには以下の3種類がある。

  • オプティマイザ統計収集(auto optimizer stats collection)
  • セグメント・アドバイザ(auto space advisor)
  • SQLチューニング・アドバイザ(sql tuning advisor)


最後の「SQLチューニング・アドバイザ」は無効になっていたため、怪しいのは「オプティマイザ統計収集」と「セグメント・アドバイザ」である。
アーカイブログが大量に吐かれる日と吐かれない日があるため、特定のテーブルの統計情報が失効したのがトリガーでは?と考え、まずは「オプティマイザ統計収集」をオフにしてみた。

BEGIN
dbms_auto_task_admin.disable(
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;
/

しかし、これでは改善しないため、もう一方の「セグメント・アドバイザ」のほうを無効化してみたところ、アーカイブログが大量に吐かれる現象は収まった。

BEGIN
dbms_auto_task_admin.disable(
client_name => 'auto space advisor',
operation => NULL,
window_name => NULL);
END;
/

後で調べたところ、どうも特定のOracleのバージョンに存在するバグのようだ。

http://www.dbi-services.com/index.php/blog/entry/compression-advisor-excessive-redo-log-file-generation

target-densitydpiはなくなるの?

以前日記に、ページの横ピクセル数を端末の解像度によらず一定にする方法として、target-densitydpiを使う方法を紹介した。
しかし、Android4.2以降ではいわゆる標準ブラウザがなくなり、多くの機種ではデフォルトブラウザがChromeに置き換わる*1
それに伴って、内蔵のWebKitChromeではtarget-densitydpiが廃止されるようだ。

http://stackoverflow.com/questions/11592015/support-for-target-densitydpi-is-removed-from-webkit

まだまだ4.1以前の端末も存在するので、当面はブラウザによってinitial-scaleで調整する方法と切り替えて使用すべきだろう。

*1:全ての機種でデフォルトブラウザがChromeになるわけではなく、端末メーカーに委ねられているようだ。

Android向けページで解像度(画素数)固定するにはviewportにdensitydpiを指定するのがいいみたい

スマホ向けのWebページをつくる際、ページの想定する解像度や拡大・縮小の可否を指定するために、metaタグでviewportを指定するのが一般的。たとえばこんな感じ。

<meta name="viewport" content="width=device-width" />

上記の場合、デバイスの解像度にあわせてコンテンツを配置するため、端末ごとに横幅のピクセル数が異なる。そのため、端末によってはうまくレイアウトされない場合がでてくる。


そこで、widthの設定を変えて、どの端末でも横幅640ピクセル相当になるように拡大・縮小表示することができる。

<meta name="viewport" content="width=640" />

iOSバイスの場合上記の設定でうまくいく(らしい)が、Androidの標準ブラウザはwidthにピクセル値を指定した際の動作があやしく、文字列の自動改行の位置がおかしくなったりする。


Androidの場合、viewportにtarget-densitydpiというパラメータが用意されているため、これを利用してサイズ調整するのが良いようだ。

これは、コンテンツを表示する際に、1インチあたり何ドット(ピクセル)かを指定するパラメータで、デフォルト値は160dpiになっている。


横幅800ピクセルの解像度の端末に、640ピクセルで表示されることを想定したコンテンツを表示しようとした場合、160 * 640 / 800 = 128 (dpi)になる。
これをviewportで記述すると以下のようになる。

<meta name="viewport" content="width=device-width,target-densitydpi=128" />

ただ、端末の解像度によりviewportの指定を変化させるには、ページロード時にJavaScriptにより動的にdensitydpiの値を変化させる必要がある。


そこで、ページの先頭で以下のようなスクリプトを実行し、viewportの指定を書き換えてみた。
(一部jQueryを使用している。ただしmetaタグを追加するところはなぜかjQueryではできなかったため、DOMを直接操作している)

var width = 640; //指定したい解像度
var defaultDpi = 160; //デフォルト値


//viewportを変更するため、元々あったviewportを削除
$('meta[name=viewport]').remove();


// jQuery でmetaタグを操作できないのでDOMを直接変更
var densityDpi = (defaultDpi * width / screen.width) | 0;
var meta = document.createElement('meta');
meta.setAttribute('name', 'viewport');
meta.setAttribute('content', 'width=device-width, target-densitydpi=' + densityDpi);
document.getElementsByTagName('head')[0].appendChild(meta);

これで端末の解像度が変わっても、横幅は同一のピクセル値だとしてページをレイアウトすることができるようだ。


レスポンシブwebデザインの潮流には反するが、多少の崩れも許容できないような場合は役にたつかと。

JenkinsのDeploy PluginからJBoss 5.1にデプロイできなかった件のつづき

JenkinsのDeploy PluginからJBoss 5.1にデプロイできなかった件のつづき。
http://d.hatena.ne.jp/festiva1300/20120713/p2

結局、Deploy Pluginを利用するのはあきらめ、デプロイ先のマシンをJenkinsのスレーブにしてearを配置している。

JBossの場合、deployディレクトリにearファイルを配置(もしくは上書き)するだけで再デプロイされるため、以下のような設定をして自動デプロイを実現している。

  1. デプロイ先のマシンを「特定ジョブ専用」にしてJenkinsのスレーブにする
  2. ビルド用のジョブのから成果物をコピーし、JBossのdeployディレクトリに配置するスクリプトをジョブ(デプロイ用のジョブ)にする
  3. ビルド用のジョブの後続処理で、デプロイ用のジョブが実行されるようにする

ブラウザのウインドウを閉じる前に警告する

社内システム向けで、ブラウザウインドウを閉じる[×]ボタンなどで閉じてしまわないよう警告を出したいという要望があったので、対応した際のメモ。

  • タイトルバーの閉じるボタンやキーボードショートカット(CTRL+Wなど)で閉じようとしたときに警告する
  • 画面上のボタンやリンクをクリックしたときは警告しない

ユーザが表示中の画面から遷移または閉じようとした際に警告メッセージを出すためのイベントとして、window.onbeforeunload がある。

window.onbeforeunload = function(e){
return "ウインドウを閉じようとしています";
};

ただ、このままでは画面上のボタンやリンクをクリックした際にも警告が出てしまう。

そこで、ボタンやリンクをクリックした際にはメッセージを出さないようにイベントハンドラを置き換えておき、その後で再び警告が出るようにハンドラをセットしなおすという方法を考えた。
jQueryを使用しています)

function onBeforeUnload(e) {
return 'ウインドウを閉じようとしています';
}

$(function(){
setTimeout( function() {
window.onbeforeunload = onBeforeUnload;
}, 100);

$('a,:input').bind('click', function(){
window.onbeforeunload = function(e) {};
setTimeout( function() {
window.onbeforeunload = onBeforeUnload;
}, 100);
});
});

こんな感じ?

StackTrace全文

コンソールに出ていたStackTrace全文はこちら。

CARGO関連のJar配置前

ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exception
org.codehaus.cargo.container.ContainerException: Failed to create deployer with implementation class org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer for the parameters (container [id = [jboss5x]], deployer type [remote]).
at org.codehaus.cargo.generic.spi.AbstractGenericHintFactory.createImplementation(AbstractGenericHintFactory.java:157)
at org.codehaus.cargo.generic.spi.AbstractIntrospectionGenericHintFactory.createImplementation(AbstractIntrospectionGenericHintFactory.java:87)
at org.codehaus.cargo.generic.deployer.DefaultDeployerFactory.createDeployer(DefaultDeployerFactory.java:135)
at org.codehaus.cargo.generic.deployer.DefaultDeployerFactory.createDeployer(DefaultDeployerFactory.java:153)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:55)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:90)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:77)
at hudson.FilePath.act(FilePath.java:788)
at hudson.FilePath.act(FilePath.java:770)
at hudson.plugins.deploy.CargoContainerAdapter.redeploy(CargoContainerAdapter.java:77)
at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:47)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:36)
at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:700)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:675)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:653)
at hudson.model.Build$RunnerImpl.post2(Build.java:162)
at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:622)
at hudson.model.Run.run(Run.java:1434)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:238)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.codehaus.cargo.generic.deployer.DefaultDeployerFactory.createInstance(DefaultDeployerFactory.java:206)
at org.codehaus.cargo.generic.spi.AbstractGenericHintFactory.createImplementation(AbstractGenericHintFactory.java:153)
... 20 more
Caused by: org.codehaus.cargo.util.CargoException: Cannot locate the JBoss deployer class! Make sure the jboss-deployer for your
JBoss version as well as all required JBoss JARs are in CARGO's classpath.
More information on: http://cargo.codehaus.org/JBoss+Remote+Deployer
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.(JBoss5xRemoteDeployer.java:91)
... 26 more
Caused by: java.lang.ClassNotFoundException: org.codehaus.cargo.tools.jboss.JBossDeployer
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.(JBoss5xRemoteDeployer.java:81)
... 26 more
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.codehaus.cargo.generic.deployer.DefaultDeployerFactory.createInstance(DefaultDeployerFactory.java:206)
at org.codehaus.cargo.generic.spi.AbstractGenericHintFactory.createImplementation(AbstractGenericHintFactory.java:153)
at org.codehaus.cargo.generic.spi.AbstractIntrospectionGenericHintFactory.createImplementation(AbstractIntrospectionGenericHintFactory.java:87)
at org.codehaus.cargo.generic.deployer.DefaultDeployerFactory.createDeployer(DefaultDeployerFactory.java:135)
at org.codehaus.cargo.generic.deployer.DefaultDeployerFactory.createDeployer(DefaultDeployerFactory.java:153)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:55)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:90)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:77)
at hudson.FilePath.act(FilePath.java:788)
at hudson.FilePath.act(FilePath.java:770)
at hudson.plugins.deploy.CargoContainerAdapter.redeploy(CargoContainerAdapter.java:77)
at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:47)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:36)
at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:700)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:675)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:653)
at hudson.model.Build$RunnerImpl.post2(Build.java:162)
at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:622)
at hudson.model.Run.run(Run.java:1434)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:238)
Caused by: org.codehaus.cargo.util.CargoException: Cannot locate the JBoss deployer class! Make sure the jboss-deployer for your
JBoss version as well as all required JBoss JARs are in CARGO's classpath.
More information on: http://cargo.codehaus.org/JBoss+Remote+Deployer
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.(JBoss5xRemoteDeployer.java:91)
... 26 more
Caused by: java.lang.ClassNotFoundException: org.codehaus.cargo.tools.jboss.JBossDeployer
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.(JBoss5xRemoteDeployer.java:81)
... 26 more

CARGO関連の以下のJar配置後。

  • cargo-core-uberjar-1.0.6.jar
  • cargo-core-tools-jboss-deployer-5-1.0.6.jar

ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exception
org.codehaus.cargo.util.CargoException: Cannot deploy deployable org.codehaus.cargo.container.deployable.WAR@17f4804
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.deploy(JBoss5xRemoteDeployer.java:116)
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.redeploy(JBoss5xRemoteDeployer.java:154)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:64)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:90)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:77)
at hudson.FilePath.act(FilePath.java:788)
at hudson.FilePath.act(FilePath.java:770)
at hudson.plugins.deploy.CargoContainerAdapter.redeploy(CargoContainerAdapter.java:77)
at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:47)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:36)
at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:700)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:675)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:653)
at hudson.model.Build$RunnerImpl.post2(Build.java:162)
at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:622)
at hudson.model.Run.run(Run.java:1434)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:238)
Caused by: javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.(InitialContext.java:197)
at org.codehaus.cargo.tools.jboss.JBossDeployer.getDeploymentManager(JBossDeployer.java:136)
at org.codehaus.cargo.tools.jboss.JBossDeployer.deploy(JBossDeployer.java:63)
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.deploy(JBoss5xRemoteDeployer.java:112)
... 18 more
Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
... 24 more
javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.(InitialContext.java:197)
at org.codehaus.cargo.tools.jboss.JBossDeployer.getDeploymentManager(JBossDeployer.java:136)
at org.codehaus.cargo.tools.jboss.JBossDeployer.deploy(JBossDeployer.java:63)
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.deploy(JBoss5xRemoteDeployer.java:112)
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.redeploy(JBoss5xRemoteDeployer.java:154)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:64)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:90)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:77)
at hudson.FilePath.act(FilePath.java:788)
at hudson.FilePath.act(FilePath.java:770)
at hudson.plugins.deploy.CargoContainerAdapter.redeploy(CargoContainerAdapter.java:77)
at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:47)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:36)
at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:700)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:675)
at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:653)
at hudson.model.Build$RunnerImpl.post2(Build.java:162)
at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:622)
at hudson.model.Run.run(Run.java:1434)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:238)
Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654)
... 24 more

問題発生

ここまでは非常に順調だったのだけど、最近問題が発生した。

今回の開発プロジェクトのターゲットになるアプリケーションサーバはJBoss5.1なので、テスト用の環境にコミュニティ版のJBoss5.1.0GAをインストールして、リモートでデプロイしようとしたところ、これがうまく動かない。
デプロイのためにはJenkinsにDeploy Plugin というプラグインを入れる必要があるのだけど、これがデプロイをしようとした際エラーになっているようだ。

ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exception
org.codehaus.cargo.container.ContainerException: Failed to create deployer with implementation class org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer for the parameters (container [id = [jboss5x]], deployer type [remote]).
at
(中略)
Caused by: org.codehaus.cargo.util.CargoException: Cannot locate the JBoss deployer class! Make sure the jboss-deployer for your
JBoss version as well as all required JBoss JARs are in CARGO's classpath.
More information on: http://cargo.codehaus.org/JBoss+Remote+Deployer
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.(JBoss5xRemoteDeployer.java:91)
... 26 more
Caused by: java.lang.ClassNotFoundException: org.codehaus.cargo.tools.jboss.JBossDeployer
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

Deploy Pluginの内部でCARGOという、J2EEコンテナを操作するためのラッパーを使用しているようなのだけど、そこで例外が発生しているようだ。
後ろのほうにClassNotFoundExceptionとあるので、何かクラスが足りてないのだろう、と思い、試行錯誤の結果以下のCARGO関連のJarをダウンロードし、プラグインのlibディレクトリに入れてみた。
(最新版でないのは、プラグインに入っていた他のCARGO関連のJarファイルとバージョンを合わせたため)

  • cargo-core-uberjar-1.0.6.jar
  • cargo-core-tools-jboss-deployer-5-1.0.6.jar

これによりエラーメッセージは変わったものの、今度は別のクラスが足りないとエラーを出すようになった。

ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exception
org.codehaus.cargo.util.CargoException: Cannot deploy deployable org.codehaus.cargo.container.deployable.WAR@17f4804
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.deploy(JBoss5xRemoteDeployer.java:116)
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.redeploy(JBoss5xRemoteDeployer.java:154)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:64)
(中略)
Caused by: javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interfaces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.InitialContext.(InitialContext.java:197)
at org.codehaus.cargo.tools.jboss.JBossDeployer.getDeploymentManager(JBossDeployer.java:136)
at org.codehaus.cargo.tools.jboss.JBossDeployer.deploy(JBossDeployer.java:63)
at org.codehaus.cargo.container.jboss.JBoss5xRemoteDeployer.deploy(JBoss5xRemoteDeployer.java:112)
... 18 more
Caused by: java.lang.ClassNotFoundException: org.jnp.interfaces.NamingContextFactory
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)

今度はorg.jnp.interfaces.NamingContextFactoryというクラスがないようだ。
これはどうもJBoss関連のクラスらしいので、いろいろJarを入れてみたのだけど、いまのところ解決していない。

最初の例外のStack Traceに表示されていたURLの先を見ると、コンテナのクラスパスに以下のJarを置け、と書いてあるようなのでJboss5.1のclientやlibディレクトリにあるJarを片っ端から置いてはみたのだけど…。

 JBoss deployment manager JARs
 JBoss remoting client JARs

ちなみにCARGOのant taskでも同じエラーになるので、JenkinsというよりCARGO側で何か問題が起きているのだと思う。(もちろん、使い方含め)

今回のアプリで、コンテナに依存するような部分はほとんどないので、Tomcatでも全然問題はないのだけど…。