当前位置: 首页 > 面试题库 >

Web环境中的NoClassDefFoundError错误问题Spring / Wicket / Derby / Jetty

梁明辉
2023-03-14
问题内容

我正在尝试构建一个简单的JDBC Spring Template应用程序,我使用的Web框架是wicket,并在Jetty 6
Web服务器下(通过Jetty Maven插件)。另外,我正在用Eclipsehtml" target="_blank">构建应用程序。

由于某种原因,我在Derby
jdbc类中遇到了NoClassDefFoundError。我假设我会得到一个未找到的类,但未找到异常,因此我猜测正在发生其他事情。derby类是类路径WEB-
INF / lib目录的一部分。您认为问题是什么?

我对问题的看法: 这不是“在类路径中找不到jar”错误,而是Java或spring动态加载该类以及何时加载该类的问题。

我正在使用Eclipse作为开发工具,但这可能不是问题的一部分。我仍然在命令行上使用Maven并遇到相同的问题。

这是错误:

WicketMessage:无法使用构造函数public wicketspring.easy.HomePage()实例化页面

根本原因:

java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.EmbeddedDriver
     at java.lang.Class.forName0(Native Method)
     at java.lang.Class.forName(Class.java:169)
     at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1130)
     at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
     at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)
     at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
     at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:577)
     at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:619)
     at wicketspring.easy.jdbc.JdbcWicketSpringHandler.data(JdbcWicketSpringHandler.java:39)
     at WICKET_wicketspring.easy.jdbc.JdbcWicketSpringHandler$$FastClassByCGLIB$$f1187cb6.invoke(<generated>)
     at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
     at org.apache.wicket.proxy.LazyInitProxyFactory$CGLibInterceptor.intercept(LazyInitProxyFactory.java:319)
     at WICKET_wicketspring.easy.jdbc.JdbcWicketSpringHandler$$EnhancerByCGLIB$$e8f0e174.data(<generated>)
     at wicketspring.easy.HomePage.<init>(HomePage.java:91)
     at wicketspring.easy.HomePage.<init>(HomePage.java:47)

这是Spring的applicationContext.xml:

<beans>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
        <property name="url"><value>jdbc:derby:wicketspringdb</value></property>
        <property name="username"><value></value></property>
        <property name="password"><value></value></property>
    </bean> 
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean> 
</beans>
<beans> 
    <import resource="classpath:common.xml"/>
    <bean id="jdbcHandler" class=wicketspring.easy.jdbc.JdbcWicketSpringHandler">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>

</beans>


...
Another stack trace system out.

Page.java:74) - At [2b] -- java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.EmbeddedDriver
java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.EmbeddedDriver
        at wicketspring.easy.HomePage.<init>(HomePage.java:72)
        at wicketspring.easy.HomePage.<init>(HomePage.java:47)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:
39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorIm
pl.java:27)

这是Java代码,代码可以编译,我可以打印出该类,但是无法实例化它。奇怪?

Java代码:

package wicketspring.easy;

import java.util.List;

import org.apache.wicket.Application;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.proxy.IProxyTargetLocator;
import org.apache.wicket.proxy.LazyInitProxyFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import model.LoadableDetachableList;
import model.SelectionOptionBean;
import wicketspring.easy.jdbc.JdbcWicketSpringHandler;
import wicketspring.easy.service.IStateListService;
import wicketspring.easy.service.StateListServiceImpl;

import org.apache.derby.jdbc.EmbeddedDriver;

public class HomePage extends WebPage {

    private final JdbcWicketSpringHandler jdbcWicketSpringHandler;

