即使在类路径中的Jar中也找不到类

时间:2016-03-16 18:31:06

标签: java jar runtime

我正在尝试部署使用Jackson,JUnit和Commons-IO的应用程序。我的应用程序的类路径中有以下Jars:

commons-io-2.4.jar
jackson-databind-2.7.0.jar
jackson-annotations-2.7.0.jar
log4j-api-2.4.1.jar
wsdiscovery-0.2.jar
jackson-core-2.7.0.jar
log4j-core-2.4.1.jar

此应用程序在我的开发环境中运行,并且我已将所有上述Jars与主应用程序jar一起部署。我可以毫无问题地运行应用程序,但每次我尝试使用它时都会出现以下故障:

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
    at com.oncam.hware.app.OnvifApp.formatOutput(OnvifApp.java:356)
    at com.oncam.hware.app.OnvifApp.dispatchCommand(OnvifApp.java:271)
    at com.oncam.hware.app.OnvifApp.loopSocket(OnvifApp.java:130)
    at com.oncam.hware.app.OnvifApp.useSocket(OnvifApp.java:216)
    at com.oncam.hware.app.OnvifApp.main(OnvifApp.java:473)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 5 more

ObjectMapper类位于jackson-databind-2.7.0.jar文件中。此外,我在访问其他jar文件(包括JUnit jar!)中的类时没有问题。出于某种原因,就好像类加载器正在加载除jackson-databind-2.7.0.jar之外的每个Jar。

有谁知道造成这种情况的原因以及我如何解决这个问题?

有人请指教......

1 个答案:

答案 0 :(得分:0)

我弄清楚出了什么问题。

事实证明,当您将代码导出到JAR文件时,我正在使用的环境(Eclipse!)无法正确更新清单文件。如果没有正确的清单条目,应用程序就无法“找到”相关的jar文件。

在我看来,这是对Eclipse人员的严重疏忽 - 特别是当你的应用程序依赖于很多jar文件时。为了让我的应用程序运行,我有以下选择:

  1. 创建一个运行jvm的脚本,并有一个指向每个所需jar文件的参数列表,或者:
  2. 2:手动将每个必需的jar文件输入清单文件

    据我所知,没有办法自动更新清单文件。这是一个严肃的PITA(痛苦的A **)...

    无论如何,很抱歉打扰了这个问题。希望发布这个答案可以帮助其他人避免类似的问题......