标签: contextclassloader

如何从classloader获取classpath?

我正在使用一些第三方代码,当给出'-classpath'命令行参数时,不设置java.class.path,而只是创建一个类加载器,将命令行指定类路径上的项的所有url添加到类加载器,然后将其设置为上下文类加载器.在我编写的这段代码的插件类中,我得到了这个类加载器的一个实例,并且不知何故需要使用它来获取底层的类路径,以便我可以在JavaCompiler.getTask的调用中使用它(... )并动态编译其他代码.但是,似乎没有从ClassLoader获取ClassPath,并且由于java.class.path未设置,我似乎无法访问最初调用应用程序的基础类路径...任何想法?

java classloader contextclassloader

47
推荐指数
4
解决办法
6万
查看次数

为什么Clojure默认使用Context Classloader?

为什么默认情况下use-context-classloader设置为true?

为什么Clojure不使用当前的类加载器?

clojure classloader contextclassloader

17
推荐指数
1
解决办法
2208
查看次数

Thread.getContextClassLoader()== null?

可以Thread.getContextClassLoader()为空吗?javadoc并不是很清楚.
图书馆应该考虑这个案例吗?

更新:我问的原因是,beansbinding.dev.java.net不是在这种情况下工作(和我的代码呢setContextClassLoader(null)

java classloader contextclassloader

7
推荐指数
2
解决办法
3518
查看次数

如何安全地解决此Java上下文类加载器问题?

我的数百名用户中只有一个在启动Java桌面应用程序时遇到问题.只有三分之一的时间才开始.另外三分之二的时间在启动时抛出NullPointerException:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.util.Hashtable.put(Hashtable.java:394)
    at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1327)
    at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1309)
    at javax.swing.JEditorPane.loadDefaultKitsIfNecessary(JEditorPane.java:1387)
    at javax.swing.JEditorPane.getKitTypeRegistry(JEditorPane.java:1344)
    at javax.swing.JEditorPane.getEditorKitClassNameForContentType(JEditorPane.java:1340)
    at javax.swing.JTextPane.<init>(JTextPane.java:76)
    at myapp.Launcher$1.run(Launcher.java:13)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:633)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Run Code Online (Sandbox Code Playgroud)

我已经按照堆栈跟踪找到原因

Thread.currentThread().getContextClassLoader()
Run Code Online (Sandbox Code Playgroud)

在JEditorPane中返回null.

谷歌搜索显示,这是一个零星的,非常罕见的,神秘的问题,影响了一些人.

我的问题是,作为一种解决办法,我能做些什么?如果我在创建EditorPane之前调用它,这可能会有效:

Thread.currentThread().setContextClassLoader(MyClass.class.getClassLoader());
Run Code Online (Sandbox Code Playgroud)

但我并不像我想的那样真正理解类加载器(并且我试图更好地理解它们).我觉得改变EDT中的contextClassLoader可能会产生不良影响.

任何想法我能做什么?

编辑:我与熟悉Java ClassLoaders的人有一些通信.这似乎是一个模糊的ClassLoader竞争条件.也就是说,Java中的一个错误.

java classloader contextclassloader

7
推荐指数
1
解决办法
2242
查看次数

了解Thread.currentThread().getContextClassLoader().getResourceAsStream()

我正在看一个代码示例,我不确定这意味着什么.

Thread.currentThread().getContextClassLoader()
    .getResourceAsStream("MyProperty.properties");
Run Code Online (Sandbox Code Playgroud)

看起来它正在寻找一个属性文件,但我不确定MyProperty.properties位于何处.

感谢您的帮助.

java classloader contextclassloader

7
推荐指数
1
解决办法
2万
查看次数

使用什么类加载器?

关于班级装载机,我有几个问题.

Class.forName("class.name");
Run Code Online (Sandbox Code Playgroud)

....
NotYetLoadedClass cls = new NotYetLoadedClass();
.....
Run Code Online (Sandbox Code Playgroud)

在每种情况下将使用哪些类加载器?对于第一种情况,我假设用于加载方法代码正在执行的类的类加载器.在第二种情况下,我假设线程上下文类加载器.

如果我错了,我会很感激.

java classloader contextclassloader

6
推荐指数
1
解决办法
1434
查看次数

并行流在tomcat升级后不设置Thread.contextClassLoader

在tomcat从8.5.6升级到8.5.28后,并行流停止为contexts提供contextClassLoader:

因为它Warmer::run无法在其中加载类.

warmers.parallelStream().forEach(Warmer::run);
Run Code Online (Sandbox Code Playgroud)

你有什么想法Tomcat为新线程提供contextClassLoaders的东西吗?

ParallelStream在最新的Tomcat中使用ForkJoinPool.

java contextclassloader forkjoinpool tomcat8 java-stream

6
推荐指数
2
解决办法
824
查看次数

自定义Tomcat Webapp ClassLoader

我正在尝试为tomcat实现自定义类加载器.我的第一次尝试产生了类强制转换异常(显然,tomcat尝试将我的加载器强制转换为org.apache.catalina.loader.WebappLoader).好吧,我扩展了WebappLoader并将catalina.jar添加到我的构建路径中.

现在我准备好部署(我想).我收到这个错误:

严重:Catalina.start:LifecycleException:start :: java.lang.NoClassDefFoundError:org/apache/catalina/loader/WebappLoader

Tomcat带有catalina.jar来运行,所以我99.9%肯定它已经加载到tomcat中.我通过检查/server/lib/catalina.jar验证了这一点,它包含了apache WebappLoader.此外,正如预期的那样,手动链接另一个catalina.jar会产生一大堆问题.

我糊涂了.任何提示都会很热.

谢谢!

更新:有趣的是,tomcat6上的相同内容(扩展WebappLoader;在tomcat5.5上运行)仍会导致ClassCastException.听起来像执行演员表的类是使用与加载我的类的装载器不同的加载器加载的.我不知道我怎么能控制它,除非在某处可能有另一个丢失的tomcat配置?对tomcat6有什么想法吗?

java tomcat classloader contextclassloader tomcat6

4
推荐指数
1
解决办法
4086
查看次数