我正面临与WAS插件文件夹中的jar相关的类路径问题。我的应用程序使用com.ibm.ws.runtime jar编译IBM特定代码,如下所述。
位置: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());
}
}
答案 0 :(得分:1)
获得底层连接的推荐方法是使用正确的JDBC API并解开它,就像这样(不使用WebSphere internall类):
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
答案 1 :(得分:0)
Websphere使用OSGI来限制内部类对应用程序的可见性。这可能就是这里发生的事情。编译它时,OSGI可能没有发挥作用,但是当你尝试运行它时。如果我在v7中的servlet中执行此操作,
ps.println("trying to new up a WSJdbcConnection");
Object o = com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.class.newInstance();
ps.println("got it")
我收到IllegalAccessException,所以它不可见。
正如Gas所说,如果你可以使用不属于内部的东西,你应该可以访问它。通常, com.ibm.websphere - api,com.ibm.wsspi - spi,com.ibm.ws - internal