我有一个使用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实例中运行。
我在前台运行jenkins(java -jar jenkins.war),并且还运行了与我登录时相同的用户,因此没有权限问题。此外,我不需要运行Window Manager,因为我的测试不需要与Selenium不同的UI交互。
我在两种环境中使用的Java和Maven版本完全相同。
任何指针?
答案 0 :(得分:0)
你尝试过使用它吗?
"java:comp/env/MY_JNDI_RESOURCE"
答案 1 :(得分:0)
如果Jenkins实际上使用不同的Java JRE来运行您的应用程序,则很容易发生这种情况 - 尝试使用Java的显式路径运行它。确保首先在Jenkins之外测试该命令。
我刚刚遇到了完全相同的问题,结果发现没有为Jenkins使用的特定JRE创建Windows防火墙条目 - 即使我在防火墙中添加了全局端口例外。
我只是用Java的完整路径运行我的Java应用程序,在通知出现时将防火墙规则添加到我的Windows防火墙,然后在Jenkins中重新运行,一切正常。
答案 2 :(得分:0)
我最近发生了这种情况,并认为我会分享我发现的内容。当我的单元测试在Jenkins中运行时,OpenEJB“搞清楚”的jndi路径与我在IDE中直接在我的maven项目中构建它的路径不同,所以它将Jenkins创建的“workspace”目录添加到jndi路径,这导致查找失败。所以
java:global/ProjectName/ProjectService
是我的IDE中的名称
java:global/workspace/ProjectService
将计算Jenkins中的绑定名称。我能够通过OpenEJB日志记录来解决这个问题。