为什么在 Wildfly 中 com/sun/rowset/CachedRowSetImpl 出现 NoClassDefFoundError?
Why NoClassDefFoundError for com/sun/rowset/CachedRowSetImpl in Wildfly?
我的操作系统是 Windows7 64 位。我正在与 Eclipse Luna 合作。我正在探索从 JBoss 4.2.3 到 Wildfly 8.2.1 的迁移。
我创建了一个简单的网络应用程序来测试 com.sun.rowset.CachedRowSetImpl,我认为它是 JDK 的一部分。
我创建了一个 class RowSetAdaptor
作为 CachedRowSetImpl 的包装器 class:
package com.srh.util;
import java.io.Serializable;
import java.sql.SQLException;
import com.sun.rowset.CachedRowSetImpl;
public class RowSetAdaptor implements Serializable {
private CachedRowSetImpl rowset;
public RowSetAdaptor() {
try {
rowset = new CachedRowSetImpl();
} catch (SQLException sqle) {
System.out.println("RowSetAdaptor: constructor: SQLException=" + sqle);
}
}
}
然后我创建一个监听器class AppContextListener
:
package com.srh.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.srh.util.RowSetAdaptor;
public class AppContextListener implements ServletContextListener {
public AppContextListener() {
}
public void contextInitialized(ServletContextEvent arg0) {
RowSetAdaptor rsa = null;
rsa = new RowSetAdaptor();
System.out.println("AppContextListener: after create: rsa=" + rsa);
}
public void contextDestroyed(ServletContextEvent arg0) {
}
}
将应用程序部署到 Jboss 4.2.3 并在 server.log 中获得正确的输出:
AppContextListener: after create:
rsa=com.srh.util.RowSetAdaptor@2a9073ef
将相同的应用程序部署到 Wildfly 8.2.1 并在 server.log 中为 CachedRowSetImpl 获取 NoClassDefFoundError :
Caused by: java.lang.NoClassDefFoundError:
com/sun/rowset/CachedRowSetImpl
因为 com.sun.rowset.CachedRowSetImpl 是 JDK 的一部分,那么为什么 Wildfly 会给出这个错误?我很迷惑。如何解决这个问题?
谢谢
我按照以下步骤解决了这个问题:
打开 modules/system/layers/base/sun/jdk/main
目录中 JDK 的 module.xml
。
在路径元素下包括这 3 行:
<path name="com/sun/rowset"/>
<path name="com/sun/rowset/internal"/>
<path name="com/sun/rowset/providers"/>
保存module.xml
重启 Wildfly
不知道为什么 Wildfly JDK 模块没有附带这 3 行。
我的操作系统是 Windows7 64 位。我正在与 Eclipse Luna 合作。我正在探索从 JBoss 4.2.3 到 Wildfly 8.2.1 的迁移。
我创建了一个简单的网络应用程序来测试 com.sun.rowset.CachedRowSetImpl,我认为它是 JDK 的一部分。
我创建了一个 class RowSetAdaptor
作为 CachedRowSetImpl 的包装器 class:
package com.srh.util;
import java.io.Serializable;
import java.sql.SQLException;
import com.sun.rowset.CachedRowSetImpl;
public class RowSetAdaptor implements Serializable {
private CachedRowSetImpl rowset;
public RowSetAdaptor() {
try {
rowset = new CachedRowSetImpl();
} catch (SQLException sqle) {
System.out.println("RowSetAdaptor: constructor: SQLException=" + sqle);
}
}
}
然后我创建一个监听器class AppContextListener
:
package com.srh.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.srh.util.RowSetAdaptor;
public class AppContextListener implements ServletContextListener {
public AppContextListener() {
}
public void contextInitialized(ServletContextEvent arg0) {
RowSetAdaptor rsa = null;
rsa = new RowSetAdaptor();
System.out.println("AppContextListener: after create: rsa=" + rsa);
}
public void contextDestroyed(ServletContextEvent arg0) {
}
}
将应用程序部署到 Jboss 4.2.3 并在 server.log 中获得正确的输出:
AppContextListener: after create: rsa=com.srh.util.RowSetAdaptor@2a9073ef
将相同的应用程序部署到 Wildfly 8.2.1 并在 server.log 中为 CachedRowSetImpl 获取 NoClassDefFoundError :
Caused by: java.lang.NoClassDefFoundError: com/sun/rowset/CachedRowSetImpl
因为 com.sun.rowset.CachedRowSetImpl 是 JDK 的一部分,那么为什么 Wildfly 会给出这个错误?我很迷惑。如何解决这个问题?
谢谢
我按照以下步骤解决了这个问题:
打开 modules/system/layers/base/sun/jdk/main
目录中 JDK 的 module.xml
。
在路径元素下包括这 3 行:
<path name="com/sun/rowset"/>
<path name="com/sun/rowset/internal"/>
<path name="com/sun/rowset/providers"/>
保存module.xml
重启 Wildfly
不知道为什么 Wildfly JDK 模块没有附带这 3 行。