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

尽管类存在于类路径中,Spring抛出NoClassDefFoundError:MethodInterceptor

孙朗
2023-03-14
问题内容

我正在使用Spring
MVC和Hibernate开发一个简单的培训应用程序。我正在使用Maven作为构建工具。使用Maven的pom.xml文件解析所有依赖项(spring,hibernate,
aopalliance ,junit等)。

$ mvn war:war glassfish:deploy可以正常工作,该项目正在部署到GlassFish服务器-
所有*.jar文件都已复制(包括com.springsource.org.aopalliance-1.0.0.jar)。

我制作了一个简单的servlet来测试类路径中是否存在aopalliance:

protected void doGet(...) throws ... {
    response.getWriter().println(org.aopalliance.intercept.MethodInterceptor.class.getCanonicalName());
}

它存在。上面的代码org.aopalliance.intercept.MethodInterceptor按预期显示。

但是,如果我将servlet更改为类似的内容:

protected void doGet(...) throws ... {
    response.getWriter().println(org.springframework.transaction.interceptor.TransactionInterceptor.class.getCanonicalName());
}

它引发异常:

java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

TransactionInterceptor使用aopalliance接口,但是我不明白为什么它无法找到它们,而我的servlet却可以。我相信这可能与类加载器有关,但我深信我不知道如何解决它。

编辑:

一些细节:

  • 完整pom.xml档案:http://pastebin.com/430iPgRs
  • 完成HelloServlet课程:http://pastebin.com/YVfzz4i8
  • 异常完整堆栈跟踪:http : //pastebin.com/UZ5nAJdZ

编辑:

我还添加spring.osgi.core/io了@Ravi建议的依赖项:

<dependency>
    <groupId>org.springframework.osgi</groupId>
    <artifactId>org.springframework.osgi.core</artifactId>
    <version>1.2.1</version>
</dependency>

<dependency>
    <groupId>org.springframework.osgi</groupId>
    <artifactId>org.springframework.osgi.io</artifactId>
    <version>1.2.1</version>
</dependency>

但这并不能解决问题。

但是,我尝试在SpringSource Tool Suite附带的VMware vFabric tc
Server上运行相同的应用程序,并且一切正常。这似乎是GlassFish特有的问题。

我正在使用GlassFish Server开源版本3.1.1。

另一个奇怪的事情:如果我重新部署应用程序(在Eclipse中使用“发布”),则servlet抛出:

java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

但是刷新后(在浏览器中)我得到:

java.lang.NoClassDefFoundError: org/springframework/transaction/interceptor/TransactionInterceptor

进一步刷新不会改变任何内容。


问题答案:

您在父类加载器中的某个地方可能还有另一个不完整的弹簧,最有可能在{domaindir} / lib中



 类似资料:
  • 问题内容: 假设我已经使用Groovyc编译了Groovy脚本,该脚本已在文件系统中生成了一个或多个.class文件。如何从Java应用程序动态地将这些类添加到类路径中,以加载它们并调用它们的方法?目标是预编译Groovy脚本并将其存储到数据库中,以便可以从脚本的编译版本执行评估。 问题答案: 您可以创建URLClassLoader的实例以从目录加载新类: 第1 行将.class 创建到.clas

  • 在这里的Spring Boot文档中,关于服务静态内容,它说: 默认情况下,Spring Boot将从类路径中名为/static(或/public或/resources或/META-INF/resources)的目录提供静态内容。 我发现目录中的所有内容: 将被复制到类路径中,因此我可以将我的静态内容放入: 一切都会很好,我很高兴,因为我可以将我的静态内容放在src目录下。 但是,我对此有一些疑问

  • 当我试图在工作区中使用文本文件创建BufferedReader时,“new BufferedReader语句”中的FileReader抛出一个filenotfoundexception。然而.exists()和.canRead()对于文件都返回true 这是代码 和输出 以及当我取消注释bufferedreader行时引发的异常 我发现了一个类似于这个的封闭线程,但在其中找不到任何明确的答案。

  • 问题内容: 我在测试类中使用以下代码,以将所有spring.xml文件加载到classpath和application-content.xml文件中。 有没有一种方法可以打印classpath中所有“ spring.xml”文件的路径?我有一些jar文件,其中包含spring.xml。但是,其中一些可能不需要运行测试。有没有办法打印它们(jar文件或路径)并删除程序上不需要的spring.xml文

  • 我正在执行Java-Eclipse-TestNG,但在使用testng命令行运行测试时遇到了困难。我有多个源文件夹,当创建。class文件时,它们将转到/bin目录,文件夹结构与/src相同,如下所示。我已经设置了类路径(使用导出classpath=...)并尝试运行“java org.testng.testng testng.xml”,但它给我的结果是“不能在类路径中找到类:testcases.

  • 问题内容: 我有一个包含以下两个类的jar文件: 另一个类如下所示: 如果我使用以下命令执行该程序,该程序将按预期方式运行并显示: 但是,如果我尝试使用类中的main方法来启动程序,则JVM将显示启动错误并退出: 这与我尝试使用不在jar中的类来尝试启动程序的错误相同,例如 为什么会出现此错误?该方法可以启动并且我能够从jar中反编译该类的事实证明,该类应在类路径上可用。我意识到这可能与不在cla