我正在尝试部署使用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。
有谁知道造成这种情况的原因以及我如何解决这个问题?
有人请指教......
答案 0 :(得分:0)
我弄清楚出了什么问题。
事实证明,当您将代码导出到JAR文件时,我正在使用的环境(Eclipse!)无法正确更新清单文件。如果没有正确的清单条目,应用程序就无法“找到”相关的jar文件。
在我看来,这是对Eclipse人员的严重疏忽 - 特别是当你的应用程序依赖于很多jar文件时。为了让我的应用程序运行,我有以下选择:
2:手动将每个必需的jar文件输入清单文件
据我所知,没有办法自动更新清单文件。这是一个严肃的PITA(痛苦的A **)...
无论如何,很抱歉打扰了这个问题。希望发布这个答案可以帮助其他人避免类似的问题......