我们第一次使用 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 服务器实现都以这样或那样的形式具有这种能力。