2

OpenEJB を使用してステートレス セッション Bean をテストするテストがあります。ビルド管理にMavenを使用しています。このテストは、Jenkins から (コマンド ラインで) 完全に正常に動作しているように見えますが、Jenkins でジョブを追加した後は失敗します。

より具体的には、私のテストは JNDI で EJB をルックアップできず、次の例外が発生します。

javax.naming.NameNotFoundException: Name "global/slides/SlideService" not found.
    at org.apache.openejb.core.ivm.naming.IvmContext.federate(IvmContext.java:198)
    at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:152)
    at org.apache.xbean.naming.context.ContextFlyweight.lookup(ContextFlyweight.java:55)
    at com.diycomputerscience.slides.service.SlideServiceTest.setUp(SlideServiceTest.java:45)
    at junit.framework.TestCase.runBare(TestCase.java:132)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:243)
    at junit.framework.TestSuite.run(TestSuite.java:238)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:236)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:134)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:113)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:103)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:74)

Jenkins でテストを実行すると、何らかの形で JNDI に影響するのでしょうか? Jenkins が Maven エンベダーを使用していることは知っていますが、Surefire プラグインはデフォルトでテストをフォークしており、Jenkins と同じ vm インスタンス内で実行されていない可能性があります。

フォアグラウンドでジェンキンスを実行しており(java -jar jenkins.war)、ログインしているのと同じユーザーで実行しているため、権限の問題はありません。また、Selenium とは異なり、テストで UI を操作する必要がないため、Window Manager を実行する必要もありません。

私が両方の環境で使用している Java と Maven のバージョンもまったく同じです。

ポインタはありますか?

4

3 に答える 3

0

最近これが起こったので、私が発見したことを共有すると思いました. 単体テストを Jenkins 内で実行したとき、OpenEJB が「把握」していた jndi パスは、IDE から Maven プロジェクトで直接ビルドしたときとは異なっていたため、Jenkins が作成した「ワークスペース」ディレクトリを jndi パスに追加していました。これにより、ルックアップが失敗しました。そう

java:global/ProjectName/ProjectService

私のIDEの名前になります

java:global/workspace/ProjectService

Jenkins のバインディング名に対して計算されます。これは、OpenEJB のロギングによって把握できました。

于 2014-11-06T22:44:36.283 に答える
0

これ使ってみた?

"java:comp/env/MY_JNDI_RESOURCE" 
于 2012-05-11T02:16:46.840 に答える
0

これは、Jenkins が実際に別の Java JRE を使用してアプリケーションを実行している場合に簡単に発生します。Java への明示的なパスを指定して実行してみてください。最初に Jenkins の外部でそのコマンドをテストしてください。

まったく同じ問題が発生したばかりで、ファイアウォールにグローバルポート例外を追加したにもかかわらず、Jenkins が使用した特定の JRE に対して Windows ファイアウォールエントリが作成されていないことが判明しました。

Java への完全なパスを使用して Java アプリケーションを実行し、通知が表示されたときにファイアウォール ルールを Windows ファイアウォールに追加し、Jenkins で再実行すると、すべてが機能しました。

于 2014-02-18T17:17:44.627 に答える