-1

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

我已将一个部署配置文件的上下文路径设置为:/myapp/latest. 生成的用于部署的 URL 如下所示:

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

Tomcat 现在使用一些约定:在 .war 的文件名中,井号被斜线替换(#被替换为/),以构造应用程序的 url。战争被解压缩到一个文件夹,该文件夹的名称是战争的文件名,没有 .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 编码。我在这个问题上找不到太多,只是涉及双哈希的tomcat7的一些类似问题,不幸的是没有任何解决方案。

我可以通过不使用子路径来避免这个问题,但我知道这个应该可以工作:我已经在 grizzly/jersey 项目中使用了相同的方法,没有任何问题。

如何正确设置子路径?有没有办法告诉应用程序不对路径进行编码?tomcat 插件在这里似乎没有提供太多选项,那么有没有办法在 web.xml 或 context.xml 之类的配置文件中设置路径?

4

1 回答 1

1

根据我的评论,我认为这可能是由于 TapestryPlasticInternalUtils.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") 
于 2012-10-20T00:13:03.750 回答