(本文档仅供参考)
进入【系统监控】-》【线程】,点击会出现【未指定错误】Caused by: java.lang.NoClassDefFoundError: Could not initialize class sun.tools.attach.LinuxVirtualMachine
详细错误日志如下:
at smartbi.framework.rmi.ClientService.execute(Smartbi:134) at ...(...) at smartbi.freequery.migrate.ExportLog.exportThreadDumpByAttach(ExportLog.java:692) Caused by: java.lang.NoClassDefFoundError: Could not initialize class sun.tools.attach.LinuxVirtualMachine at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:46) at smartbi.freequery.migrate.ExportLog.exportThreadDumpByAttach(ExportLog.java:692) at smartbi.freequery.migrate.ExportLog.exportThreadDumpInfo(ExportLog.java:477) at smartbi.management.LocalManagementHandler.getCurrentThreadDumpInfo(LocalManagementHandler.java:338) at smartbi.management.ManagementService.getCurrentThreadDumpInfo(ManagementService.java:159) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at smartbi.framework.rmi.ClientService.execute(Smartbi:118) at smartbi.framework.rmi.RMIServlet.processExecute(RMIServlet.java:199) at smartbi.framework.rmi.RMIServlet.doPost(RMIServlet.java:143) at javax.servlet.http.HttpServlet.service$WTImpl$javax$servlet$http$HttpServlet(HttpServlet.java:727) at javax.servlet.http.HttpServlet.service(HttpServlet.java) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) at smartbi.extension.ExtensionFilter$2.doFilter(ExtensionFilter.java:138) at smartbi.extension.ExtensionFilter$1.doFilter(ExtensionFilter.java:127) at smartbi.extension.ExtensionFilter.doFilterInternal(ExtensionFilter.java:150) at smartbi.extension.ExtensionFilter.doFilter(ExtensionFilter.java:53) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) at smartbi.framework.rmi.TransactionFilter.doFilter(Smartbi:97) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) at smartbi.freequery.filter.GZIPFilter.doFilter(GZIPFilter.java:111) at smartbi.freequery.filter.Filter.doFilter(Filter.java:36) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) at smartbi.freequery.filter.CheckIsLoggedFilter.doFilter(CheckIsLoggedFilter.java:99) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) at smartbi.freequery.filter.TraceFilter.doFilter(TraceFilter.java:59) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209) at weblogic.work.ExecuteThread.run(ExecuteThread.java:178 |
原因:这是因为无法正常调用产品内置的tools.jar包,需要通过调用jdk上的tools.jar解决。
具体解决方案:
1、首先需要将war包里边自带的tool.jar移除,用压缩工具打开smartbi.war ,注意不是解压,然后找到 \smartbi\WEB-INF\lib\tool.jar ,进行删除。
2、通过weblogic控制台卸载smartbi应用,然后再重新将这个删除了tool.jar的smartbi.war包部署到weblogic上。
3、如果删除了war包上的tool.jar包后重新部署后,验证下在weblogic加载的jdk下的tool.jar包能否被正常调用 (一般jdk的tool.jar包是在JDK的lib目录下,这里是放到了JDK的bin目录):
重启后,直接进入【系统监控】--》【类查找】:sun.tools.attach.LinuxAttachProvider
然后再点击【线程】看是否可以正常打印:
如果可以,就不需要进行下边步骤了。下次更新包的时候,记得删除掉war包里边的tool.jar重新部署即可。
如果还是不行,那就按照以下步骤继续修改。
4、找到weblogic的启动文件 startWebLogic.sh ,记得备份。然后对这个文件如下部分进行修改,
修改部分如下,红色字体部署就是指定JDK引用的tools.jar路径:
echo "starting weblogic with Java version:"
${JAVA_HOME}/bin/java ${JAVA_VM} -version
CLASSPATH="${CLASSPATH}:/home/jdk1.8.0_144/bin/tools.jar"
注意为了保证tools.jar可以正常被调用,所以需要修改下tool.jar的权限:
然后保存,并重启weblogic,然后再重新进入系统监控看【类查找】能否找到这个指定的路径:sun.tools.attach.LinuxAttachProvider
以及验证【系统监控】--》【线程】能否正常打印,
如果可以正常找到tools.jar,并且可以正常打印线程,说明成功指定jdk调用的tools.jar包。
离线文档:weblogic指定jdk加载的tools.docx