我們使用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,則應用程序根本無法在類路徑中找到驅動程序。由於我們的客戶僅通過管理控制檯要求安裝,因此我可以做什麼或者我做了什麼錯誤,驅動程序不在我們的應用程序類路徑中!
在此先感謝!
的問題是,當我檢查驅動程序版本USINT我需要告訴其中包含驅動程序的JAR位於連接的元數據,這就是爲什麼我實例化類來獲取路徑。如果驅動程序位於ckasspath中,它將被發現並且不會引發ClassnotFoundException。 另外,我們支持的其他服務器,如WebSphere和Weblogic,用戶通過管理控制檯執行所有操作;唯一的例外是我們需要告訴他們通過腳本和屬性文件進行配置的JBoss EAP。爲什麼不讓他們在Wildfly上使用管理控制檯? – rsoliveira
JBoss/WildFly使用虛擬文件系統,因此當您使用管理控制檯(或通過CLI使用相同的部署機制)部署驅動程序時,您將無法在物理文件系統中找到它。其次,我在最後一段解釋了爲什麼腳本解決方案更好。 –