【问题标题】:Different JVM behavior: start tomcat from Eclipse vs start from Catalina.bat不同的 JVM 行为:从 Eclipse 启动 tomcat 与从 Catalina.bat 启动
【发布时间】:2012-06-18 08:29:39
【问题描述】:

我正在维护一个使用 java.protocol.handler 的 Web 应用程序。我用一个值初始化它:-Djava.protocol.handler.pkgs=<my value>。 问题如下: 1.如果我部署应用程序。直接从eclipse到tomcat,使用这个instruction(直接引用Tomcat主类)并在VM参数选项卡中传递-Djava.protocol.handler.pkgs=<my value>参数,应用程序正常工作并初始化-protocol依赖bean。

2.如果我将 .war 文件直接部署到 Tomcat/webapps 并使用 catalina.bat 启动 Tomcat(将 -Djava.protocol.handler.pkgs=<my value> 添加到 JAVA_OPTS)我得到:Malformed URL supplied Exception。 3.如果我从eclipse启动Tomcat(并指定类似于第1点的VM参数。)相同的.war将被正确部署。

我的猜测是 catalina.bat 和 eclipse 初始化 VM 参数的方式不同。或者也许我应该以某种方式将我的项目 .jar 附加到 Tomcat。

感谢您的任何提示。我可以提供更多所需的详细信息

【问题讨论】:

  • 您的详细信息有些粗略 - 您可能应该提供 -Djava.protocol.handler.pkgs=XXX 值,甚至是导致错误的整个 .bat 文件。如果可能,还包括错误的完整详细信息,包括堆栈跟踪。
  • 不幸的是,我无法提供确切的协议名称,但我认为它并不真正相关,因为它在某些情况下有效,这就是我转向 JVM 设置差异的原因。至于 catalina.bat - 它是标准的,Apache Tomcat 6.0.35 中未更改的文件,setenv.bat 文件:set JAVA_OPTS=-Djava.protocol.handler.pkgs= -DJINTEGRA_NATIVE_MODE
  • 错误(不幸的是无法复制堆栈跟踪,因为我使用了一些属性 java 类):属性“configURL”抛出异常;嵌套异常:提供的 URL 格式错误:null。我的猜测是这个错误发生是因为 JVM java.protocol.handler.pkgs 参数没有被初始化,或者在创建依赖它的 bean 之后被初始化,因此 URL 被视为格式错误
  • sry for double post,无法编辑:不幸的是,我无法提供确切的协议名称,但我认为它并不真正相关,因为它在某些情况下有效,这就是我转向 JVM 设置差异的原因。至于 catalina.bat - 它是标准的,Apache Tomcat 6.0.35 中未更改的文件,setenv.bat 文件: set JAVA_OPTS=-Djava.protocol.handler.pkgs= -DJINTEGRA_NATIVE_MODE 我还要提到我使用 maven依赖项下载 java.protocl.handler .jar 和 Spring 以使用 URL 初始化 Bean。其中 URL 采用 格式。
  • 如果没有更具体的信息(您无法提供),您不可能得到任何猜测。

标签: java tomcat jvm


【解决方案1】:

根据 cmets,如果没有更多信息,很难知道发生了什么,但也许这会有所帮助。 Tomcat 调用URL.setURLStreamHandlerFactory 来设置自己的URLStreamHandlerFactory,这会覆盖java.protocol.handler.pkgs 系统属性的默认行为。在不破坏内部 Tomcat 功能的情况下,您不能使用自己的处理程序调用 URL.setURLStreamHandlerFactory。 URLStreamHandlers 系统当然不是 Java 最大的特点。

我发现可靠地使用我自己的流处理程序的唯一方法是将其传递给URL constructor

URL url = new URL( null, "http://example.com", myURLStreamHandler );

【讨论】:

  • 嗨,回到问题上来;总结:内森的解决方案成功了。我很幸运能够为受影响的类请求源代码(因为它的属性设置为 String 值,我不得不更改它)。确实如此:tomcat,如果从 catalina.bat 启动会覆盖用户 java.protocol... 设置。正如另一个线程中提到的,当我尝试使用 Jetty 时,我也遇到了同样的情况。所以一般使用tomcat和jetty的时候java.protocol.handler.pkgs会出现问题。幸运的是,我可以访问源代码。
【解决方案2】:

我们注意到 -Djava.protocol.handler.pkgs="my.protocol" 在 Tomcat 6.0.x 中有效,如果协议实现在 Tomcat lib 文件夹中而不是在战争中......

也许这对其他人有帮助

【讨论】:

  • 我可以解释一下:一旦 URL.handlers 映射添加了一个具体的协议处理程序,就不会再次对其进行重新评估。如果处理程序类出现在 WebApp 类路径中 - 已经为时已晚(除非尝试覆盖目前未请求的外来协议的处理程序,例如 gopher://)。因此,该类应该可以由系统类加载器加载。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2014-04-24
  • 2018-08-25
  • 1970-01-01
相关资源
最近更新 更多