我正在使用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?
答案 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")