2012-04-23 149 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日誌記錄瞭解到這一點。