我们首次使用Wildfly 10,从JBoss EAP 5.1.2升级。我们需要的一件事是使用ojdbc6 Oracle驱动程序来获取数据源。我知道有三种方法可以配置它们:
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管理控制台,在Configuration - >中配置数据源。子系统 - >数据源 - >非XA使用我们放在deployments文件夹中的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,应用程序根本无法在类路径中找到驱动程序。由于我们的客户仅通过管理控制台要求安装,我可以做什么或者我做错了什么驱动程序不在我们的应用程序类路径中?!
提前致谢!!!
答案 0 :(得分: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服务器实现都以这种或那种形式具有此功能。