2016-03-16 97 views
0

我正在尝试部署使用Jackson,JUnit和Commons-IO的应用程序。我在我的应用程序的类路径以下罐:即使在类路径中的Jar中也找不到该类

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 

此应用程序中我的开发环境,并且我已经部署所有上述罐的与主应用程序罐子。我可以毫无问题运行应用程序,但是每次我试图使用它,我得到以下故障:

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类是在杰克逊数据绑定-2.7.0.jar文件。此外,在访问其他jar文件中的类(包括JUnit jar!)时,我没有任何问题。出于某种原因,就好像类加载器正在加载除jackson-databind-2.7.0.jar之外的每个Jar。

有谁知道是什么原因造成了这种情况,我该如何解决?

有人请指教...

+0

你的类路径中必须有一个错字。你如何运行你的程序? –

+0

使用java -verbose查看所有类从哪里加载。这些错误有时也掩盖了初始化程序中的一个错误或者另一个无法像超类一样找到的依赖项。 – Gerhard

回答

0

我想通了什么是错的。

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

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

  1. 创建一个运行在JVM并具有指向每一个需要的jar文件的参数列表,或脚本:

2:手动输入每个必需的jar文件到清单文件

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

无论如何,很抱歉打扰人们对这个问题。希望发布这个答案将有助于其他人避免类似的问题...

+0

也许使用maven或ivy来进行依赖管理? – Max

+0

Maven不是重点。我有应用程序依赖的所有jar在开发环境中运行。除非Maven为您更新清单文件,否则在环境外部署时无关紧要。 (请注意:你认为我如何得到所有依赖的罐子?)...... –

相关问题