gpt4 book ai didi

java - 如何在 WAS 类路径中包含 Websphere 插件 jar

转载 作者:行者123 更新时间:2023-12-01 11:16:40 25 4
gpt4 key购买 nike

我面临与 WAS 插件文件夹中的 jar 相关的类路径问题。我的应用程序具有 IBM 特定代码,可以使用 com.ibm.ws.runtime jar 进行编译,如下所述。

位置:C:\Program Files\IBM\Websphere\AppServer\Plugins

源代码:

对象 obj = ((com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.getNativeConnection((com.ibm.ws.rsadapter.jdbc.WSJdbcConnection)connect) )));

这两个类都可以在 com.ibm.ws.runtime 中使用

通过在构建过程的类路径中包含 IBM runtime.jar 成功编译,但在 WAS 中部署后,我收到 ClassNotFoundException。任何人都可以告诉我,如何将该插件文件夹包含在 WAS 的类路径中,这样我就不会得到 ClassNotFoundException。我只在 JVM 类路径中添加了 runtime.jar,但它会抛出错误,因为它依赖于 IBM 的其他 jar。

错误:导致:java.lang.ClassNotFoundException:com.ibm.ws.rsadapter.jdbc.WSJdbcConnection

更新:目前与Jboss服务器完美配合。代码如下。我的目标是为 Webpshere 提供相同的规定。

调用方式:

Connection connect = null;
connect = mDataSrc.getConnection();
unlockJDBC(connect);

private void unlockJDBC(Connection connect)
{
//This bit is JBoss specific but we are trying to avoid importing JBoss JAR files so we use reflection instead.

if (connect.getClass().getName().equals("org.jboss.resource.adapter.jdbc.WrappedConnection") || connect.getClass().getSuperclass().getName().equals("org.jboss.resource.adapter.jdbc.WrappedConnection"))
{
Method method = null;
try{
method = connect.getClass().getMethod("getUnderlyingConnection",null);
Connection conn = (Connection)method.invoke(connect, null);
if (conn != null){
connect = conn;
}
}
catch (InvocationTargetException e){
mLogger.severe(e.getTargetException().getMessage());
}
catch (Exception e){
mLogger.severe(e.toString());
}
}
if (connect instanceof ExtEmbeddedConnection){
ExtEmbeddedConnection embConnect = (ExtEmbeddedConnection)connect;
try{
embConnect.unlock("unlock");
}
catch (Exception e){
mLogger.severe(e.toString());
}
}

最佳答案

获得底层连接的推荐方法是使用正确的 JDBC API 并解开它,如下所示(不使用 WebSphere 内部类):

Context ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("jdbc/OracleDS");
Connection conn = ds.getConnection();

// Returns true if this either implements the interface argument
// or is directly or indirectly a wrapper for an object that does.
if (conn.isWrapperFor(oracle.jdbc.OracleConnection.class)) {
// Returns an object that implements the given interface to
// allow access to non-standard methods, or standard methods
// not exposed by the proxy.
oracle.jdbc.OracleConnection oraCon = conn.unwrap(oracle.jdbc.OracleConnection.class);
// Do some Oracle-specific work here.
}

有关更多详细信息,请查看 WebSphere Application Server and the JDBC 4.0 Wrapper Pattern

更新
回应评论。我不推荐这样做,尽管它在 WAS 8.5.5 中工作得很好,所以请修复您的类路径并删除您添加到其中或与应用程序一起打包的任何与 WebSphere 相关的 jar:

        Connection connection = myDs.getConnection();
System.out.println("connection: " + connection.getClass().getName());
WSJdbcConnection conn = null;
if(connection instanceof WSJdbcConnection) {
System.out.println("WSJdbcConnection");
conn = (WSJdbcConnection) connection;
Object obj = WSJdbcUtil.getNativeConnection(conn);
System.out.println("native: " + obj.getClass().getName());
}

输出:

[8/11/15 16:55:10:165 CEST] 0000009a SystemOut     O connection: com.ibm.ws.rsadapter.jdbc.WSJccSQLJPDQConnection
[8/11/15 16:55:10:165 CEST] 0000009a SystemOut O WSJdbcConnection
[8/11/15 16:55:10:165 CEST] 0000009a SystemOut O native: com.ibm.db2.jcc.am.ef

关于java - 如何在 WAS 类路径中包含 Websphere 插件 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31744157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com