现在,我将 Web 应用程序升级到了 Java 8,在 Tomcat 8 中运行的 axis Web 服务遇到了奇怪的类加载问题。
安装 Web 应用程序后第一次调用 Web 服务将导致 RuntimeException 和“在类路径中找不到编译器!(您可能需要添加 'tools.jar')”错误。
以下对该 Web 服务的所有调用都可以正常工作(显然 tools.jar 还在吗?)。
通过删除部署目录中展开的 webapp 文件夹可以重现该行为。下次tomcat启动后,第一次调用又会失败。如果分解的文件夹已经存在,则重新启动 tomcat 不会导致该错误。
当 tomcat/webapp 仍在使用 Java 7 运行时,不会发生该错误。
现在,轴心国的错误已经有很长很长的传统了。早期的解决方案是将tools.jar复制到tomcats lib目录中(又名使tools.jar在tomcats类路径中可用)。默认情况下它不存在,因为 axis 显然是使用 JRE 运行的(即使您在 JAVA_HOME 中使用 JDK 启动 tomcat)。
遗憾的是这没有帮助。我尝试了几种方法将tools.jar放入tomcats类路径中:
- 我将其添加到libs文件夹中
- 我通过 setenv.bat 将其添加到类路径中
- 我将其添加到认可的 lib 文件夹中
没有任何帮助,第一次通话仍然失败。
然后我尝试了 JAVA_HOME 和 JRE_HOME。 Tomcat 尽可能以 JRE 启动,并且仅在使用某些需要 JDK 的功能时才使用 JDK。我尝试让 tomcat 使用 JDK 而不是 JRE,但错误仍然存在。
那么,提问时间:
tomcat爆webapp.war时类加载与
如果战争在早期的服务器运行中已经爆发了?
启动时,tomcat 会将以下内容写入日志文件:
服务器版本:Apache Tomcat/8.0.15
服务器建成:2014年11月2日 19:25:20 UTC
服务器号:8.0.15.0
操作系统名称:Windows Server 2008 R2
操作系统版本:6.1
架构:x86
JAVA_HOME:C:\Dev\Java\jdk1.8.0_25\jre
JVM版本:1.8.0_25-b18
JVM 供应商:Oracle 公司
CATALINA_BASE: C:\Dev\apache-tomcat-8.0.15
CATALINA_HOME: C:\Dev\apache-tomcat-8.0.15
命令行参数:-Djava.util.logging.config.file=c:\Dev\apache-tomcat-8.0.15\conf\logging.properties
命令行参数:-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
命令行参数:-Djava.endorsed.dirs=c:\Dev\apache-tomcat-8.0.15\endorsed
命令行参数:-Dcatalina.base=c:\Dev\apache-tomcat-8.0.15
命令行参数:-Dcatalina.home=c:\Dev\apache-tomcat-8.0.15
命令行参数:-Djava.io.tmpdir=c:\Dev\apache-tomcat-8.0.15\temp
所以显然它以某种方式获得了对 JRE 的引用(尽管我只指定了 JDK,请参见上文)。我怎样才能改变这一点?
- 更多想法?
Edit2:罪魁祸首是 axis 第一次调用 Web 服务时编译的 .jws 文件。这些编译文件的存在是错误仅在第一次调用时发生的原因。
当然,这根本不能解释为什么第一次调用因“编译器丢失”错误而失败虽然创建必要的编译文件并可用于后续调用...
Edit:根据请求的轴错误的堆栈跟踪。与此处处理丢失的tools.jar 的所有其他主题相比,没有什么特别的:
java.lang.RuntimeException:在类路径中找不到编译器! (您可能需要添加“tools.jar”)
在 org.apache.axis.components.compiler.Javac.compile(Javac.java:156)
在 org.apache.axis.handlers.JWSHandler.setupService(JWSHandler.java:199)
在 org.apache.axis.handlers.JWSHandler.invoke(JWSHandler.java:72)
在 org.apache.axis.strategies.InitationStrategy.visit(InitationStrategy.java:32)
在 org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
在 org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
在 org.apache.axis.server.AxisServer.invoke(AxisServer.java:249)
在 org.apache.axis.transport.http.QSMethodHandler.invokeEndpointFromGet(QSMethodHandler.java:129)
在 org.apache.axis.transport.http.QSMethodHandler.invoke(QSMethodHandler.java:94)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在 java.lang.reflect.Method.invoke(Method.java:483)
在 org.apache.axis.transport.http.AxisServlet.processQuery(AxisServlet.java:1226)
在 org.apache.axis.transport.http.AxisServlet.doGet(AxisServlet.java:249)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
在 org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
在 javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
在org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
在 org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2407)
在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2396)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
在 java.lang.Thread.run(Thread.java:745)