当在Linux上作为打包的.war部署时,由FFmpeg引起的Java.lang.NoClassDefFoundError(在开发机器上工作)

当在Linux上作为打包的.war部署时,由FFmpeg引起的Java.lang.NoClassDefFoundError(在开发机器上工作),java,linux,maven,ffmpeg,Java,Linux,Maven,Ffmpeg,我使用FFmpeg包装器为用户上传的视频创建缩略图。在我的开发机器上进行测试时,它工作得非常好。但是,每当我将项目打包为.war并部署到Amazon Web服务时,我都会得到以下堆栈跟踪: Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutil at java.lang.Class.forName0(Native Method) ~[na:1.8.0

我使用FFmpeg包装器为用户上传的视频创建缩略图。在我的开发机器上进行测试时,它工作得非常好。但是,每当我将项目打包为.war并部署到Amazon Web服务时,我都会得到以下堆栈跟踪:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutil
    at java.lang.Class.forName0(Native Method) ~[na:1.8.0_101]
    at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_101]
    at org.bytedeco.javacpp.Loader.load(Loader.java:472) ~[javacpp-1.2.1.jar!/:1.2.1]
    at org.bytedeco.javacpp.Loader.load(Loader.java:417) ~[javacpp-1.2.1.jar!/:1.2.1]
    at org.bytedeco.javacpp.avformat$AVFormatContext.<clinit>(avformat.java:2597) ~[ffmpeg-2.8.1-1.1.jar!/:1.2.1]
    at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:391) ~[javacv-1.2.jar!/:1.2]
    at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:385) ~[javacv-1.2.jar!/:1.2]
    at com.myapp.app.service.ICampaignService.createThumbnail(ICampaignService.java:425) ~[classes!/:0.0.44T-SNAPSHOT]
    at com.myapp.app.service.ICampaignService$$FastClassBySpringCGLIB$$47736265.invoke(<generated>) ~[classes!/:0.0.44T-SNAPSHOT]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) ~[spring-aop-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:280) ~[spring-tx-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) ~[spring-aop-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at com.myapp.app.service.ICampaignService$$EnhancerBySpringCGLIB$$67e59894.createThumbnail(<generated>) ~[classes!/:0.0.44T-SNAPSHOT]
    at com.myapp.app.controllers.CampaignController.uploadCampaign(CampaignController.java:237) ~[classes!/:0.0.44T-SNAPSHOT]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_101]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_101]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_101]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    ... 85 common frames omitted
将Linux升级到2.4、将javacpp降级到1.2.1并运行mvn clean后出错:

java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutil
    at java.lang.Class.forName0(Native Method) ~[na:1.8.0_111]
    at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_111]
    at org.bytedeco.javacpp.Loader.load(Loader.java:472) ~[javacpp-1.2.1.jar!/:1.2.1]
    at org.bytedeco.javacpp.Loader.load(Loader.java:417) ~[javacpp-1.2.1.jar!/:1.2.1]
    at org.bytedeco.javacpp.avformat$AVFormatContext.<clinit>(avformat.java:2819) ~[ffmpeg-3.2.1-1.3.jar!/:1.2.1]
    at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:391) ~[javacv-1.3.jar!/:1.3]
    at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:385) ~[javacv-1.3.jar!/:1.3]
java.lang.NoClassDefFoundError:无法初始化类org.bytedeco.javacpp.avutil
在java.lang.Class.forName0(本机方法)~[na:1.8.0_111]
在java.lang.Class.forName(Class.java:348)~[na:1.8.0_111]
在org.bytedeco.javacpp.Loader.load(Loader.java:472)~[javacpp-1.2.1.jar!/:1.2.1]
在org.bytedeco.javacpp.Loader.load(Loader.java:417)~[javacpp-1.2.1.jar!/:1.2.1]
在org.bytedeco.javacpp.avformat$AVFormatContext.(avformat.java:2819)~[ffmpeg-3.2.1-1.3.jar!/:1.2.1]
在org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:391)~[javacv-1.3.jar!/:1.3]
在org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:385)~[javacv-1.3.jar!/:1.3]
我到目前为止所做的尝试

  • 升级到Linux到2.4
  • 将javacpp降级到1.2.1
  • 运行mvn清理
  • 运行mvn-U
  • 删除/.m2/的内容并重新下载依赖项
  • 依赖版本的各种组合
  • git clone
    在Linux虚拟机上运行&mdash;
    mvn安装

看来,您需要将glibc更新到2.14
检查

这类错误可以被视为与类加载器相关的错误,也称为。在大多数情况下,类装入器试图在运行时查找类/方法,但没有找到他希望找到的内容

当您在处理一个具有大量外部依赖关系的更大的Java项目时,您可能会更经常地遇到这种问题(这些项目也有依赖关系等等)

解决这类问题有几种方法,其中一种很好的方法是:

检查您的依赖关系树:

运行
mvn clean
清除可能的噪音。然后跑
mvn依赖项:tree-U>deps.txt
-U
标志强制maven更新/下载从属库的最新快照版本

查看
deps.txt
内部将生成maven项目中所有依赖项的树结构。其内容如下:

