как добавить поддержку набора символов IBM437 в API J2SE 1.4 - PullRequest
3 голосов
/ 05 сентября 2011

Я должен внести изменения в старый проект, который использует J2SE 1.4.Теперь, когда я запускаю проект, я получаю сообщение об ошибке

javax.servlet.ServletException: The character set 'IBM437' is supported by the JSE 1.1 API, but not the J2SE 1.4 API.
This requires fixing the Java Runtime Environment!
Please read the Javadoc of this error class for more information.
    at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:498)
    at org.apache.jsp.download_orders_action_jsp._jspService(download_orders_action_jsp.java:131)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:92)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:720)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:162)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:240)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:187)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:720)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:145)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:139)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2460)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:119)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:157)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Thread.java:534)

Он используется создателем zip-файла.Вопрос в том, как я могу добавить эту поддержку в J2SE 1.4.Погуглив проблему, я получил эту страницу, но я не понимаю, что делать с этой страницы.Любая помощь будет принята с благодарностью.

код для создания zip-файлов, который вызывается из jsp и где я думаю, что настоящая проблема -

String zipFilename = currentDumpDirName + ".zip";
de.schlichtherle.io.File srcDir = new de.schlichtherle.io.File(currentDumpRootDir);
de.schlichtherle.io.File zipFile = new de.schlichtherle.io.File(dumpRootDir, zipFilename);
boolean zippedSuccessfully = srcDir.copyAllTo(zipFile);
zipFile.umount();

, как видно изосновная причина исключения

de.schlichtherle.io.archive.spi.AbstractArchiveDriver $ InconsistentCharsetSupportError: Набор символов 'IBM437' поддерживается API JSE 1.1, но не API J2SE 1.4.Это требует исправления Java Runtime Environment!Пожалуйста, прочитайте Javadoc этого класса ошибок для получения дополнительной информации.в de.schlichtherle.io.archive.spi.AbstractArchiveDriver. (AbstractArchiveDriver.java:92) в de.schlichtherle.io.archive.zip.Zip32Driver. (Zip32Driver.java:136) в de.schlichtherle.io.archive.zip.Zip32Driver. (Zip32Driver.java:71) в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.jmpl.jpg_jl_ru.jpg).27) в java.lang.reflect.Constructor.newInstance (Constructor.java:274) в java.lang.Class.newInstance0 (Class.java:308) в java.lang.Class.newInstance (Class.java:261) вde.schlichtherle.io.ArchiveDriverRegistry.createArchiveDriver (ArchiveDriverRegistry.java:267) в de.schlichtherle.io.ArchiveDriverRegistry.getArchiveDriver (ArchiveDriverRegistry.java:240) в divechivedivediveв de.schlichtherle.io.File.init (File.java:892) вde.schlichtherle.io.File.init (File.java:810) в de.schlichtherle.io.File. (File.java:556) в de.schlichtherle.io.File. (File.java:522) в Великобритании.co.planetbeyond.photoprintingserver.OrdersPackagingService.packageOrders (OrdersPackagingService.java:43) в org.apache.jsp.download_orders_action_jsp.: 92) в javax.servlet.http.HttpServlet.service (HttpServlet.java:720) в org.apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper.java:162) в org.apache.jasper.let.serviceJspFile (JspServlet.java:240) в org.apache.jasper.servlet.JspServlet.service (JspServlet.java:187) в javax.servlet.http.HttpServlet.service (HttpServlet.java:7ap.cat.cat.cat.cat.cat). org.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:199) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:145) в org.apache.catalina.core.StandardWare.erValve.invoke (StandardWrapperValve.java:210) по адресу org.apache.catalina.core.StandardPipeline $ StandardPipelineValveContext.invokeNext (StandardPipeline.java:596) по адресу org.apache.catalina.core.StandardPipeline.433в org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:955) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:139) в org.apache.catalina.core.StandlinePipe.invokeNext (StandardPipeline.java:596) в org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:433) в org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:955) в орг.apache.catalina.core.StandardContext.invoke (StandardContext.java:2460) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:133)в org.apache.catalina.core.StandardPipeline $ StandardPipelineValveContext.invokeNext (StandardPipeline.java:596) в org.apache.catalina.valves.ErrorDispatcherValve.invoke (ErrorDispatcherValve.java:119) в org.apache.catalina.core.StandardPipeline $ StandardPipelineValveContext.invokeNext (StandardPipeline.java:594) в org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:116) в org.apache.catalina.core.StandardPipeline $ StandardPipelineValveContext.invokeNext (StandardPipeline.java:594) в org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:433) в org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:955) в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:127) в org.apache.catalina.core.StandardPipeline $ StandardPipelineValveContext.invokeNext (StandardPipeline.java:596) в org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:433) в org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:955) в org.apache.coyote.tomcat4.CoyoteAdapter.service (CoyoteAdapter.java:157) в org.apache.coyote.http11.Http11Processor.process (Http11Processor.java:873) в org.apache.coyote.http11.Http11BaseProtocol $ Http11ConnectionHandler.processConnection (Http11BaseProtocol.java:665) в org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket (PoolTcpEndpoint.java:528) в org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt (LeaderFollowerWorkerThread.java:81) в org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run (ThreadPool.java:689) на java.lang.Thread.run (Thread.java:534) Вызвано: java.nio.charset.UnsupportedCharsetException: IBM437 в java.nio.charset.Charset.forName (Charset.java:486) at de.schlichtherle.io.archive.spi.AbstractArchiveDriver.testJSE14Support (AbstractArchiveDriver.java:112) at de.schlichtherle.io.archive.spi.AbstractArchiveDriver. (AbstractArchiveDriver.java:89) ... еще 53

