分配为战争后的Tess4J错误NoClassDefFoundError:无法初始化类net.sourceforge.tess4j.TessAPI

时间:2016-01-26 11:32:48

标签: java maven jna tess4j

我有一个Spring启动的Web服务器项目,可以在我的PC下在Intellij IDEA下运行正常,但是在与war文件分发到同一台PC后它不起作用 - NoClassDefFoundError:无法初始化类net.sourceforge.tess4j.TessAPI < /强>

我的代码:

ITesseract instance = new Tesseract(); // JNA Interface Mapping

 instance.setDatapath(new File(datapath).getPath()); 
 instance.setLanguage("eng");      
 try {
          String result = instance.doOCR(imageFile); 
 } catch (TesseractException e) {
          System.err.println(e.getMessage());
 }

我只有一个maven依赖,与Tess4J相关:

<dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>3.0.0</version>
</dependency>

运行分布式战争后我遇到了错误:

There was an unexpected error (type=Internal Server Error, status=500).
Could not initialize class net.sourceforge.tess4j.TessAPI

完整的Tomcat日志:

java.lang.NoClassDefFoundError: Could not initialize class net.sourceforge.tess4j.TessAPI
        at net.sourceforge.tess4j.Tesseract.init(Tesseract.java:367) ~[tess4j-3.0.0.jar:3.0.0]
        at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:280) ~[tess4j-3.0.0.jar:3.0.0]
        at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:212) ~[tess4j-3.0.0.jar:3.0.0]
        at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:196) ~[tess4j-3.0.0.jar:3.0.0]
        at ocr.OCRController.handleFileUpload(OCRController.java:127) ~[classes/:0.3.0]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_51]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_51]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_51]
        at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_51]
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]

如何修复错误?我计划在Tomcat下的Windows Azure中托管此应用程序。感谢您的帮助,朋友们!

3 个答案:

答案 0 :(得分:0)

问题出在临时文件夹中 - 它不包含所有必要的dll。

社区信息: 1.检查tomact下的临时文件夹 - 对我来说,它的路径是: D:\Programs_Files\apache-tomcat-8.0.27\temp

此临时文件夹必须包含目录tess4j \ win32-x86-64以及下3个文件: gsdll64.dll,liblept171.dll,libtesseract304.dll (或您的版本)

我遇到了问题,因为tess4j \ win32-x86-64目录从未在temp中创建过。

<强> BUT

我的应用程序在Intellij IDEA下工作正常,因为另一个Temp文件夹(对于IDEA)工作正常 - C:\Users\Iuliia\AppData\Local\Temp\

按预期包含tess4j \ win32-x86-64 \ gsdll64.dll,tess4j \ win32-x86-64 \ liblept171.dll,tess4j \ win32-x86-64 \ libtesseract304.dll。

请注意,此文件是在代码中调用Tesseract的过程中创建的。不早。

我如何在Tomcat下修复问题

我已将win32-x86-64 \ gsdll64.dll,win32-x86-64 \ liblept171.dll,win32-x86-64 \ libtesseract304.dll添加到资源目录中我的项目。

看看我的项目结构:

在部署到tomcat之后,必要的dll在classes目录下(很重要!) - 这意味着它们在范围内。

现在它将被添加到

D:\ Programs_Files \ apache-tomcat-8.0.27 \ temp \ tess4j \ win32-x86-64如预期的那样。

答案 1 :(得分:0)

NoClassDefFoundError的另一种解决方法是安装相应的Microsoft C++ Runtime(滚动到底部并展开Other Tools and Frameworks):

  

由于DLL是使用Visual Studio 2015/2017构建的,因此请确保已安装Visual C ++ 2015 Redistributable或VC ++ 2017 Redistributable。

有关更多详细信息,请参见Tess4J开发教程。

答案 2 :(得分:0)

我已升级到Windows 10,但突然的杂乱无章不再适用于我的应用程序。

根据Tess4J文档,您需要拥有VC++ 2017 Redistributable installed.

在Windows 10上安装它之后,一切又恢复正常了。

如果您已升级到Windows 10,并且遇到了上述问题,并且以前曾奏效,那么这很可能是您的问题。