java.lang.NoClassDefFoundError:无法初始化类com.monitorjbl.xlsx.StreamingReader

时间:2018-01-18 10:22:08

标签: java maven

从blob读取大型excel时遇到问题。

的pom.xml

    <dependency>
        <groupId>com.monitorjbl</groupId>
        <artifactId>xlsx-streamer</artifactId>
        <version>1.2.0</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.6</version>
      </dependency>
        <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv-platform</artifactId>
        <version>1.4</version>
      </dependency>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
      </dependency>

Workbook workbook = StreamingReader.builder()
                            .rowCacheSize(100)    // number of rows to keep in memory (defaults to 10)
                            .bufferSize(4096)     // buffer size to use when reading InputStream to file (defaults to 1024)
                            .open(in);

获得以下异常

  

java.lang.NoClassDefFoundError:org / slf4j / LoggerFactory         在com.monitorjbl.xlsx.StreamingReader。(StreamingReader.java:45)         at com.scmcaf.dao.FileUploadChildDAOImpl.excuteSchedulerForLineDetails(FileUploadChildDAOImpl.java:131)         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)         at java.lang.reflect.Method.invoke(Method.java:606)         在org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)         在org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)         在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)         at org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation(TransactionInterceptor.java:98)         at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266)         at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)         在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)         在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)         at com.sun.proxy。$ Proxy36.excuteSchedulerForLineDetails(Unknown Source)         在com.scmcaf.controller.TestController.doSomething(TestController.java:425)         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)         at java.lang.reflect.Method.invoke(Method.java:606)         在org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)         在org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)         at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)         at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)         at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301(ScheduledThreadPoolExecutor.java:178)         at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)         在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)         at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExenter   代码hereecutor.java:615)         在java.lang.Thread.run(Thread.java:744)       引起:java.lang.ClassNotFoundException:org.slf4j.LoggerFactory

3 个答案:

答案 0 :(得分:0)

您需要为依赖项添加SLF4J API:https://mvnrepository.com/artifact/org.slf4j/slf4j-api

当缺少某个类时,您可以在mvnrepository.com中搜索该类。只需复制org/slf4j/LoggerFactory

即可

答案 1 :(得分:0)

您正在使用错误版本的slf4j,因为您在pom.xml中明确声明了

如果你需要它,请尝试使用1.7.12版本或删除它,因为它是xlsx-streamer的依赖项

<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 <version>1.7.12</version>
</dependency>

有关maven如何在同一个依赖项的多个版本的情况下工作的更多信息,请阅读Transitive Dependencies一章 https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

  

依赖关系中介 - 这决定了依赖关系的版本   将在遇到多个版本的工件时使用。   目前,Maven 2.0仅支持使用“最近定义”   这意味着它将使用最接近的依赖版本   您的项目在依赖树中。你可以随时保证   版本通过在项目的POM中明确声明它。请注意,如果   两个依赖版本在依赖关系树中处于相同的深度,   直到Maven 2.0.8没有定义哪一个会赢,但从那以后   Maven 2.0.9这是声明中的顺序:第一个   宣言获胜。

"nearest definition" means that the version used will be the closest one to your project in the tree of dependencies, eg. if
     

A,B和C的依赖性定义为A - >; B - &gt; C - &gt; D 2.0和A.    - &GT; E - &gt; D 1.0,然后在构建A时将使用D 1.0,因为从A到D到E的路径更短。你可以明确添加一个   依赖于A中的D 2.0来强制使用D 2.0

答案 2 :(得分:-1)

这是一个棘手的问题。我用log4j遇到了类似的问题。 导航到JRE的目录,例如:

C:\Program Files\Java\jre8\lib

创建一个文件夹endorsed并删除jar log4j-1.2.17.jar(在您的案例中使用相关版本)。然后重新启动您的应用程序。

这解决了我。