1 Ответ

4 голосов
/ 05 сентября 2011

Вы, похоже, используете IBM437 в качестве канонического имени или псевдонима кодировки, и в соответствии с той же страницей, с которой вы связались , она не указана в качестве действительного имени или псевдонима. Вместо этого в списке указывается IBM-437, которое выглядит как правильное имя, и вы должны указать его вместо этого.

Я не вижу ни одного кода, размещенного в вопросе, который использует в коде литерал String IBM437, и, следуя стековой трассировке, я подозреваю, что вы указали это в JSP (который компилируется в сервлет, который использует движок Jasper) либо в атрибуте pageEncoding, либо в атрибуте contentType директивы page. Таким образом, вы должны заменить IBM437 на IBM-437 в JSP и перекомпилировать его.

Кроме того, вы не указали, должен ли ваш проект использовать набор символов IBM-437. Я подозреваю, что набор символов IBM-437 используется из-за одного из нескольких системных свойств, таких как file.encoding, установленного на IBM-437. Если вы не намереваетесь использовать IBM-437, вам следует начать рассматривать использование канонического имени или псевдонима, такого как UTF-8, во всем коде, чтобы ваше приложение не имело никаких неуместных предположений относительно набора символов входных данных или выходные ответы, с которыми он имеет дело.


Обновленный ответ

На основании новой трассировки стека и отправленного кода можно вывести следующее:

  • Вы используете TrueZIP 6. Это важно в некотором смысле, поскольку основная причина, по которой требуется поддержка набора символов IBM437 в вашей JRE, связана с базовым требованием кодирования записей в файле ZIP с использованием IBM437 набор символов , также известный как CP437.
  • Текущая рабочая среда JRE и не поддерживает набор символов IBM437 в любой форме . Обратите внимание на акцент в предыдущей строке. Очевидно, TrueZIP 6 поставляется с поддержкой IBM437, хотя JRE может не поддерживать этот набор символов. TrueZIP использует концепцию SPI-провайдера в Java NIO, которая доступна с Java 1.4 для поддержки дополнительных кодировок, которые изначально не поддерживаются JRE; в данном конкретном случае набор символов IBM437 поддерживается с помощью класса de.schlichtherle.nio.charset.IBM437Charset, который должен присутствовать в вашем файле truezip-6.jar. Файл JAR также должен содержать следующий файл: META-INF/services/java.nio.charset.spi.CharsetProvider с содержимым de.schlichtherle.nio.charset.spi.CharsetProvider (т. Е. Поставщик кодировки, встроенный в TrueZIP, который регистрирует класс IBM437Charset).

На основании вышеизложенного следует проверить следующее:

  • Может ли загрузчик классов веб-приложения искать поставщика кодировок, встроенного в TrueZIP? Это важно, так как базовый JRE (я предполагаю, что это Sun JRE 1.4.2_x) не поддерживает набор символов IBM437, а TrueZIP полагается на поставщика встроенного набора символов для поддержки набора символов IBM437. Так как CharsetProvider ищутся с использованием загрузчика классов контекста текущего потока (отмеченного в документации CharsetProvider Java API), невозможность загрузить TrueZIP CharsetProvider приведет к выбросу InconsistentCharsetSupportError. В большинстве веб-приложений контекстный загрузчик классов текущего потока также оказывается загрузчиком классов веб-приложения (который загружает классы из WEB-INF\lib и WEB-INF\classes), но это не всегда так. В случае, если загрузчик классов контекста не является загрузчиком классов веб-приложения, вы должны поместить файл truezip-6.jar в путь к классам загрузчика классов контекста вместо WEB-INF \ lib.
  • Вы можете проверить, произошла ли ошибка при загрузке реализации TrueZIP CharsetProvider, запустив ваш код в автономной JRE (из командной строки) вместо запуска в веб-приложении; не забудьте поместить truezip-6.jar в путь к классу приложения.
  • Рассмотрите возможность размещения truezip-6.jar в каталоге расширений (<jre>/lib/ext) JRE, используемой контейнером веб-приложения. Это следует делать только в том случае, если вы не можете получить загрузчик класса текущего контекста для загрузки TrueZIP CharsetProvider, и только когда вы убедились, что проблема заключается в загрузке CharsetProvider.
...