dwr框架报SecurityException异常的一个可能原因:类加载问题

  项目有个模块用了dwr框架,本来是正常的,今天突然项目现场来了个电话说有问题。

  不会吧,开发环境还正常运行着呢,而且现场的包还是我出的。

  从日志看到的错误是java.lang.SecurityException: No class by name: xxx,难道我出的包有问题?

  检查了现场环境部署的文件,字节码文件配置文件一个没少;又检查了下dwr.xml和web.xml的文件内容,也没发现什么不对劲的。

  网上搜索了一下相关的报错,无非就classpath、配置文件错误之类的,也没找到有用的信息。

  关键是开发环境是正常的,常规检查无误后差不多可以断定是环境问题了。

  下一招就是程序员的杀手锏,重启服务器。

  重启后终于有点小发现,应用启动初始化过程出错了。
  Error setting class=com.xxx.Xxx on org.directwebremoting.create.NewCreator
  java.lang.IllegalArgumentException: Class not found: com.xxx.Xxx
  赶紧也重启了下开发环境,并没发现这个错误。

  用google瞎找一番,发现跟我碰到同样问题的人还不少,不过都没能解决我的问题,各种求高手。

  最终,互联网还是没能帮我解决这个问题。

  问题还是要解决的,只能靠自己找原因了。

  首先,代码是一样的,但开发环境和现场环境运行结果不一样,最大可能就是部署问题了。

  操作系统、中间件、数据库,最有可能的是中间件问题,开发环境是was6.0,而现场环境是was7.0。

  不过呢,was7.0之前也是能正常运行这个模块的,只是今天才出现这个问题。

  虽然觉得差不多是was的问题,但还是没法明确说出是哪里的问题,于是问了现场同事,这两天有没有改过什么配置。

  这一问就水落石出了。

  原来他昨晚测试的时候在was控制台改了类装载策略做测试忘记改回来了。

  现在现场was7.0中,WAR class loader policy选的是Class loader for each WAR file in application(对应was6中文应该是叫模块),而我们是ear程序包,第三方依赖都统一放在ear文件夹下面,正常情况下是要选择Single class loader for application(对应was6中文应该是叫应用程序)。

  果然,现场同事改回single后就正常了,问题算告一段落。

  回想碰到的这个问题,费了那么大周折才找到原因,仔细想想有点不应该。

  首先基本可以确定代码是正确的(开发环境没发现同样的问题),其次日志报错找不到类,而找不到的这个类又确实存在正确的classpath下,那就应该考虑类加载的问题了,终究还是层次不够高啊。

你可能感兴趣的:(other)