Jfinal使用Velocity視圖部署到tomcat上velocity.log (Permission denied)解決

原由:

本身在搭建一個關於 EVE Online 遊戲 的網站,框架用的是Jfinal的,頁面模板用的是velocity,在本身開發環境上一切正常,而後部署到線上環境後出現錯誤。線上的環境是Ubuntu14+Nginx+Mysql+Tomcat。html

錯誤:

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

定位:

網上也有相似許多的問題,也有分析,我就不細說。總結起來就是:web

  • 1.使用時沒有設置velocity log的任何參數,由於系統中存在Log4j的包,因此會使用Log4jChute作爲Log記錄的對象返回。ajax

  • 2.在初始化Log4jChute時,沒有設置logger.name,初始化Logger時,會使用默認的velocity.log作爲文件輸出路徑sql

  • 3.File file = new File("velocity.log"),是基於當前jvm的current work,也就是user.dir屬性。apache

而我又是將運行web跑在普通用戶權限,可是安裝tomcat是Root,因此權限出錯。 因此第一次訪問網站頁面的時候當渲染頁面時候,Velocity就會嘗試創建日誌,可是因爲上面的問題沒法建立。tomcat

解決方案

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");我這裏是直接關閉了輸出。

##總結: 這樣以前的線上服務器的錯誤就解決了。可是其實我並不以爲處理這個問題的方法這樣是最好的,我以爲應該仍是能夠設置配置文件進行設置的。框架

記錄這個問題的解決方法我也是想給本身作個拋磚引玉的提示。jvm

##感謝: @jfinal Jfinal框架真的挺方便的,不少時候我本身在作小項目是否開發起來很是的快,真的很是感謝做者。固然上面的解決問題的看法也是我我的很是淺顯的看法甚至有多是錯誤的,但願你們不要見笑,我也在一邊的開發,一遍閱讀其代碼,再次感謝。 ##最後: 也想分享下本身的這個網站,可是網站還沒好,就不發了。

主要的框架就是Jfinal,整個網站都是經過Api來獲取數據的。頁面只是顯示一點靜態的資料,甚至能夠直接用html來代替,全部數據都是經過ajax來獲取請求的,驗證時用簽名驗證,時間戳+token作過時和重放攻擊的過濾。

有個問題想請教下你們,關於前段你們都是怎麼寫的,我都是一個個代碼敲得感受很累,不知道怎麼開發是簡單快捷的。

相關文章
相關標籤/搜索