Tapestry url编码tomcat的webapp路径

时间:2012-10-19 15:21:24

标签: tomcat tomcat6 tapestry

我正在使用maven-tomcat-plugin在tomcat6服务器上部署tapestry应用程序。部署过程运行良好,但现在我需要使用不同的路径多次部署它以进行生产/开发/测试/等。环境,这是一个使用maven配置文件。

我已将一个部署配置文件的上下文路径设置为:/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?

1 个答案:

答案 0 :(得分:1)

继我的评论之后,我认为这可能是由于Tapestry的PlasticInternalUtils.getStreamForPath方法中存在错误。在这里你会发现:

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

因此处理空格但其他转义序列则不处理。我建议提交一个错误,并建立自己的Tapestry版本,并使用以下方法解码所有转义序列:

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