2017-06-21 92 views
-1

我們使用Wildfly 10首次,從JBoss的EAP 5.1.2升級。我們需要的一件事是使用ojdbc6 Oracle驅動程序來獲得我們的數據源。我知道有3種方式進行配置:當通過Wildfly 10管理控制檯部署時,ojdbc6驅動程序不在classpath中?

1 - 安裝驅動程序,並通過配置文件配置模塊和數據源,如這篇文章中所示:

http://www.adam-bien.com/roller/abien/entry/installing_oracle_jdbc_driver_on

2 - 將ojdbc6。在D:\ wildfly-10.1.0.Final \ standalone \ deployments文件夾中啓動服務器。通過Wildfly 10管理控制檯,在配置 - >子系統 - >數據源 - >非XA中使用我們放入部署文件夾的ojdbc6驅動程序來配置數據源;

3 - 通過Wildfly 10管理控制檯,像部署選項卡中的任何常規部署一樣部署ojdbc6.jar,並通過Wildfly 10管理控制檯配置它們,在配置 - >子系統 - >數據源 - >非XA usint中配置數據源我們剛剛部署的ojdbc6驅動程序。

由於我們的客戶使用,通過管理控制檯需求instalations只要有可能,我們選擇的方式號碼3配置ojdbc6驅動程序並創建我們的數據源。

現在,這裏的問題:我們的應用程序有一個環境檢查除其他事項外檢查的Oracle驅動程序版本,以確保我們使用的是ojdbc6 Oracle驅動程序。此環境檢查對我們的應用程序啓動是強制性的。或環境檢查類具有下面的代碼查詢Oracle驅動程序:

/** 
* @return Caminho do jar do driver Oracle 
* @see "http://www.javaxt.com/Tutorials/Jar/How_to_Get_the_Physical_Path_of_a_Jar_File" 
*/ 
private String getOracleJarPath() { 
    try { 
    // Oracle driver class 
    final Class<?> clazz = oracle.jdbc.OracleDriver.class; 

    final String path = clazz.getPackage().getName().replace(".", "/"); 
    String url = clazz.getClassLoader().getResource(path).toString(); 

    url = url.replace(" ", "%20"); // Normalize URI 
    url = url.replace(path + "/", ""); // remove package from path 
    final URI uri = new URI(url); 
    return new File(uri.getPath()).getAbsolutePath(); 
    } catch (final Exception e) { 
    // Nothing to do 
    } 
    return StringUtils.EMPTY; 
} 

當我部署通過Wildfly 10管理控制檯錯誤在第38行發生(8上面的代碼中)我們的應用程序:

2017-06-21 10:54:49,332 ERROR [br.com.synchro.framework.ambiente.service.impl.ValidadorAmbienteServiceImpl] (default task-2) Erro ao validar ambiente em todos os estágios.: java.lang.NoClassDefFoundError: oracle/jdbc/OracleDriver 
    at br.com.synchro.sfw.infra.ambiente.integration.impl.ValidadorAmbienteVersaoDriverJdbc.getOracleJarPath(ValidadorAmbienteVersaoDriverJdbc.java:38) 
    at br.com.synchro.sfw.infra.ambiente.integration.impl.ValidadorAmbienteVersaoDriverJdbc.validarDriverOracle(ValidadorAmbienteVersaoDriverJdbc.java:149) 
    at br.com.synchro.sfw.infra.ambiente.integration.impl.ValidadorAmbienteVersaoDriverJdbc.validar(ValidadorAmbienteVersaoDriverJdbc.java:106) 
    at br.com.synchro.framework.ambiente.service.impl.ValidadorAmbienteServiceImpl.validarAmbienteSegundoEstagio(ValidadorAmbienteServiceImpl.java:137) 
    at br.com.synchro.framework.ambiente.service.impl.ValidadorAmbienteServiceImpl.validarAmbienteTodosEstagios(ValidadorAmbienteServiceImpl.java:156) 
    at br.com.synchro.framework.gui.presentation.filter.ValidacaoAmbienteFilter.doFilter(ValidacaoAmbienteFilter.java:55) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) 
    at br.com.synchro.framework.gui.presentation.filter.AplicacaoPatchFilter.doFilter(AplicacaoPatchFilter.java:53) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) 
    at br.com.synchro.framework.gui.presentation.filter.XUaCompatibleFilter.doFilter(XUaCompatibleFilter.java:28) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) 
... 

這樣的意思,我們無法找到司機在我們的應用程序的類路徑!

當我通過方法1中創建的驅動程序和數據源,我們的應用程序的工作原理沒有問題。但是,如果我使用方法2或3,則應用程序根本無法在類路徑中找到驅動程序。由於我們的客戶僅通過管理控制檯要求安裝,因此我可以做什麼或者我做了什麼錯誤,驅動程序不在我們的應用程序類路徑中!

在此先感謝!

回答

0

試着這麼做:

@Startup 
@Singleton 
public class JDBCDriverVerifier { 

    @Resource(name="java:jboss/datasources/YourDS) 
    private DataSource ds; 

    @PostConstruct 
    void checkDriver() { 
     try(Connection conn = ds.getConnection()) { 

      DatabaseMetaData metaData = conn.getMetaData(); 
      String driverName = metaData.getDriverName(); 
      String driverVersion = metaData.getDriverVersion(); 

      // get other meta data if useful 
      // validate and throw exception if it fails... 

     } 
    } 

} 

您可能需要進行試驗,看看哪些元數據是對你最有用的。

請注意,如果你有一個WAR只部署這會甚至工作。

而且,這是值得教育你的客戶如何使用JBoss的CLI腳本來配置自己的服務器的價值。這些腳本可以通過源代碼控制(和註釋),從而使新環境能夠快速啓動,因爲它們使流程可重複。控制檯配置幾乎不可重複。大多數主要的Java EE服務器實現都以這種或那種形式具有此功能。

+0

的問題是,當我檢查驅動程序版本USINT我需要告訴其中包含驅動程序的JAR位於連接的元數據,這就是爲什麼我實例化類來獲取路徑。如果驅動程序位於ckasspath中,它將被發現並且不會引發ClassnotFoundException。 另外,我們支持的其他服務器,如WebSphere和Weblogic,用戶通過管理控制檯執行所有操作;唯一的例外是我們需要告訴他們通過腳本和屬性文件進行配置的JBoss EAP。爲什麼不讓他們在Wildfly上使用管理控制檯? – rsoliveira

+0

JBoss/WildFly使用虛擬文件系統,因此當您使用管理控制檯(或通過CLI使用相同的部署機制)部署驅動程序時,您將無法在物理文件系統中找到它。其次,我在最後一段解釋了爲什麼腳本解決方案更好。 –

相關問題