2013-03-05 136 views
0

我一直在這個問題上幾天,和它的駕駛我瘋了。嵌入式引導Jboss的數據源驅動程序問題

我有一塊有些遺留代碼,使用JBoss 4.2.3。我最近將項目轉換爲Maven進行依賴管理,但爲項目編寫的單元測試需要數據源。當我禁用測試中,程序工作得很好,但是當我使測試,它拋出如下:

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 

我已經在POM文件中列出的內嵌JBoss的依賴。

<dependency> 
    <groupId>org.jboss.embedded</groupId> 
    <artifactId>jboss-embedded-all</artifactId> 
    <version>beta3.SP12</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.jboss.embedded</groupId> 
    <artifactId>jboss-embedded</artifactId> 
    <version>beta3.SP12</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.jboss.embedded</groupId> 
    <artifactId>hibernate-all</artifactId> 
    <version>beta3.SP12</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.jboss.embedded</groupId> 
    <artifactId>thirdparty-all</artifactId> 
    <version>beta3.SP12</version> 
    <scope>test</scope> 
</dependency> 

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.4.3</version> 
    <configuration> 
     <additionalClasspathElements> 
      <additionalClasspathElement>src/test/bootstrap</additionalClasspathElement> 
     </additionalClasspathElements> 
     <forkMode>once</forkMode> 
     <argLine>-Dsun.lang.ClassLoader.allowArraySyntax=true</argLine> 
     <includes> 
      <include>**/*Test.java</include> 
     </includes> 
     <skip>false</skip> 
    </configuration> 
</plugin> 

在src/test/bootstrap/deploy我已經放置了dev-ds.xml文件,它正在被容器拾取。

Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=jdbc/theDS' to JNDI name 'java:jdbc/theDS' 

我的DEV-DS文件看起來像這樣(有一些混淆,請原諒拼寫錯誤)

<datasources> 
    <local-tx-datasource> 
     <jndi-name>jdbc/theDS</jndi-name> 
     <connection-url>jdbc:oracle:thin:@xxx.xxx.xxx:1521:DEVDB</connection-url> 
     <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> 
     <user-name>user</user-name> 
     <password>password</password> 
    </local-tx-datasource> 
</datasources> 

實際測試本身使用到的Mockito嘗試獲得數據源。

@BeforeClass 
public static void setUpClass() throws Exception 
    { 
    if(! containerRunning) 
     { 
     Bootstrap bootstrap = Bootstrap.getInstance(); 
     bootstrap.bootstrap(); 
     containerRunning = true; 
     } 
    } 

@Before 
public void setUp() 
    { 
    MyDAO dao = spy(new MyDAO()); 
    try 
     { 
     InitialContext ctx = new InitialContext(); 
     dao.datasource = (DataSource) ctx.lookup("java:jdbc/theDS"); 
     Connection conn = dao.datasource.getConnection(); //bang, we're dead 
     } 

例外:

Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Failed to register driver for: oracle.jdbc.driver.OracleDriver; - nested throwable: (java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver)); - nested throwable: (org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Failed to register driver for: oracle.jdbc.driver.OracleDriver; - nested throwable: (java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver)  

正如我提到的,代碼工作時,它的運行,所以我知道ojdbc6.jar位於$ {} jboss.dir /服務器/默認/庫。但是可以肯定的是,我嘗試將它添加到構建路徑中,並且我嘗試了Eclipse中的「順序和導出」,但都沒有成功。我正在用盡想法。如果我錯過了任何東西,請告訴我。

回答

0

這是一種工作的周圍,但它會爲現在的工作。在maven-surefire插件中,我添加了以下行。

<additionalClasspathElement>lib/ojdb6.jar</additionalClasspathElement> 

我也提出了自己的DAO對象測試的構造,因爲數據源創建在構造函數中完成,並且不會的Mockito不重寫。所有這些工作發現測試可能從來沒有奏效。 :)

要幫助的人誰在這裏偶然發現,在引導,它不會讓你在InitialContext的全球範圍內的任何約束。 I.E.

InitialContext ctx = new InitialContext(); 
ctx.createSubcontext("jdbc/theDS"); //Does not work 

從我搜集的互聯網蒐集來看,嵌入式jboss只知道環境範圍。