JRuby on RailsアプリケーションをTomcat 7に配備しようとしています。すべて正常に動作します。パス名の二重引用符(##)がJRubyの「require」で動作しないのですか?
私はTomcatのParallel Deployment機能を試してみるまで、context/war名は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の命名規則の間に根本的な矛盾がありますか?
UPDATE
私は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行で呼び出されます。
これはどのような影響がありますか?まあ、1つは、URL解析に問題がある場合、Tomcatが名前を示すために使用する文字の選択肢が不適切と思われるようです。 JRubyがこれを簡単に回避できるかどうかはわかりません。
思考、誰ですか?
FURTHER UPDATE
あなたはハッシュをURLエスケープ場合はそれを動作させることができます。 ##は%23%23になります。これはJRuby自体にパッチを当てる必要がありますが、私は思っています。
より証拠あたりの答え:私はWEBrickにを使用してローカルでアプリケーションを実行すると、すべてが正常に動作します。私が宝石を##記号を含むディレクトリに入れると、物事が壊れます。 – levand
単純なスクリプトとrequireステートメントで##の問題に絞った再現可能なテストケースを作れますか? –
Hm。最小限のテストスクリプトで動作します。 Tomcatクラスローダーともっと複雑なやりとりが必要です。私は調査を続けます。 – levand