今天遷移老項目到linux服務器,jdk8 ,tomcat8.5遇到這個問題。
java.lang.ClassNotFoundException: com.sun.image.codec.jpeg.JPEGCodec
查詢資料得知,原來openjdk從jdk7開始去掉了這個類。
ICEpdfPDF-332
JPEGCodec has been removed from JDK 1.7
引用:http://jira.icesoft.org/browse/PDF-332
處理:
更換為oracle jdk8,解決問題。
這兩天都快被這個錯誤整瘋了!!!
最近在寫java項目的時候需要用到
- import com.sun.image.codec.jpeg.JPEGCodec;
- import com.sun.image.codec.jpeg.JPEGImageEncoder;
這兩個類來把圖片寫入磁盤。注意:這兩個類可是處在系統自帶的jre里的rt.jar包里
- FileOutputStream out = new FileOutputStream(targetFile);
- JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
- encoder.encode(mBufferedImage);
本來在本地Eclipse測試的好好的,但是部署到Linux服務器的時候就出錯了
- java.lang.ClassNotFoundException: com.sun.image.codec.jpeg.JPEGCodec
- at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
- at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
- at com.vxpai.wechat.util.ImgUtil.imageScale(ImgUtil.java:72)
- at com.vxpai.wechat.webcontroller.UploadController.ss(UploadController.java:68)
- 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)
- at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
- at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
- at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
- at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
- at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
- at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
- at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
- at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
- at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
- at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
- at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931)
- at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
- at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
- at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
- at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
- at java.lang.Thread.run(Thread.java:745)
剛開始的時候以為是沒有引入rt.jar,將其用maven(我的項目是基於maven建立的)引入,部署上去之后居然還是報錯:
- java.lang.UnsatisfiedLinkError: no jpeg in java.library.path
- at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
- at java.lang.Runtime.loadLibrary0(Runtime.java:849)
- at java.lang.System.loadLibrary(System.java:1088)
- at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:67)
- at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:47)
- at java.security.AccessController.doPrivileged(Native Method)
- at sun.awt.image.codec.JPEGImageEncoderImpl.<clinit>(JPEGImageEncoderImpl.java:73)
- at com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(JPEGCodec.java:68)
- at com.vxpai.wechat.util.ImgUtil.imageScale(ImgUtil.java:72)
- at com.vxpai.wechat.webcontroller.UploadController.ss(UploadController.java:68)
- 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)
- at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
- at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
- at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
- at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
- at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
- at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
- at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
- at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
- at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
- at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
- at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931)
- at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
- at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
- at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
- at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
最后,果斷棄百度google了一下,終於找到了產生java.lang.ClassNotFoundException的原因:The basic explanation is that com.sun.image.codec.jpeg.JPEGCodec and related libraries have long been marked as depreciated, and you should use the ImageIO library instead. 參考地址:http://www.derrickwilliams.com/
原來,在jdk最新的版本中,這jpeg包下的類已經不推薦,所以,果斷用ImageIO替換這兩個類
- FileOutputStream out = new FileOutputStream(targetFile);
- ImageIO.write(mBufferedImage, type, out);
修改完成,部署,終於OK啦!