tools.jar丢失-但仅在第一次调用时(tomcat8/java8/axis)

6ss1mwsb  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(481)

现在我已经将我的webapp升级到java8,我在tomcat8中运行的axis webservice遇到了奇怪的类加载问题。
安装webapp后对webservice的第一次调用将导致runtimeexception和“在类路径中找不到编译器(您可能需要添加'tools.jar')“错误。
下面所有对该webservice的调用都正常工作(显然tools.jar到底在那里?)。
通过删除deploy目录中分解的webapp文件夹,可以复制该行为。在下一次tomcat启动之后,第一次调用将再次失败。如果分解的文件夹已经存在,tomcat重启不会导致错误。
当tomcat/webapp仍在使用java7运行时,没有发生此错误。
现在,轴误差有一个很长很长的传统。早期的解决方案是将tools.jar复制到tomcats lib目录中(即使tools.jar在tomcats类路径中可用)。默认情况下它不在那里,因为axis显然是用jre运行的(即使您在javahome中用jdk启动tomcat)。
可悲的是,这没有帮助。我尝试了几种将tools.jar放入tomcats类路径的方法:
我把它添加到libs文件夹
我通过setenv.bat将它添加到类路径中
我把它添加到了认可的lib文件夹中
没有任何帮助,第一个电话仍然失败。
然后我玩了javaèu home和jreèu home。tomcat尽可能从jre开始,只有在使用一些需要jdk的函数时才使用jdk。我试图让tomcat使用jre的jdk instad,但是错误仍然存在。
提问时间:
当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\u主页:c:\dev\java\jdk1.8.0\u 25\jre
jvm版本:1.8.0\U 25-b18
jvm供应商:oracle corporation
catalina_库:c:\dev\apache-tomcat-8.0.15
catalina\u主页: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.approved.dirs=c:\dev\apache-tomcat-8.0.15\approved
命令行参数:-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第一次调用webservice时编译的.jws文件。这些编译文件的存在是错误只在第一次调用时发生的原因。
当然,这根本不能解释为什么第一次调用会失败并出现“compiler missing”错误,即使创建了必要的编译文件,并且可以用于后续调用。。。
编辑:根据请求跟踪轴错误。与这里处理丢失的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.invocationstrategy.visit(invocationstrategy。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.invokeendpointfromformget(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(方法。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(http11aprotocol.html)。java:277)
在org.apache.tomcat.util.net.aprependpoint$socketprocessor.dorun(aprependpoint。java:2407)
在org.apache.tomcat.util.net.aprependpoint$socketprocessor.run(aprependpoint。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(线程。java:745)

wmomyfyw

wmomyfyw1#

我也遇到过同样的问题,在花了好几个小时试图解决它并重新配置我的类路径上百次之后……看来我找到了解决方案,至少一个适合我的情况。
您提到的错误,如果您将jdk版本从1.8更改为1.7,它似乎会消失!!

7kqas0il

7kqas0il2#

加载类有什么区别
没什么区别。
也许有些文件是在 work 第一次运行时web应用程序的目录。
启动时,tomcat将以下内容写入日志文件:
java\u主页:c:\dev\java\jdk1.8.0\u 25\jre
这个信息就是 System.getProperty("java.home") ,由versionloggerlistener记录。
这就是JavaLauncher(java.exe)的工作原理。这与tomcat本身无关。
一个简单的java程序:

public class Test {
  public static void main(String[] a){
    System.out.println("java.home: "  + System.getProperty("java.home"));
    System.out.println("java.class.path: "  + System.getProperty("java.class.path"));
    System.out.println("sun.boot.class.path: "  + System.getProperty("sun.boot.class.path"));
  }
}

用jdk运行它会打印jdk的jre的路径,而不是jdk的路径。引导类路径只列出jre库(这里没有tools.jar)。
注意,还可以通过jconsole、jvisualvm检查系统属性。
更多的想法?
将tools.jar显式添加到类路径。
如果从*.bat文件启动tomcat,可以在setenv.bat中设置classpath变量。
如果要将其作为服务启动,请使用服务配置应用程序(tomcat8w.exe)来配置类路径。
如果您是从ide中启动它,请在ide中配置java设置。
我把它添加到libs文件夹
我希望这能奏效。也许除了tools.jar之外,还需要其他一些jdk jar。
我通过setenv将它添加到类路径中。
我把它添加到了认可的lib文件夹中
只有在使用标准的*.bat文件启动tomcat时,以上两点才起作用。如果您将其作为服务或从ide中启动,那么服务/ide设置很重要。setenv.bat文件不被他们使用。
这也取决于axis如何检测到这个问题。我希望它尝试加载一些类(而不是尝试查找特定的jar文件)。关于原始信息的更多细节(什么组件记录它?stacktrace?源代码?)

pqwbnv8z

pqwbnv8z3#

我得到的堆栈跟踪中的实际消息是原始海报旁边的消息,但前面有这个消息。
看起来编译器返回的值与预期值不同,但编译仍会完成并引发异常。这是从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\u 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);
        }

相关问题