    public HomePage(final PageParameters parameters) {

        super(parameters);        
        jdbcWicketSpringHandler = (JdbcWicketSpringHandler) LazyInitProxyFactory.createProxy(JdbcWicketSpringHandler.class,
                new IProxyTargetLocator() {
                    private static final long serialVersionUID = 1L;
                    public Object locateProxyTarget() {
                        return ((WicketApplication) Application.get()).context().getBean("jdbcHandler");
                    }
                });

        /// WEIRD BECAUSE IT REACHES THIS POINT!!!
        LOGGER.debug("At [1] -- " + EmbeddedDriver.class);
        try {
            LOGGER.debug("At [2] -- " + new org.apache.derby.jdbc.EmbeddedDriver());
        } catch (NoClassDefFoundError ne) {
                // STACK TRACE ERROR HERE!!!!
            LOGGER.debug("At [2b] -- " + ne);
            ne.printStackTrace();
        } catch (Exception e) {
            LOGGER.debug("At [2] -- " + e);
            e.printStackTrace();
        }
        try {

            LOGGER.debug("At -- " + Class.forName("org.apache.derby.jdbc.EmbeddedDriver"));     
        } catch (NoClassDefFoundError ne) {
            LOGGER.debug("At [3b] -- " + ne);
            ne.printStackTrace();
        } catch (Exception e) {
            LOGGER.debug("At [3] -- " + e);
            e.printStackTrace();
        }

        /// ERROR FOR STACKOVERFLOW IS GENERATED FROM THIS LINE!!!!
        LOGGER.debug("At HomePage - jdbcHandler [3]: " + jdbcWicketSpringHandler.toStringJdbcTemplate());
        LOGGER.debug("At HomePage - jdbcHandler [3]: " + jdbcWicketSpringHandler.data());

        ...

} // End of Class //

编辑:我可能缺少一个依赖于Spring Jdbc或dbcp的jar文件。

这是我的WEB-INF / lib清单:

antlr-2.7.6.jar
aopalliance-1.0.jar
avalon-framework-4.1.3.jar
axis-1.4.jar
axis-jaxrpc-1.4.jar
cglib-nodep-2.2.jar
commons-collections-3.1.jar
commons-dbcp-1.2.2.jar
commons-logging-1.1.jar
commons-pool-1.3.jar
derby-10.6.1.0.jar
dom4j-1.6.1.jar
hibernate-core-3.5.1-Final.jar
jetty-6.1.4.jar
jetty-management-6.1.4.jar
jetty-util-6.1.4.jar
jta-1.1.jar
log4j-1.2.14.jar
logkit-1.0.1.jar
mx4j-3.0.1.jar
mx4j-tools-3.0.1.jar
servlet-api-2.5-6.1.4.jar
servlet-api-2.5.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.4.2.jar
spring-2.5.6.jar
spring-aop-2.5.6.jar
spring-beans-2.5.6.jar
spring-context-2.5.6.jar
spring-core-2.5.6.jar
spring-jdbc-2.5.6.jar
spring-test-2.5.6.jar
spring-tx-2.5.6.jar
testRunWrapper-1.0.0.jar
wicket-1.4.13.jar
wicket-ioc-1.4.13.jar
wicket-spring-1.4.13.jar
xml-apis-1.0.b2.jar

问题答案:

因此,“无法初始化类org.apache.derby.jdbc.EmbeddedDriver”错误实际上是其他一些不太明显的类加载问题的主要症状。

我使用Jetty作为Web服务器,使用Spring作为java6下的框架。

我相信存在与MBeanServer类相关的类加载问题。

而且我确实忽略了启动时发生的错误:“由以下原因引起:java.lang.LinkageError:违反了加载程序约束:加载程序(org / mortbay
/ jetty / webapp / WebAppClassLoader的实例)先前已启动名称为“ javax”的其他类型的加载/ management /
MBeanServer”(位于java.lang.ClassLoader.defineClass1(本机方法),位于java.lang.ClassLoader.defineClassCond(ClassLoader.java:632),位于java.lang.ClassLoader.defineClass(ClassLoader.java:616)。
security.SecureClassLoader.defineClass(SecureClassLoader.java:141)“

我在WEB-INF / lib目录中搜索该类。它被包含在mx4j:jar中。Mx4j是jetty-
management.jar的依赖项。我实际上并不需要码头管理,因此我从pom文件中删除了该引用。

基本上,包含MBeanServer(来自mx4j)会导致某种类加载问题,其中org.apache.derby.jdbc.EmbeddedDriver无法正确加载。我从Web应用程序中将其删除,该应用程序开始正常运行。



 类似资料:
  • 每次我尝试运行用JSP配置的spring boot应用程序时,都会出现以下错误: 我尝试运行示例:spring-boot-sample-web-jsp和spring-boot-sample-web-jsp 这些样本的结果相同。我使用IntelliJ IDEA运行应用程序,不知道为什么它不工作。

  • servlet 容器不属于 Java EE 技术标准的实现,鼓励实现这个容器但不是必需的,实现应用环境的功能请参见第15.2.2节中描述的“Web应用环境”和 Java EE 规范。如果他们没有实现需要支持这种环境的条件,根据部署依赖它们的应用程序,容器应该提供一个警告。

  • 我是Java新手,尝试使用SWT和JFace创建GUI项目。我想尝试创建首选项页面,所以我在谷歌上搜索了一些现成的代码。我正在试着从这里买一个。我创建了这个类(使用正确的名称),并将所需的JAR放入插件依赖项中。(使用Eclipse氧气) 组织。日食swt\U 3.106.1 因此,在运行此操作时,我遇到了一个错误,即: '线程“main”java中出现异常。lang.NoClassDefFoun

  • 使用的build.sbt文件如下: Scala中以下2行给出了以下异常 线程“main”java.lang.noClassDeffounder异常错误:org/apache/kafka/streams/streamsbuilder at tradesapp$.main(tradesapp.scala:21)at tradesapp.main(tradesapp.scala)at java.base

  • 我的 Web 应用程序中出现随机错误,我迷路了。我创建了一个库来解码代码。我尝试了很多,从未失败过测试。但突然间,它开始随机失败。由于它在单线程测试中运行良好,有时在 servlet 环境中失败时,我能想象的唯一解释是问题与多线程环境中使用的库有关。老实说,我知道多线程是一个非常复杂的问题。我担心我的库可能不是线程安全的。顺便说一下,它非常简单,它是一个具有几种静态方法的正面类。基本上,假设您正在

  • 用gradle构建工具创建了简单的spring boot rest api 我的控制器类 build.gradle中的依赖项 在url:http://localhost:8888上,显示了一个登录页面,我提供了username:user和password是,这导致404错误,因为路径“/”上没有请求映射 但是对于url:http://localhost:8888/welcome,仍然得到404错误