2012-04-23 101 views
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) 

我不知道在詹金斯运行测试是否会影响JNDI?我知道Jenkins使用Maven嵌入器,但Surefire插件默认分支测试,它可能不像Jenkins那样在相同的虚拟机实例内运行。

我运行在前台的詹金斯(Java的罐子jenkins.war),也使用相同的用户运行,因为我在我登录所以没有权限问题。此外,我不需要Window Manager运行,因为我的测试不需要像Selenium那样与UI进行交互。

我使用这两个环境中的Java和Maven的版本是完全相同了。

任何指针?

+0

使用OpenEJB日志输出可以更容易地看到发生了什么。通常进入System.out并且在构建输出中。 – 2012-05-10 14:34:31

回答

0

你尝试使用这个?

"java:comp/env/MY_JNDI_RESOURCE" 
0

这可如果詹金斯实际上是用一个不同的Java JRE来运行你的应用程序很容易地发生 - 尝试用一个明确的路径到Java运行它。确保你先在Jenkins之外测试该命令。

我刚刚有完全相同的问题,事实证明,没有为Jenkins使用的特定JRE创建Windows防火墙条目 - 即使我在我的防火墙中添加了全局端口异常。

我只是跑到我的Java应用程序到Java的完整路径,增加了防火墙规则来我的Windows防火墙在通知中出现詹金斯,然后重新运行和一切工作。

0

我最近这种情况发生,我想我会分享我的发现。当我的单元测试在Jenkins中运行时,OpenEJB“找出”的jndi路径与直接在我的IDE中的maven项目中构建它的jndi路径不同,因此它将Jenkins创建的“workspace”目录添加到jndi路径,导致查找失败。所以

java:global/ProjectName/ProjectService 

将名字在我的IDE而

java:global/workspace/ProjectService 

会在詹金斯绑定名称进行计算。我能够通过OpenEJB日志记录了解到这一点。