现在我已经将我的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)
3条答案
按热度按时间wmomyfyw1#
我也遇到过同样的问题,在花了好几个小时试图解决它并重新配置我的类路径上百次之后……看来我找到了解决方案,至少一个适合我的情况。
您提到的错误,如果您将jdk版本从1.8更改为1.7,它似乎会消失!!
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程序:
用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?源代码?)
pqwbnv8z3#
我得到的堆栈跟踪中的实际消息是原始海报旁边的消息,但前面有这个消息。
看起来编译器返回的值与预期值不同,但编译仍会完成并引发异常。这是从http://www.docjar.org/html/api/org/apache/axis/components/compiler/javac.java.html
更新
我已经将axis-1\u 4\src\org\apache\axis\components\compiler\javac.java中的代码更改为以下内容,因为原始代码要求jdk 8之前的编译器使用整数。jdk 8正在返回枚举。我只做了我的本地副本和重建,工作良好。