ojdbc6 驱动程序在通过 Wildfly 10 管理控制台部署时不在类路径中?



我们第一次使用 Wildfly 10,从 JBoss EAP 5.1.2 升级。我们需要的一件事是让我们的数据源使用 ojdbc6 Oracle 驱动程序。我知道有 3 种方法可以配置它们:

1 - 通过配置文件安装驱动程序并配置模块和数据源,如本文所示:

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

2 - 将 ojdbc6.jar 放入 D:\wildfly-10.1.0.Final\standalone\deployments 文件夹中,启动服务器。通过 Wildfly 10 管理控制台,在配置 -> 子系统 -> 数据源 -> 非 XA 中使用我们放在部署文件夹中的 ojdbc6 驱动程序配置数据源;

3 - 通过 Wildfly 10 管理控制台,部署ojdbc6.jar就像部署选项卡中的任何正常部署一样,并通过 Wildfly 10 管理控制台,在配置 -> 子系统 -> 数据源 -> 非 XA 中使用我们刚刚部署的 ojdbc6 驱动程序配置数据源。

由于我们的客户被使用并尽可能通过管理控制台进行分期付款,因此我们选择方式 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,应用程序根本无法在类路径中找到驱动程序。由于我们的客户要求仅通过管理控制台进行安装,因此驱动程序不在我们的应用程序类路径中,我该怎么办或我做错了什么?!

提前谢谢!!

尝试类似操作:

@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 服务器实现都以这样或那样的形式具有这种能力。

最新更新