tools.jar缺失 - 但仅在第一次调用时(Tomcat 8 / Java 8 / Axis) [英] tools.jar missing - but only on the very first call (Tomcat 8/Java 8/ Axis)

查看:630
本文介绍了tools.jar缺失 - 但仅在第一次调用时(Tomcat 8 / Java 8 / Axis)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

现在我将我的webapp升级到Java 8,我遇到了一个奇怪的类加载问题,它是一个在Tomcat 8中运行的轴web服务。

Now that I upgraded my webapp to Java 8, I'm running into strange classloading problem with an axis webservice that is running in Tomcat 8.

第一个在安装webapp之后调用webservice将导致RuntimeException和在类路径中找不到编译器!(您可能需要添加'tools.jar')fault。

The very first call to the webservice after installing the webapp will cause a RuntimeException and a "No compiler found in your classpath! (you may need to add 'tools.jar')" fault.

对该webservice的所有后续调用都正常工作(显然,tools.jar毕竟在那里?)。

All following calls to that webservice work correctly (apparently tools.jar is there after all?).

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

The behaviour is reproducable by deleting the exploded webapp folder in the deploy directory. After the next tomcat start, the first call will fail again. If the exploded folder is already there, a tomcat restart does not cause the error.

当tomcat / webapp仍在使用Java 7运行时,没有发生错误。

The error did not occur when tomcat/the webapp were still running with Java 7.

现在,Axis错误有着漫长的传统。早期的解决方案是将tools.jar复制到tomcats lib目录(在tomcats类路径中可用的Aka make tools.jar)。它默认不存在,因为轴显然是用JRE运行的(即使你在JAVA_HOME中使用JDK启动tomcat)。

Now, that Axis error has a long, long tradition. The solution in earlier times was to copy tools.jar into tomcats lib directory (Aka make tools.jar available in tomcats classpath). Its not there by default, because axis apparently runs with a JRE (even if you start tomcat with a JDK in JAVA_HOME).

可悲的是,这没有帮助。我尝试了几种方法将tools.jar放入tomcats classpath:

Sadly that did not help. I tried several ways to put tools.jar into tomcats classpath:


  • 我将它添加到libs文件夹中

  • 我通过setenv.bat将它添加到类路径中

  • 我将它添加到背书的lib文件夹中

没有帮助,第一次调用仍然失败。

None helped, the very first call was still failing.

然后我玩了JAVA_HOME和JRE_HOME。 Tomcat尽可能以JRE开头,如果您使用某些需要JDK的函数,则只使用JDK。我试图让tomcat使用JRE的JDK instad,但错误仍然存​​在。

I then played around with JAVA_HOME and JRE_HOME. Tomcat starts with a JRE whenever possible and only uses a JDK if you use some functions that need a JDK. I tried to get tomcat to use a JDK instad of a JRE, but the error persistet.

所以,提问时间:


  1. 当tomcat爆炸webapp.war时,与早期服务器运行中战争爆炸的
    情况相比,类加载的区别是什么?

  1. Whats the difference in classloading when tomcat explodes a webapp.war compared to the case that the war has already been exploded in an earlier server run?

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

When starting, tomcat writes the following to the logfile:




服务器版本: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 Corporation

CATALINA_BASE:C:\ Dev @\\ apache-tomcat-8.0.15

CATALINA_HOME:C:\ Dev @\\ apache-tomcat-8.0.15

命令行参数:-Djava.util.logging.config.file = c:\ Devv \ 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:\ Devv \ 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

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,见上文)。我该怎么改变?

so apparently it got itself a reference to the JRE somehow (although I only specified a JDK, see above). How can I change that?


  1. 更多想法?

Edit2:
罪魁祸首是在第一次调用webservice时轴执行的.jws文件的编译。这些编译文件的存在是错误仅在第一次调用时发生的原因。

The culprit is the compilation of .jws files that axis does the first time a webservice is called. The existence of those compiled files is the reason the error only happens on the very first call.

当然,这并不能解释为什么第一次调用失败了'编译器缺少'error 即使创建了必要的编译文件,并且可用于后续调用......

Of course that does not explain at all why the first call fails with the 'compiler missing' error even though the necessary compiled files are created and are available for subsequent calls...

编辑:请求的轴错误的堆栈跟踪。与处理缺少tools.jar的所有其他主题相比没什么特别的.jar:

Stacktrace of the axis error as requested. Nothing special compared to all the other topics here that deal with a missing tools.jar:


java.lang.RuntimeException:找不到编译器你的班级路径! (您可能需要添加'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(原生方法)

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)

在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)< br>
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)

在java.lang.Thread.run(Thread.java:745)

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)


推荐答案

我得到的堆栈跟踪中的实际消息是原始海报的实际消息,但前面是这个消息。

The actual message in the stack trace I get is the one by the original poster but preceded by this one.

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

Looks like the compiler is returning a different value than expected but the compilation still gets done and an exception is thrown. This is from 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 \编译器\ Javac.java到下面作为原始代码期望JDK 8前编译器的整数。 JDK 8正在返回一个枚举。我只在我的本地副本上完成此操作并重新构建并正常工作。

Update

I have changed the code in axis-1_4\src\org\apache\axis\components\compiler\Javac.java to the below as the original code is expecting an integer for pre JDK 8 compilers. JDK 8 is returning an enum. I have only done this on my local copy and re-built and works fine.

// 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);
        }

这篇关于tools.jar缺失 - 但仅在第一次调用时(Tomcat 8 / Java 8 / Axis)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