tomcat解压war包的一点例外

我在项目的开发过程中,发现Tomcat解压war 的一点例外。
   
   现象如下:

       使用ANT工具把web应用程序打为war文件。然后把war文件放到tomcat的webapps,让tomcat自己解压。结果出现解压的web应用程序文件丢失。使用rar工具打开war文件。文件都齐全。怎么有这种现象呢??查看tomcat的log文档。发现在解压war文档NullpointException.我升级tomcat到5.0还是现这种现象。

jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/HostConfig.java

   解决方法:

       我从tomcat网站下载了catalina 的原代码,进行分析。发现是在解压war文件现input为null,而 input= jar.getInputStream(entry);然后提高tomcat的debug级别。可以在tomcat的log文档看到tomcat解压war文档的过程。发现如果某些文件名为???.txt,经检查发现原来这个文件的文件名为汉字。
      噢!才发现war文件在解压的过程中无法处理汉字的文件名。(因为找不到文件名为???.txt的文件而导致null例外。原来这个文件是个注释文档),所以在使用ant把web应用程序打为war文件,一定要把文件名为汉字的文件去掉。使用Forte for java的IDE工具把web应用程序打为war文件会不含这些文件名为汉字的文件


下面是部分war文档解压的部分代码

代码采自jakarta.org 



 类HostConfig.java

jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/HostConfig.java



   解决方法:

       我从tomcat网站下载了catalina 的原代码,进行分析。发现是在解压war文件现input为null,而 input= jar.getInputStream(entry);然后提高tomcat的debug级别。可以在tomcat的log文档看到tomcat解压war文档的过程。发现如果某些文件名为???.txt,经检查发现原来这个文件的文件名为汉字。
      噢!才发现war文件在解压的过程中无法处理汉字的文件名。(因为找不到文件名为???.txt的文件而导致null例外。原来这个文件是个注释文档),所以在使用ant把web应用程序打为war文件,一定要把文件名为汉字的文件去掉。使用Forte for java的IDE工具把web应用程序打为war文件会不含这些文件名为汉字的文件


下面是部分war文档解压的部分代码

代码采自jakarta.org 



 类HostConfig.java

jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/startup/HostConfig.java


  1.  protected void deployWARs(File appBase, String[] files) {
  2.         for (int i = 0; i < files.length; i++) {
  3.             if (files[i].equalsIgnoreCase("META-INF"))
  4.                 continue;
  5.             if (files[i].equalsIgnoreCase("WEB-INF"))
  6.                 continue;
  7.             if (deployed.contains(files[i]))
  8.                 continue;
  9.             File dir = new File(appBase, files[i]);
  10.             if (files[i].toLowerCase().endsWith(".war")) {
  11.                 deployed.add(files[i]);
  12.                 // Calculate the context path and make sure it is unique
  13.                 String contextPath = "/" + files[i];
  14.                 int period = contextPath.lastIndexOf(".");
  15.                 if (period >= 0)
  16.                     contextPath = contextPath.substring(0, period);
  17.                 if (contextPath.equals("/ROOT"))
  18.                     contextPath = "";
  19.                 if (host.findChild(contextPath) != null)
  20.                     continue;
  21.                 // Checking for a nested /META-INF/context.xml
  22.                 JarFile jar = null;
  23.                 JarEntry entry = null;
  24.                 InputStream istream = null;
  25.                 BufferedOutputStream ostream = null;
  26.                 File xml = new File
  27.                     (configBase, files[i].substring
  28.                      (0, files[i].lastIndexOf(".")) + ".xml");
  29.                 if (!xml.exists()) {
  30.                     try {
  31.                         jar = new JarFile(dir);
  32.                         entry = jar.getJarEntry("META-INF/context.xml");
  33.                         if (entry != null) {
  34.                             istream = jar.getInputStream(entry);
  35.                             ostream =
  36.                                 new BufferedOutputStream
  37.                                 (new FileOutputStream(xml), 1024);
  38.                             byte buffer[] = new byte[1024];
  39.                             while (true) {
  40.                                 int n = istream.read(buffer);
  41.                                 if (n < 0) {
  42.                                     break;
  43.                                 }
  44.                                 ostream.write(buffer, 0, n);
  45.                             }
  46.                             ostream.flush();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值