Tomcat如何设置处理HTTP请求的线程的上下文类加载器?

时间:2019-02-15 17:36:04

标签: java hibernate tomcat classloader

战争被部署到Tomcat 8.5.27。在此部署期间,实体类会动态添加到类路径上的import tensorlow # Below is the error message ImportError Traceback (most recent call last) ~/envs/egpu/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow.py in <module> 40 sys.setdlopenflags(_default_dlopen_flags | ctypes.RTLD_GLOBAL) ---> 41 from tensorflow.python.pywrap_tensorflow_internal import * 42 from tensorflow.python.pywrap_tensorflow_internal import __version__ ~/envs/egpu/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py in <module> 27 return _mod ---> 28 _pywrap_tensorflow_internal = swig_import_helper() 29 del swig_import_helper ~/envs/egpu/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py in swig_import_helper() 23 try: ---> 24 _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description) 25 finally: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/imp.py in load_module(name, file, filename, details) 241 else: --> 242 return load_dynamic(name, filename, file) 243 elif type_ == PKG_DIRECTORY: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/imp.py in load_dynamic(name, path, file) 341 name=name, loader=loader, origin=path) --> 342 return _load(spec) 343 ImportError: dlopen(/Users/besanhalwa/envs/egpu/lib/python3.6/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so, 10): Library not loaded: @rpath/libcublas.8.0.dylib Referenced from: /Users/besanhalwa/envs/egpu/lib/python3.6/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so Reason: image not found During handling of the above exception, another exception occurred: ImportError Traceback (most recent call last) <ipython-input-1-d6579f534729> in <module> ----> 1 import tensorflow ~/envs/egpu/lib/python3.6/site-packages/tensorflow/__init__.py in <module> 22 23 # pylint: disable=wildcard-import ---> 24 from tensorflow.python import * 25 # pylint: enable=wildcard-import 26 ~/envs/egpu/lib/python3.6/site-packages/tensorflow/python/__init__.py in <module> 49 import numpy as np 50 ---> 51 from tensorflow.python import pywrap_tensorflow 52 53 # Protocol buffers ~/envs/egpu/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow.py in <module> 50 for some common reasons and solutions. Include the entire stack trace 51 above this error message when asking for help.""" % traceback.format_exc() ---> 52 raise ImportError(msg) 53 54 # pylint: enable=wildcard-import,g-import-not-at-top,unused-import,line-too-long ImportError: Traceback (most recent call last): File "/Users/besanhalwa/envs/egpu/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow.py", line 41, in <module> from tensorflow.python.pywrap_tensorflow_internal import * File "/Users/besanhalwa/envs/egpu/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 28, in <module> _pywrap_tensorflow_internal = swig_import_helper() File "/Users/besanhalwa/envs/egpu/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 24, in swig_import_helper _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/imp.py", line 242, in load_module return load_dynamic(name, filename, file) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/imp.py", line 342, in load_dynamic return _load(spec) ImportError: dlopen(/Users/besanhalwa/envs/egpu/lib/python3.6/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so, 10): Library not loaded: @rpath/libcublas.8.0.dylib Referenced from: /Users/besanhalwa/envs/egpu/lib/python3.6/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so Reason: image not found Failed to load the native TensorFlow runtime. See https://www.tensorflow.org/install/install_sources#common_installation_problems for some common reasons and solutions. Include the entire stack trace above this error message when asking for help. 文件中。

然后,要求Hibernate 5.1.2加载包含那些实体类的持久性单元。它们被添加到persistence.xml实例中。这是部署日志的摘录,其中显示了此类加载器的转储:

java.net.FactoryURLClassLoader

请注意,上述所有操作似乎都是由[INFO] [talledLocalContainer] 15-Feb-2019 15:03:46.722 INFOS [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ** SEARCHING: generated.com.company.Baz [INFO] [talledLocalContainer] 15-Feb-2019 15:03:46.727 INFOS [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ClassLoader: java.net.FactoryURLClassLoader@701f7082 [INFO] [talledLocalContainer] class generated.com.company.Foo [INFO] [talledLocalContainer] class generated.com.company.Bar (...) [INFO] [talledLocalContainer] class generated.com.company.GooClassLoader: ParallelWebappClassLoader [INFO] [talledLocalContainer] context: webappContext [INFO] [talledLocalContainer] delegate: false [INFO] [talledLocalContainer] ----------> Parent Classloader: [INFO] [talledLocalContainer] java.net.URLClassLoader@45d6cf48 [INFO] [talledLocalContainer] [INFO] [talledLocalContainer] class com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer [INFO] [talledLocalContainer] class javax.ws.rs.core.Application (...) 线程执行的。

稍后,当请求到达Web应用程序时,处理该请求的线程(localhost-startStop-1请参见下面的日志)无法找到http-nio-8080-exec-6下的类。这是此线程类加载器的转储的摘录:

generated.com.company

以下是用于生成转储的代码:

[INFO] [talledLocalContainer] 15-Feb-2019 15:04:18.705 INFOS [http-nio-8080-exec-6] org.apache.catalina.core.ApplicationContext.log  ** SEARCHING: generated.com.company.Foo
[INFO] [talledLocalContainer] 15-Feb-2019 15:04:18.724 INFOS [http-nio-8080-exec-6] org.apache.catalina.core.ApplicationContext.log ClassLoader: ParallelWebappClassLoader
[INFO] [talledLocalContainer]   context: webappContext
[INFO] [talledLocalContainer]   delegate: false
[INFO] [talledLocalContainer] ----------> Parent Classloader:
[INFO] [talledLocalContainer] java.net.URLClassLoader@45d6cf48
[INFO] [talledLocalContainer] 
[INFO] [talledLocalContainer]   class com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer
[INFO] [talledLocalContainer]   class javax.ws.rs.core.Application
(...)

为什么private static void dumpLoadedClasses() { try { ClassLoader myCL = Thread.currentThread().getContextClassLoader(); StringBuilder sb = new StringBuilder(); while (myCL != null) { sb.append("ClassLoader: " + myCL); for (Iterator<Class<?>> iter = list(myCL); iter.hasNext();) { sb.append("\n\t" + iter.next()); } myCL = myCL.getParent(); } log.info(sb.toString()); } catch (Exception e) { log.warn("", e); } } 没有http-nio-8080-exec-6作为上下文类加载器?

1 个答案:

答案 0 :(得分:0)

考虑使用ClassLoader.getParent(),也许他们有共同的祖先