gpt4 book ai didi

java - tools.jar 丢失 - 但仅在第一次调用时(Tomcat 8/Java 8/Axis)

转载 作者:行者123 更新时间:2023-11-30 03:35:38 25 4
gpt4 key购买 nike

现在我将 Web 应用程序升级到了 Java 8,在 Tomcat 8 中运行的 axis Web 服务遇到了奇怪的类加载问题。

安装 Web 应用程序后首次调用 Web 服务将导致 RuntimeException 和“在类路径中找不到编译器!(您可能需要添加 'tools.jar')”错误。

接下来对该 Web 服务的所有调用都可以正常工作(显然 tools.jar 确实存在吗?)。

通过删除部署目录中展开的 webapp 文件夹可以重现该行为。下次tomcat启动后,第一次调用又会失败。如果展开的文件夹已经存在,则重新启动 tomcat 不会导致错误。

当 tomcat/webapp 仍在使用 Java 7 运行时,不会发生该错误。

现在, Axis 心国的错误有着悠久的传统。早期的解决方案是将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,但错误仍然存​​在。

那么,提问时间:

  1. tomcat爆webapp.war时类加载与普通的有什么区别如果 war 在早期的服务器运行中已经爆发了?

  2. 启动时,tomcat 会将以下内容写入日志文件:

Server version: Apache Tomcat/8.0.15
Server built: Nov 2 2014 19:25:20 UTC
Server number: 8.0.15.0
OS Name: Windows Server 2008 R2
OS Version: 6.1
Architecture: x86
JAVA_HOME: C:\Dev\Java\jdk1.8.0_25\jre
JVM Version: 1.8.0_25-b18
JVM Vendor: Oracle Corporation
CATALINA_BASE: C:\Dev\apache-tomcat-8.0.15
CATALINA_HOME: C:\Dev\apache-tomcat-8.0.15
Command line argument: -Djava.util.logging.config.file=c:\Dev\apache-tomcat-8.0.15\conf\logging.properties
Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
Command line argument: -Djava.endorsed.dirs=c:\Dev\apache-tomcat-8.0.15\endorsed
Command line argument: -Dcatalina.base=c:\Dev\apache-tomcat-8.0.15
Command line argument: -Dcatalina.home=c:\Dev\apache-tomcat-8.0.15
Command line argument: -Djava.io.tmpdir=c:\Dev\apache-tomcat-8.0.15\temp

所以显然它以某种方式获得了对 JRE 的引用(尽管我只指定了 JDK,请参见上文)。我怎样才能改变它?

  • 还有更多想法吗?
  • 编辑2:罪魁祸首是 axis 第一次调用 Web 服务时编译的 .jws 文件。这些编译文件的存在是错误仅在第一次调用时发生的原因。

    当然,这根本不能解释为什么第一次调用会因“编译器丢失”错误而失败,即使创建了必要的编译文件并可用于后续调用......

    编辑:根据请求的 Axis 错误的堆栈跟踪。与此处处理丢失的tools.jar 的所有其他主题相比,没有什么特别的:

    java.lang.RuntimeException: No compiler found in your classpath! (you may need to add 'tools.jar')
    at org.apache.axis.components.compiler.Javac.compile(Javac.java:156)
    at org.apache.axis.handlers.JWSHandler.setupService(JWSHandler.java:199)
    at org.apache.axis.handlers.JWSHandler.invoke(JWSHandler.java:72)
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
    at org.apache.axis.server.AxisServer.invoke(AxisServer.java:249) at org.apache.axis.transport.http.QSMethodHandler.invokeEndpointFromGet(QSMethodHandler.java:129)
    at org.apache.axis.transport.http.QSMethodHandler.invoke(QSMethodHandler.java:94)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.apache.axis.transport.http.AxisServlet.processQuery(AxisServlet.java:1226)
    at org.apache.axis.transport.http.AxisServlet.doGet(AxisServlet.java:249)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
    at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:277)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2407)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2396)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

    最佳答案

    我得到的堆栈跟踪中的实际消息是原始发布者的消息,但前面有此消息。

    看起来编译器返回的值与预期不同,但编译仍然完成并引发异常。这是来自 http://www.docjar.org/html/api/org/apache/axis/components/compiler/Javac.java.html

    136             if (modern) {
    137 int compilationResult =
    138 ((Integer)compile.invoke(compiler, new Object[]
    139 {
    140 toStringArray(fillArguments
    141 (new ArrayList()))})).intValue();
    142
    143 result = (compilationResult == 0);
    144 log.debug("Compilation Returned: "
    145 + Integer.toString(compilationResult));
    146 }
    147 else {
    148 Boolean ok =
    149 (Boolean)compile.invoke(compiler, new Object[]
    150 {toStringArray(fillArguments(new ArrayList()))});
    151
    152 result = ok.booleanValue();
    153 }
    154 } catch (Exception cnfe){
    155 log.error(Messages.getMessage("noCompiler00"), cnfe);
    156 throw new RuntimeException(Messages.getMessage("noCompiler00"));


    5-Apr-2015 20:16:42 ERROR 160663 [http-nio-10470-exec-10] org.apache.axis.components.compiler.Javac.compile(Javac.java:155) - No compiler found in your classpath! (you may need to add 'tools.jar')
    java.lang.ClassCastException: com.sun.tools.javac.main.Main$Result cannot be cast to java.lang.Integer
    at org.apache.axis.components.compiler.Javac.compile(Javac.java:137)
    at org.apache.axis.handlers.JWSHandler.setupService(JWSHandler.java:199)
    at org.apache.axis.handlers.JWSHandler.generateWSDL(JWSHandler.java:294)
    at org.apache.axis.strategies.WSDLGenStrategy.visit(WSDLGenStrategy.java:33)
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
    at org.apache.axis.SimpleChain.generateWSDL(SimpleChain.java:104)
    at org.apache.axis.server.AxisServer.generateWSDL(AxisServer.java:454)
    at org.apache.axis.transport.http.QSWSDLHandler.invoke(QSWSDLHandler.java:68)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.axis.transport.http.AxisServlet.processQuery(AxisServlet.java:1226)
    at org.apache.axis.transport.http.AxisServlet.doGet(AxisServlet.java:249)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
    at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

    更新

    我已经更改了代码axis-1_4\src\org\apache\axis\components\compiler\Javac.java 如下所示,因为原始代码需要 JDK 8 之前的编译器的整数。 JDK 8 返回一个枚举。我只在本地副本上执行此操作并重新构建并且工作正常。

    // Call the compile() method

    Method compile = c.getMethod("compile",

    new Class [] { String[].class });

    if (modern) {

    log.info("Using modified axis for jdk 8 compiler");
    Object compilationResult = (compile.invoke(compiler, new Object[]

    {
    toStringArray(fillArguments
    (new ArrayList()))}));

    result = ("OK".equalsIgnoreCase(compilationResult.toString()));
    log.debug("Compilation Returned: "+ compilationResult);
    }

    关于java - tools.jar 丢失 - 但仅在第一次调用时(Tomcat 8/Java 8/Axis),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27965823/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com