路径名中的双磅(##)不能与JRuby'require'一起使用?

时间:2012-01-11 16:11:21

标签: ruby-on-rails tomcat jvm jruby warbler

所以,我正在尝试将我的JRuby on Rails应用程序部署到Tomcat 7.一切正常。

直到我尝试使用Tomcat的并行部署功能,该功能要求上下文/战争名称的格式为name##VERSION.war

第一次尝试在路径中要求一个##的文件时,JRuby对此进行了扼流,并使用以下堆栈跟踪:

org.jruby.rack.RackInitializationException: no !/ in spec
    from file:/opt/apache-tomcat-7.0.23/webapps/my-application##0001/WEB-INF/lib/jruby-rack-1.1.2.jar!/vendor/rack.rb:7:in `(root)'
    from org/jruby/RubyKernel.java:1038:in `require'
    from file:/opt/apache-tomcat-7.0.23/webapps/my-application##0001/WEB-INF/lib/jruby-rack-1.1.2.jar!/vendor/rack.rb:28:in `boot!'
    from file:/opt/apache-tomcat-7.0.23/webapps/my-application##0001/WEB-INF/lib/jruby-rack-1.1.2.jar!/jruby/rack/boot/rack.rb:10:in `Rack'
    from file:/opt/apache-tomcat-7.0.23/webapps/my-application##0001/WEB-INF/lib/jruby-rack-1.1.2.jar!/jruby/rack/boot/rack.rb:8:in `(root)'
    from org/jruby/RubyKernel.java:1063:in `load'
    from file:/opt/apache-tomcat-7.0.23/webapps/my-application##0001/WEB-INF/lib/jruby-rack-1.1.2.jar!/jruby/rack/boot/rack.rb:1:in `(root)'

    at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:206)
    at org.jruby.rack.DefaultRackApplicationFactory.newErrorApplication(DefaultRackApplicationFactory.java:102)
    at org.jruby.rack.DefaultRackApplicationFactory.getErrorApplication(DefaultRackApplicationFactory.java:66)
    at org.jruby.rack.SharedRackApplicationFactory$1.call(SharedRackApplicationFactory.java:33)
    at org.jruby.rack.AbstractRackDispatcher.process(AbstractRackDispatcher.java:30)
    at org.jruby.rack.AbstractFilter.doFilter(AbstractFilter.java:31)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

正如堆栈跟踪所示,它似乎正在爆炸需求。 JRuby可以不处理这种形式的路径吗?有什么方法可以解决这个问题,还是JRuby和Tomcat的命名约定之间的根本冲突?

更新

我将调试器附加到Tomcat,问题一直到java.net.URL解析URL字符串的方式:

new URL("jar:file:/opt/apache-tomcat-7.0.23/webapps/my-app##001/WEB-INF/lib/jruby-rack-1.1.2.jar!/vendor/rack-1.3.6/rack.rb")

这会引发MalformedURLException。但是:

new URL("jar:file:/opt/apache-tomcat-7.0.23/webapps/my-app/WEB-INF/lib/jruby-rack-1.1.2.jar!/vendor/rack-1.3.6/rack.rb")

除了应用程序名称中的##001之外,它是相同的,并且它可以正常工作。

顺便说一下,这些是在JRuby的org.jruby.runtime.load.LoadService第1145行调用的。

那么这有什么后果呢?好吧,首先,看起来Tomcat可能在用于表示名称的字符中做出了一个考虑不周的选择,如果它给URL解析带来麻烦。我不确定JRuby是否可以轻松解决这个问题。

思考,有人吗?

进一步更新

如果URL转义哈希值,则可以使其正常工作。 ##变为%23%23。这需要在JRuby本身修补,但是,我认为。

1 个答案:

答案 0 :(得分:1)

从评论中复制答案,以便从“未答复”过滤器中删除此问题:

  

如果URL转义哈希值,则可以使其正常工作。 ##变为%23%23。这需要在JRuby本身修补,但是,我认为。

     

有关JRuby Jira的错误报告:http://jira.codehaus.org/browse/JRUBY-6339

〜每levand

回答