问题标签 [contextclassloader]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1052 浏览

spring - Liferay 服务构建器 JNDI 查找使用了错误的命名上下文

我有一个通过 JNDI 配置的 servicebuilder portlet:

在我的ext-spring.xml中,我尝试使用以下方法提取该值:

但是,InitialContext用于查找此值的 似乎是InitialContextwebapp ROOT(liferay 本身)的 ,因为它包含的唯一内容是java:comp/env/jdbc/LiferayPool数据库连接池。我知道 JNDI 上下文与以下ClassLoader因素相关联:

在运行 portlet 初始化之前,我知道 liferay 与类加载器混为一谈。但对于我的一生,我无法弄清楚如何解决这个问题。有什么建议么?

0 投票
2 回答
410 浏览

java - getResourceAsStream 在一种情况下返回 null 但在另一种情况下不返回,具有相同的类路径

我有同一个应用程序的两个衍生版本,比如版本 (A) 和 (B)。它们每个都包含项目:(1) test-data-war,有target/test-classes/log4j.properties,和 (2) test-kernel,有target/test-classes/log4j.propertiestarget/test-classes/test.properties

当我在 (1) 中运行特定的 jUnit 测试时,它调用 (2) 中的一个方法,该方法调用 Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName);In (A),resourceName作为“log4j.properties”,结果不是空的,具有 (1) 中的路径,而是resourceName作为“test.properties”,它为空。在 (B) 中,使用resourceName(1) 中的路径作为“log4j.properties”时它不为空,使用resourceName(2) 中的路径作为“test.properties”时它不为空。

为什么Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties");(A)中为空?起初,我认为类路径可能不同,但 (1) 和 (2) 是相同的。

编辑: 这是(1)的 .classpath 文件的样子:

这是 (2) 的 .classpath 文件的样子:

0 投票
0 回答
36 浏览

java - 如何让不同的 Web 应用程序共享相同的类加载器?

我们有一套应用程序。就像现在一样,每个应用程序都可以单独部署,也可以任意组合部署。问题是每场战争都是用自己的图书馆副本构建的。许多(很多)在每场战争中重复。

我知道如果我们将库放在 Tomcat 的公共区域,它们都可以共享这些资源。但是,有没有办法让每个应用程序在启动时检查另一个应用程序是否已经加载了它试图加载的类,如果另一个应用程序有,使用这些而不是重新加载它自己的版本?

0 投票
0 回答
110 浏览

java - 未从 URLClassloader 加载依赖的 jar 类

我有一个应用程序正在运行,我正在读取 JAR 文件列表并使用加载每个 jar,URLClassLoader但同时Class从一个 JAR 加载一个 JAR 引用来自不同 JAR 的另一个类NoClassDefError

我总是NoClassDefError在加载Demo类时得到,因为它指的是Demo2不同 JAR 中的类。

有人可以帮忙吗?

0 投票
1 回答
1078 浏览

java - 父子类加载器类解析

任务和初步调查

我尝试在一个 java swing 应用程序的缓存实例附近设置两个 Oracle Coherence。可以在这里找到解决方案的想法。我的情况有点复杂,这就是游戏开始的地方。

简短的介绍

就我而言,有一个帐户服务。它可以有两个端点:SIT 和 UAT。为了创建两个这样的服务,我需要加载 Coherence 的两个“实例”,以便用系统变量 ( tangosol.coherence.cacheconfig ) 覆盖端点。

我有:

  • 应用程序的主要代码位于 mainapp.jar 中;
  • 位于 account-interfaces.jar 中的AccountService接口;
  • 位于 account-impl.jar 中并实现AccountService接口的AccountServiceImpl类;
  • 我的主要应用程序具有以下结构

尝试的方法

我创建了一个专用的子类加载器 - InverseClassLoader,并将 AppLaunchClassLoader(默认的 Thread.currentThread().GetContextClassLoader() 类加载器)设为父级。使用 InverseClassLoader 我加载 AccountServiceImpl 类:

问题和疑问

  1. 我得到“AccountServiceImpl 无法转换为 AccountService”异常,这意味着这两个类由不同的类加载器加载。但是那些类加载器是父子关系。所以即使一个类是由父类(接口 - '抽象'类型)加载的,它也不能与子类加载器加载的类(具体 impl)一起使用,这对吗?那么为什么我们需要这种父子关系呢?
  2. 我在代码中指定了 AccountService 接口,它由默认的类加载器加载。我尝试将上面的代码包装为一个线程并将 InverseClassLoader 设置为上下文类加载器。没有改变。那么我不能使用这样的接口实现编码(如通常的编码)并且需要一直使用反射来调用具体方法是对的吗?(希望有解决方案);
  3. 比如说,我列出了由 InverseClassLoader 加载的 AccountService 和 AccountServiceImpl 类。如果我需要这两个可以访问的其他类也由 InverseClassLoader 加载怎么办?有没有办法说所有“相关”类必须由同一个类加载器加载?

