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.代码修改:

1.根据Jfinal的代码跳转:
    Controller.renderVelocity(view)==>renderFactory.getVelocityRender(view)==>new VelocityRender(view)
    发现最后是跳到了一个VelocityRende类中,阅读源代码后发现这个调用render()是Jfinal调用的,init也是。不过Jfinal 给留了一个setProperties()方法。于是就想到在可以在项目中动态的添加一个配置就可以了。

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");
    }
}
```

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做过期和重放攻击的过滤。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,422评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • 如何催人还钱 只关注还钱事件,确定还钱时间 如何不漏痕迹的夸别人 1.好厉害,怎么做到的 2.表达自己的同理做不到...
    Super_Anna阅读 242评论 0 0
  • 12年前的今天,二十四节气之一大暑 ,8时31分一个男婴呱呱坠地,开始了他探索人类世界之险。 初当父母,欣喜若狂后...
    玫瑰铿锵阅读 140评论 1 0