[INFO] +- com.fasterxml.jackson.core:jackson-core:jar:2.8.4:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.4:compile
[INFO] +- com.fasterxml.jackson.datatype:jackson-datatype-joda:jar:2.8.4:compile
[INFO] |  \- joda-time:joda-time:jar:2.3:compile
[INFO] +- com.fasterxml.jackson.module:jackson-module-scala_2.11:jar:2.8.4:compile
[INFO] |  +- org.scala-lang:scala-reflect:jar:2.11.8:compile
[INFO] |  \- com.fasterxml.jackson.module:jackson-module-paranamer:jar:2.8.4:compile
[INFO] |     \- com.thoughtworks.paranamer:paranamer:jar:2.5.2:compile
[INFO] +- com.google.guava:guava:jar:19.0:compile
[INFO] +- com.google.code.findbugs:jsr305:jar:3.0.1:compile
[INFO] +- org.apache.commons:commons-lang3:jar:3.4:compile
[INFO] +- org.mongodb:casbah-commons_2.11:jar:3.1.1:compile
如您所见,它是一个树结构,显示您的库及其依赖库。下一步,尝试查找版本不匹配(例如,同一范围内同一库的两个不同版本)

例如:

[INFO] +- com.fasterxml.jackson.core:jackson-core:jar:2.8.4:compile
[INFO] |  \- joda-time:joda-time:jar:2.3:compile
[INFO] +- com.my.fancy:library:jar:1.0:compile
[INFO] |  \- joda-time:joda-time:jar:1.8:compile
如您所见,fancy库包含另一个joda time版本,而不是jackson core。两者都在
编译
范围内。这可能会导致运行时错误,因为类加载器可以尝试获取joda:time:1.8的方法/类,但该方法/类位于所需的joda:time:2.3范围内

要解决这个问题,您可以明确地将一个joda时间版本从范围中排除(在
pom.xml
中):


我的幻想
图书馆
1
乔达时间
乔达时间
希望这将给你一个很好的第一次介绍。罐子地狱没有万能的解决方案,如果你有更多的问题,请随时回答这个问题,我们会解决的


Ivan

经过多次版本切换和Maven清理,我终于让它开始工作了。无需在Linux虚拟机上进行克隆

  • 马文清洁
  • 删除pom.xml中不必要的/重复的依赖项
  • 删除包含所有依赖项jar的/.m2/存储库文件夹
  • 运行maven build以重新安装所有依赖项
  • Maven安装和打包的.war不应该再有这个问题了

您是否在项目中下载了依赖项。@DurgpalSingh是。所有JAR都在我的Maven依赖项中。甚至Linux支持jar也在那里。(在javacpp预设依赖项中)将我的linux版本更新为:
64位Amazo In linux 2016.09 v2.4.0运行Java 8
。仍然得到相同的错误。我对Linux不是很熟悉。这样做合适吗?或者是否有另一个进程来更新我的Linux实例的glibc?在升级到2.4glibc版本2.17之后,我仍然有同样的问题。今天我学习了如何使用Linux。我运行了maven命令:
mvn dependency:tree-U>deps.txt
并发布了我的依赖关系树。据我所知,没有重复的依赖关系。如果你想看的话,我发布了依赖关系树。我将重新打包并部署,看看它是否解决了问题。@jakeMiller我想重新打包将解决您的问题。正如您在错误堆栈跟踪中看到的,类加载器尝试加载
javacpp-1.2.1.jar
——在依赖关系树中,您有
javacpp版本1.3
。尝试
mvn clean
如果不起作用,也尝试清空主目录中的
~/.m2/
文件夹。我是否应该将javacpp版本降级为1.2.1?其他bytedeco依赖项可能需要版本1.2.1?@JakeMiller如果重新打包不适合您,请执行此操作!如果您想深入了解并了解实际发生的情况,可以尝试将此例程添加到异常发生的位置(例如,代码中以异常开头的部分)。本部分将向您展示类装入器实际尝试装入的内容
println(“------------------------------------------------------------”)
println(this.getClass.getClassLoader.getResource(.getClass.getName.replace(“.”,“/”+”.class))
println(“-
[INFO] +- com.fasterxml.jackson.core:jackson-core:jar:2.8.4:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.4:compile
[INFO] +- com.fasterxml.jackson.datatype:jackson-datatype-joda:jar:2.8.4:compile
[INFO] |  \- joda-time:joda-time:jar:2.3:compile
[INFO] +- com.fasterxml.jackson.module:jackson-module-scala_2.11:jar:2.8.4:compile
[INFO] |  +- org.scala-lang:scala-reflect:jar:2.11.8:compile
[INFO] |  \- com.fasterxml.jackson.module:jackson-module-paranamer:jar:2.8.4:compile
[INFO] |     \- com.thoughtworks.paranamer:paranamer:jar:2.5.2:compile
[INFO] +- com.google.guava:guava:jar:19.0:compile
[INFO] +- com.google.code.findbugs:jsr305:jar:3.0.1:compile
[INFO] +- org.apache.commons:commons-lang3:jar:3.4:compile
[INFO] +- org.mongodb:casbah-commons_2.11:jar:3.1.1:compile
[INFO] +- com.fasterxml.jackson.core:jackson-core:jar:2.8.4:compile
[INFO] |  \- joda-time:joda-time:jar:2.3:compile
[INFO] +- com.my.fancy:library:jar:1.0:compile
[INFO] |  \- joda-time:joda-time:jar:1.8:compile
<dependencies>
   <dependency>
     <groupId>com.my.fancy</groupId>
     <artifactId>library</artifactId>
     <version>1.0</version>
     <exclusions>
       <exclusion>
         <groupId>joda-time</groupId>
         <artifactId>joda-time</artifactId>
       </exclusion>
     </exclusions>
   </dependency>
</dependencies>