Lohanry

宠辱不惊,绝不妄自菲薄

少年,你对力量一无所知


一个浪荡的程序猿

Jfinal使用Velocity视图部署到tomcat上velocity.log (Permission denied)解决

起因:

自己在搭建一个关于 EVE Online 游戏 的网站,框架用的是Jfinal的,页面模板用的是velocity,在自己开发环境上一切正常,然后部署到线上环境后出现错误。线上的环境是Ubuntu14+Nginx+Mysql+Tomcat。

错误:

Caused by: java.io.FileNotFoundException: velocity.log (Permission denied)

定位:

网上也有类似许多的问题,也有分析,我就不细说。总结起来就是:

  • 1.使用时没有设置velocity log的任何参数,因为系统中存在Log4j的包,所以会使用Log4jChute做为Log记录的对象返回。

  • 2.在初始化Log4jChute时,没有设置logger.name,初始化Logger时,会使用默认的velocity.log做为文件输出路径

  • 3.File file = new File(“velocity.log”),是基于当前jvm的current work,也就是user.dir属性。

而我又是将运行web跑在普通用户权限,但是安装tomcat是Root,所以权限出错。 所以第一次访问网站页面的时候当渲染页面时候,Velocity就会尝试建立日志,但是由于上面的问题无法创建。

解决方案

1. 建立velocity的配置文件:

  • 由于我也是第一次使用,根据Jfianl手册并没有找到velocity的配置文件需要怎么放和修改代码就没有使用,回头有空去研究一下。 ### 2. 代码修改:

  • 根据Jfinal的代码跳转:

    Controller.renderVelocity(view)==>renderFactory.getVelocityRender(view)==>new VelocityRender(view)

  • 发现最后是跳到了一个VelocityRende类中,阅读源代码后发现这个调用render()是Jfinal调用的,init也是。不过Jfinal 给留了一个setProperties()方法。于是就想到在可以在项目中动态的添加一个配置就可以了。

  • 2.2 代码:

  • 创建一个继承Controller的类,名为BaseController。

    public class BaseController extends Controller {
        public Logger logger =  Logger.getLogger(this.getClass());
        @Override
        public void renderVelocity(String view) {
            logger.info("Now is Uing Custom VelocityRender Properties");
            if (Velocity.getProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM_CLASS) == null ){
                Properties properties = new Properties();
                properties.setProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.NullLogChute");
                VelocityRender.setProperties(properties);
            }
            super.renderVelocity(view);
        }

    }
  • 让自己的Controller继承BaseController。
    public class indexController extends BaseController {
        public void index() {
            setAttr("App", App.getInstance());
            setAttr("description", "Eve Dps 配装器");
            renderVelocity("index.html");
        }
    }
  • 2.3 关键:

    这里对即将进行Velocity.init(properties);的properties添加参数.

    properties.setProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM_CLASS, “org.apache.velocity.runtime.log.NullLogChute”);

    我这里是直接关闭了输出。

##总结: 这样之前的线上服务器的错误就解决了。但是其实我并不觉得处理这个问题的方法这样是最好的,我觉得应该还是可以设置配置文件进行设置的。

记录这个问题的解决方法我也是想给自己做个抛砖引玉的提示。

##感谢: @jfinal Jfinal框架真的挺方便的,很多时候我自己在做小项目是否开发起来非常的快,真的非常感谢作者。当然上面的解决问题的见解也是我个人非常浅显的见解甚至有可能是错误的,希望大家不要见笑,我也在一边的开发,一遍阅读其代码,再次感谢。 ##最后: 也想分享下自己的这个网站,但是网站还没好,就不发了。

主要的框架就是Jfinal,整个网站都是通过Api来获取数据的。页面只是显示一点静态的资料,甚至可以直接用html来代替,所有数据都是通过ajax来获取请求的,验证时用签名验证,时间戳+token做过期和重放攻击的过滤。

有个问题想请教下大家,关于前段大家都是怎么写的,我都是一个个代码敲得感觉很累,不知道怎么开发是简单快捷的。

最近的文章

PendingIntent中Flags的参数设置

PendingIntent是一个Intent的描述、包装,给予了这个PendingIntent 的组件在指定的事件发生或指定的时间到达时启动Activty、Service或者Broadcast。根据是要启动Activity、Service还是Broadcast分别对应一个获取PendingIntent的方法 public static PendingIntent getActivity(Context context, int requestCode,Intent intent, int...…

继续阅读
更早的文章

Unity 摄像机搭配陀螺仪的使用

Unity 射线碰撞检测项目起因: 前段时间自己在做的一个项目中需要实现一个类似AR的相机实现。举例来说就是App中打开照相机,然后屏幕中显示相机背景然后再显示一个模型,但是模型的世界坐标是不会变化的,不会随着手机的转动而跟着转动、1.相机实现原理: 获取手机的姿态(陀螺仪) 实例化3D模型且固定 根据陀螺仪修改场景内相机的位置,姿态 2.ARCamera的结构:;3.代码实现:ARCamera上的Cs脚本:using UnityEngine;using Syst...…

继续阅读