weblogic 发布war包时, weblogic将war中的classes中的文件打包成了_wl_cls_gen.jar, 导致struts(我这的2.5.17)在读取文件时需要从这个jar里进行读取, 且每次读取一个xml就关闭了输入流; 从jar中读取的过程存在解压的步骤, 在tmp文件夹中写入临时文件, 进而出现大量相同的文件, 且文件的MD5和_wl_cls_gen.jar的一致, 这也是我做出以上描述的依据.

  1. 升级struts 2.5.17 至 2.5.18
  2. 修改发布方式, 将war包解压后发布
    选中解压后的文件夹
    在这里插入图片描述
    后面配置中的" 源可访问性 "选最后一项(这里选了之后好像上面那步没啥用, 因为文件是从这里加载了)
    在这里插入图片描述
    再次发布后就没有生成_wl_cls_gen.jar和大量的临时文件了
  • 扩大缓存,直接在内存中解压jar并提取文件, 目前没找到相应方法/配置 , 文件读取缓存大小,但是好像不能解决每次取xml就解压的问题,

weblogic, 大量临时文件, Struts, jar_cache, tmp, java.io.tmpdir

发现过程(闲谈)

  • 系统发布时间很长还卡, 启动还需要写入大量的临时文件
  • 看日志发现在自定义的监听器都执行完毕后卡好一会, 临时文件就是在这时写入,是大量的jar_cache*.tmp文件, 大约几兆, 但是数量很多导致占用大量java.io.tmpdir指定的空间, 文件大小一致, MD5也一致, tomcat中就没有这个问题
  • 分析了tmp文件, 发现是项目中文件, 大致是class和各种properties及xml文件, 默认发现jsp/html等(伏笔)
  • 因为系统发布时间较长, 打算先删掉一些启动项缩短时间 (因为我也不清楚什么原因, 考虑到需要测试和发布很多次观察现象做总结, 能快点就快点, 删context.xml和DTO怕起不来, 删了Action.xml和字典加载), 发现临时文件变少了
  • 字典是写在缓存里的, 而且内容也对不上, 怀疑是一个action对应一个临时文件,测试后发现不对
  • 怀疑是一个package对应一个临时文件, 测试后也不对
  • 怀疑是一个action.xml对应一个临时文件, 测试现象符合预期
  • 日志打的info, debug级别的日志太多, 没敢开, 但是又需要知道是哪里写入的
  • 故意在xml中写了个语法错误,通过异常栈看到了调用过程,(windows启的weblogic,没用过jstack), 感觉XmlConfigurationProvider.loadConfigurationFiles这方法值得怀疑
  • 下载Struts的源码看一下, 发现文件流都是正常关闭的
  • 故意include一个不存在的文件, 没发现报错, 上eclipse调试发现异常被吞掉了, 只输出了一条debug, 这怎么也应该要配warn吧
  • 尝试eclipse连接weblogic调试, 报了个拒绝连接, 就放弃了
  • 查看语法报错的提示发现文件路径是: zip:部分路径/_wl_cls_gen.jar!/xml路径
  • 确认了weblogic的发布目录下的lib文件夹有这个文件_wl_cls_gen.jar且classes文件夹中无内容
  • 比对_wl_cls_gen.jar和临时文件的MD5, 结果一致
  • 搜到解决方法纯属巧合, 想着不让weblogic打包classes生成jar, 就先搜发布优化, 没找到合适的, 看了下welogic文档, 没找到中文的, 放弃
  • 最后看到了 “weblogic 单独更新class文件"里提到了使用展开目录部署, 搜索后找到了"weblogic的三种发布方式”, 用其中的按目录发布暂时解决了这个问题
weblogic 发布 war 时,class文件会打 _wl_cls_gen. jar 文件放在../ tmp /_WL_user的lib目录下,程序里获取class里的配置文件等需要使用this.getClass().getResourceAsStream("绝对路径"); Weblogic 下载、安装、数据源配置可参考: weblogic 安装部署、 weblogic 配置JNDI数据源,接下来进入到我自己研究的干货领域,我通过几个常见问题来介绍 weblogic : 在MAIN_NAME文件夹下:nohup ./start Weblogic .sh 首次运行会在MAIN_NAME文件夹下 生成 nohup.out文件,作用同Tomcat下的catalina.out 想了解 Java 运行 Jar 内存配置的操作的相关 内容 吗,闲丰在本文为您仔细讲解 Java Jar 内存配置的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点: Java , Jar ,内存配置,下面大家一起来学习吧。如下: java - jar -Xms1024m -Xmx1536m -XX:PermSize=128M -XX:MaxPermSize=256M car. jar 说明:1、堆内存:最小102... 网上的办法都不靠谱,没说到点上。 在 发布 war 时, weblogic 会自动把classes下面的文件编译成一个_wl_cls_gen. jar 文件,放在WEB-INF/lib下面。 这时,我们不能使用先获取文件路径,再通过new File(filePath)的方式获取文件。因为获取到的路径是以zip://开头的。 String path = this.class.getClassL 项目在eclipse中打 时,class文件夹是存在的,并且不为空。 但是当项目部署到 weblogic 时,是打成 war 的,这时src目录就已经消失了,classes目录在部署到 weblogic 中时经过解压的 war ,classes目录下是空的,classes下的东西是被打 成  _wl_cls_gen. jar ! , 括配置文件都被压缩了,这个 jar (_wl_cls_gen. jar ! import java .net. Jar URLConnection; import java .net.URL; import java .net.URLClassLoader; import java .util.Enumeration; import java .util.HashSet; import java .util.Map; import java .util.Se 起因:一个项目我直接在 weblogic 服务器下把 发布 WebContent下的文件是可以访问文件成功的,但是打成 war 发布 weblogic 下就会出错。文件是放在src下的,最终编译在WEB-INF的classes文件下。Original Code:ClassLoader classLoader = Thread.currentThread().getContextClassLoader();cl... driver =com.intersys.jdbc. Cache Driver url =jdbc: Cache ://127.0.0.1:1972/USER username =_system password =123456 新建jdbc驱动加载文件 ExamHisJDBCUtils. java public class Exam... Jenkins配置windows为从节点时代理失败 报错位置: java - jar remoting. jar -workDir - jar - cache /remoting/ jar Cache C:\Users\Admin 报错: No argument is allowed: /remoting/ jar Cache C:\Users\Admin 原因:没有设置远程工作目录,设置成remoting. jar 目录即可 1、 weblogic 部署 war 后, tmp 目录下的classes为空,是因为 weblogic 自动将.class文件和配置文件都打到lib/_wl_cls_gen. jar 中。 2、所以在 struts .xml中增加 3、试了一下,仍然找不到Action。 这是因为打的_wl_cls_gen. jar 没有META-INF文件夹, Struts 不能识别此 jar 。故 在源 或resources...