【问题标题】:Class path issue: NoClassDefException :类路径问题: NoClassDefException :
【发布时间】:2013-05-25 11:13:19
【问题描述】:

问题来了, 我有一个项目 X,它使用另一个项目 Y 的服务。 Y 使用 eclipse 导出为 jar 文件并添加到项目 X 构​​建路径中。碰巧弹簧在X中加载“classService”的类无法加载,因为在Y的StringEncryptorService中的remoteService的构造函数中初始化依赖项有问题。它说明了 Y 中一个 jar 中的类。没有编译错误,所以构建路径很好。提前谢谢。任何答案将不胜感激

INFO: Initializing Spring root WebApplicationContext
ERROR org.springframework.web.context.ContextLoader:319 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'classService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.package.common.security.StringEncryptorService com.package.service.classService.stringEncryptorService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stringEncryptorService' defined in URL [jar:file:/C:/Users/user/git/project/Project/WEB-INF/lib/package-common-0.111.jar!/com/package/common/security/StringEncryptorService.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.package.common.security.StringEncryptorService]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64

我使用了 Y 项目中的 commons-codec-1.8。我知道我可以将它的 jar 文件移动到 Project X 的引用库中,但我想知道我是否可以在 Y 中制作它,这样当我制作其他项目时,比如 A,我可以将 y 作为 jar 导出到 A。

编辑: 我认为问题在于 spring 找不到通用编解码器。因为它在 Project Y 的库下,所以我导出到 Project X 的项目。我们可以做点什么,让 Project X 中的 spring 可以扫描 Project Y 的库吗?或者专门到 common-codec.jar 的库。如果我说错了,请纠正我。

答案:要么通过将 jar 复制到 X 的类路径中显式添加库,要么将其作为外部 jar 添加到项目中,或者在 eclipse 中将项目添加到类路径中。由于我想让库 common-codec.jar 始终在 Project Y 库中,我们只是添加到 Project X 的 application-context.xml 中:

<bean id="StringEncryptorService" class="PackagePathInProjectY.StringEncryptorService"></bean>

特别感谢:Harish Kumar。谢谢哥们。。


【问题讨论】:

  • 很高兴知道哪种语言。这是我知道的java,但我想知道是否有人应该标记它。我通常会为自己的问题做(作为二级/三级标签),但不确定最佳实践。
  • 对不起..我的坏..我是新来的.. :)

标签: java classpath noclassdeffounderror nested-exceptions


【解决方案1】:

你的项目中没有找到org/apache/commons/codec/binary/Base64,请在X项目的构建路径中添加commons-codec-1.8.jar,另一种方法是在导出项目时记得添加项目Y中的commons-codec-1.8.jar一起。

【讨论】:

  • 第一个没有解决问题。我还导出了 Project Y 中的 common-codec-1.8.jar,实际上是它的所有库,但它并没有解决问题。运行tomcat时我仍然有这个错误。
【解决方案2】:

在您部署到 tomcat 的项目中,类路径肯定存在问题。你能检查一下 WEB-INF/lib 是否有这个库吗?如果您将项目部署为战争,那么在构建战争或项目 X 时,应该捆绑两个库,并且当战争在 tomcat 上爆炸时,应该在类路径中找到 Y 库和公共编解码器。您可以将 Porject Y 中的 commons 编解码器捆绑为构建的一部分。

哈里什

【讨论】:

  • 图书馆是什么意思?你是说tomcat库吗?我将它添加到 Project X 的构建路径中。
  • 库是指所需的 jar 文件(项目 Y jar 文件和公共编解码器 jar 文件)。您是将项目部署为 war 文件还是仅使用 eclipse 并在其上连接了 tomcat 以热部署代码?我曾经使用过一个项目,其中使用 maven 构建依赖项目,然后下载这些项目,并与其中的所有库进行最后的战争。但是对于开发,我们过去常常更改 eclipse 上的代码,并且 tomcat 能够接受它(不是所有的东西)。所以代码是从eclipse运行和调试的。
  • 我还没有将它部署为战争文件。我还在做开发和测试。我只是使用 eclipse 并运行 tomcat 并检查 localhost 中的视图。我在 Eclipse 中运行它,是的。
  • 如果项目 Y 在同一个 Eclipse 工作区中,您可以尝试将项目 Y 作为依赖项添加到项目 X 中吗?
  • 您也可以执行以下操作:我在 X 项目中创建了名为 lib 的文件夹并将编解码器库添加到其中。通过 eclipse 中的导出工具创建 jar,然后在项目 Y Manifest-Version: 1.0 Class-Path: lib/commons-codec-1.2.jar 的 jar 中的 Manifest.mf 文件中修改以下条目。这很好用
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2010-09-24
相关资源
最近更新 更多