2012-10-19 34 views
-1

我正在使用maven-tomcat-plugin在tomcat6服務器上部署tapestry應用程序。部署過程正常,但現在我需要多次使用不同的路徑進行生產/開發/測試/等。環境,這是通過使用maven配置文件。Tapestry url編碼tomcat的webapp路徑

我已將一個部署配置文件的上下文路徑設置爲:/myapp/latest。該URL生成用於部署如下所示:

http://example.com:8080/manager/deploy?path=%2Fmyapp%2Flatest&update=true 

的Tomcat現在使用的一些約定:哈希跡象得到由斜線代替(#得到由/代替)在的.war文件的文件名,來構建應用程序的URL 。戰爭解壓縮到一個文件夾,該文件夾的名稱是沒有.war擴展名的war文件名。

應用程序無法啓動,原因似乎是從日誌很清楚:

Caused by: java.io.FileNotFoundException: /var/lib/tomcat6/webapps/myapp%23latest/WEB-INF/classes/de/myapp/services/AppModule.class (No such file or directory) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(FileInputStream.java:120) 
    at org.apache.tapestry5.internal.plastic.PlasticInternalUtils.getStreamForPath(PlasticInternalUtils.java:408) 
    at org.apache.tapestry5.internal.plastic.PlasticInternalUtils.readBytecodeForClass(PlasticInternalUtils.java:370) 

/var/lib/tomcat6/webapps/myapp%23latest/不存在的路徑,它應該是當然的/var/lib/tomcat6/webapps/myapp#latest/%23是一個散列符號,所以我想在某個時候它得到了url編碼。我在這個問題上找不到太多的東西,只是一些similiar issue對於涉及雙重哈希的tomcat7,不幸的是沒有任何解決方案。

我可以通過不使用子路徑避免這個問題,但我知道這個應該工作:我已經在灰熊/澤西項目中使用同樣的方法沒有任何問題。

如何正確設置子路徑?有什麼辦法可以告訴應用程序不對路徑進行編碼嗎? tomcat插件在這裏似乎沒有提供太多的選項,那麼有什麼方法可以在像web.xml或context.xml這樣的配置文件中設置路徑嗎?

+0

我相信'在/ var/lib中/ tomcat6中/ webapps /下的myapp%23latest /'不會獲得創建作爲日誌意味着錯誤發生在應用程序的初始化過程中,而不是發現問題。我想知道'getStreamForPath'是否爲該路徑應用了不正確的轉義 –

回答

1

除了我的評論,我認爲這可能是由於在Tapestry的PlasticInternalUtils.getStreamForPath方法中的錯誤。在這裏你會發現:

if (url.getProtocol().equals("file")) 
    { 
     String urlPath = url.getPath(); 
     String decoded = urlPath.replaceAll("%20", " "); 
     return new FileInputStream(new File(decoded)); 
    } 

所以空間被處理,但其他轉義序列不是。我建議提交一個bug,並期待與所有轉義序列來構建自己的Tapestry版本解碼使用:

URLDecoder.decode(urlPath, "UTF-8")