更新

这是 InverseClassLoader:

0 投票
1 回答
654 浏览

java - Thread.setContextClassLoader 可以设置一个不同于 getCCL 返回的 ClassLoader 吗?

背景:

最近我实现了一段代码,它将为特定操作设置适当的ClassLoader,并在操作完成后最终恢复原来的ClassLoader。

例如:

根据getContextClassLoader()文档,返回的 null 可能意味着两件事。1) 系统 CL 或 2) 如果获取 sys CL 失败,则引导 CL。

返回:此线程的上下文 ClassLoader,或 null 指示系统类加载器(或者,如果失败,则为引导类加载器)

根据setContextClassLoader(Classloader cl)文档,如果提供了空 CL,则 1)系统 CL 或 2)如果设置 sys CL 失败,则引导 CL。

cl - 此线程的上下文 ClassLoader,或 null 指示系统类加载器(或者,如果失败,则为引导类加载器)


问题:

是否有可能使用上面的 try-finally-restore 编程模型,我最终会在线程上使用与最初开始时不同的 ClassLoader?

例如:

setContextClassLoader(null)在我们从 Bootstrap CL 开始以及当我们尝试使用System CL 恢复时,情况也可能相反。两种情况都有可能吗?

0 投票
2 回答
82 浏览

tomcat - 使用类加载器从 tomcat lib 实例化 tomcat WEB-INF\class\myclass

我正在尝试从tomcat lib中的jar中的类加载tomcat中war文件中存在的类。我正在使用 Class.forname("myclass") 执行此操作,但应用程序正在抛出类未找到异常。我想这是因为 webapp 将有自己的类加载器。有人可以建议如何解决这个问题

0 投票
1 回答
151 浏览

java - 在 OSGi 框架中使用 Esper

我想在 OSGi 框架中使用 Esper,但是我不确定 OSGi 中的类加载机制将如何实现我需要实现的目标,甚至不确定如何在 OSGi 中使用 Esper。

我使用的是 Esper 5.3,并且在检查捆绑清单时它不使用Dynamic-ImportOSGi 标头。Esper 的核心是 EPStatements,我理解它是在 POJO 上运行的 SQL 查询。

我正在努力理解的是 Esper 捆绑包如何访问它们,它不使用动态导入并且不知道将来可能会被引导操作哪些 POJO。

例如,如果我尝试创建 EPStatement:

select * com.example.Pojo

如果 com.example.Pojo 类在 Esper 核心的另一个包中,那么唯一Pojo可以加载的方法是使用它的ClassLoader。这可以通过以下方式完成:

但这不只是加载Pojo到包含 Pojo 本身的包的类空间中吗?在创建上述示例 EPStatement 时,Esper 包如何获得对它的访问权限。

0 投票
0 回答
274 浏览

java - Tomcat 7 - JAAS 领域无法访问 Web 应用程序类文件

在过去的 3 周里,我一直在为这个问题绞尽脑汁,因为我没有源代码,所以我尽量用最简单的术语来解释它。

  1. 平台

. 雄猫 7
. 窗口服务器 2008
。JRE 7

  1. 使用 Tomcat JAAS 领域

在 Web 应用程序 META-INF/context.xml 中定义。

  1. 这是困难的部分,因为我没有源代码。

我有 WEB-INF/classes/a123 & b123 类文件

. 此类 a123 使用 logincontext
。logincontext 定义了一些配置
。我相信这个配置文件是 JAAS 领域的一部分,需要访问 b123。

问题。找不到类 b123。

我相信这个问题是Tomcat JAAS领域在Tomcat服务器上并且找不到b123,因为b123在webappsclassloader下。

所以你可以在我的 context.xml 中看到,我确实设置了 useContextClassLoader="true",我认为默认情况下它是 webappsclassloader。

我尝试将 b123 放在当时可以工作的 Tomcat 启动类路径中,但现在我相信我有 2 个 b123 副本。

. Tomcat服务器下的b123
。webappsclassloader下的b123

我认为这里的问题是类加载层次结构中较高的类试图访问较低层次结构中的 Web 应用程序类。根据类加载委托的工作方式,这肯定会失败。所以我能想到的唯一方法是使用线程上下文类加载器。

正如您在 context.xml 中看到的那样,我确实将 useContextClassLoader 设置为“true”。但是由于我无权访问源代码,如何通过 Tomcat 配置设置上下文类加载器?我猜想在 JAAS 领域使用上下文类加载器之前需要设置上下文类加载器。

任何帮助都会很棒!

0 投票
0 回答
16 浏览

android - 当应用程序从 activityA 转到 activityB 时,如何获取调用者类的名称?

我需要一个从当前活动中获取调用者类名称的函数。其实我想知道,如何通过 getClassLoader 函数获取调用者类的名称。

顺便说一句,这是我之前的问题,但我没有得到任何可接受的答案。 这里