问题标签 [classloading]

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 回答
436 浏览

java - 覆盖 wildfly/jboss 模块中特定 java 类文件的类加载

我想用我自己的自定义覆盖 JBoss/Wildfly 模块中存在的特定 java 类。如果我使用 tomcat 服务器,我需要做的就是将自定义的类文件放在 WEB-INF/classes 中。由于 WEB-INF/classes 中的类优先于 WEB-INF/lib 下特定 jar 文件中的类文件。Wildfly 服务器有没有类似的方法可用?

0 投票
1 回答
355 浏览

eclipse - 不能在 Eclipse 产品中使用 Wink 1.2.1 作为 JAX RS 实现

我目前正在编写一个包含嵌入式码头的 Eclipse 产品。嵌入式码头正在封装一个眨眼应用程序。我通过将库包装为 Eclipse 插件并使用来自轨道内部版本号的 JAX RS 1.1.1 捆绑包,在 eclipse 产品中使用 wink 1.2.1 孵化:R20151221205849。

最初,当我运行我的 Eclipse 产品时,我遇到了以下异常:

java.lang.NullPointerException at org.apache.wink.common.internal.http.Accept.valueOf(Accept.java:139) at org.apache.wink.server.internal.contexts.HttpHeadersImpl.getAcceptHeader(HttpHeadersImpl.java:152 ) 在 org.apache.wink.server.internal.registry.ResourceRegistry.filterByProduces(ResourceRegistry.java:558) 在 org.apache.wink.server.internal.contexts.HttpHeadersImpl.getAcceptableMediaTypes(HttpHeadersImpl.java:106) 在 org. org.apache.wink.server.internal.registry.ResourceRegistry.findSubResourceMethod(ResourceRegistry.java:391) 在 org.apache.wink 的 apache.wink.server.internal.registry.ResourceRegistry.filterDispatchMethods(ResourceRegistry.java:482)。 server.internal.handlers.FindResourceMethodHandler.handleSubResourceMethod(FindResourceMethodHandler.java:168) 在 org.apache.wink.server.internal.handlers。FindResourceMethodHandler.handleRequest(FindResourceMethodHandler.java:110) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java: 22) 在 org.apache.wink.server.internal.handlers.FindRootResourceHandler.handleRequest(FindRootResourceHandler.java:95) 在 org.apache. .wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 在 org.apache.wink.server.handlers.AbstractHandlersChain .doChain(AbstractHandlersChain.java:63) 在 org.apache.wink.server.internal.handlers.HeadMethodHandler。org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 的 handleRequest(HeadMethodHandler.java:53) org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)在 org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) 在 org.apache.wink.server.internal.handlers.OptionsMethodHandler.handleRequest(OptionsMethodHandler.java:46) 在 org.apache.wink .server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 在 org.apache.wink.server.handlers.AbstractHandlersChain.doChain (AbstractHandlersChain.java:63) 在 org.apache.wink.server.internal.handlers.SearchResultHandler.handleRequest(SearchResultHandler.java:33) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 在 org.apache.wink 的 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26) .server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) 在 org.apache.wink.server.internal.log.ResourceInvocation.handleRequest(ResourceInvocation.java:92) 在 org.apache.wink.server.handlers.RequestHandlersChain .handle(RequestHandlersChain.java:26) 在 org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 在 org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63) ) 在 org.apache.wink.server.handlers.RequestHandlersChain 的 org.apache.wink.server.internal.log.Requests.handleRequest(Requests.java:76)。org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22) 处的句柄(RequestHandlersChain.java:26) org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:63)在 org.apache.wink.server.handlers.AbstractHandlersChain.run(AbstractHandlersChain.java:48) 在 org.apache.wink.server.internal.RequestProcessor.handleRequestWithoutFaultBarrier(RequestProcessor.java:207) 在 org.apache.wink.server .internal.RequestProcessor.handleRequest(RequestProcessor.java:154) 在 org.apache.wink.server.internal.servlet.RestServlet.service(RestServlet.java:119) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java :790) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429) 在 org.eclipse.jetty.server 的 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086) .handler.ContextHandler.doScope(ContextHandler.java:1020) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) 在 org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection .java:154) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 在 org.eclipse.jetty.server.Server.handle(Server.java:366) 在 org.eclipse。 jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494) 在 org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971) 在 org.eclipse.jetty.server。AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231)在 org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 在 org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196) 在 org.eclipse.jetty.io.nio .SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool. java:608) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231) 的 parseNext(HttpParser.java:640) org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 的 org.eclipse .jetty.io.nio.SslConnection.handle(SslConnection.java:196) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint $1.run(SelectChannelEndPoint.java:53) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java :543)org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231) 的 parseNext(HttpParser.java:640) org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 的 org.eclipse .jetty.io.nio.SslConnection.handle(SslConnection.java:196) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint $1.run(SelectChannelEndPoint.java:53) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java :543)SslConnection.handle(SslConnection.java:196) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java :53) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)SslConnection.handle(SslConnection.java:196) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java :53) org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)

这个答案:https ://stackoverflow.com/a/20402681/5907194表明原因是另一个 jax rs 实现与 wink 发生冲突。

事实上,在 JAX RS 中调查 FactoryFinder.find(String factoryId, String fallbackClassName) 后发现 JAX RS 回退到默认球衣实现,因为类加载器无法从 META-INF 加载 JAX RS 类实现的名称/services/javax.ws.rs.ext.runtimeDeletage 文件位于我捆绑的 wink 通用 eclipse 插件中。

我怀疑这是 osgi 类加载的问题,因为 JAX RS 插件的类加载器无法看到 JAX RS 不依赖的插件中的资源。因此,我将我机器上的 JAX RS 插件的 Eclipse 伙伴策略(http://www.wickedshell.net/blog/2010/01/fragments-vs-buddy-classloading/)更改为“Eclipse-BuddyPolicy:已注册”并使用 "Eclipse-RegisterBuddy: javax.Ws.rs Require-Bundle: javax.Ws.rs" 向 JAX RS 注册了 Wink 通用插件。

现在异常被避免了,产品可以正常运行了。现在我的问题如下:是否需要更改轨道上的 JAX RS 插件才能与其他 JAX RS 实现(例如 wink)一起使用,或者我缺少其他选项?

请考虑到我不能升级到 JAX RS 2.0 也不能使用不同的 JAX RS 实现,因为我使用的是依赖于 wink 的 OSLC4J。

0 投票
1 回答
1197 浏览

jsf - 将 deltaspike 添加到现有的 primefaces maven 项目后出现 WELD 类加载问题

我是 primefaces 和 deltaspike 的新手,我们最初尝试使用 CDI 对话,但不得不退回到 deltaspike。我添加了https://deltaspike.apache.org/documentation/configure.html#config-maven-indep中提到的罐子, 但我遇到了 FacesMessages 的类加载问题。我不知道如何解决这个问题。以下是日志和 pom 文件。

11:05:14,065 INFO [org.jboss.weld.Bootstrap](焊接线程池 -- 1)WELD-000119:未从 org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeFacesContextWrapper 生成任何 bean 定义,因为基础类加载错误:找不到类型 [未知]。如果这是意外情况,请启用调试日志记录以查看完整错误。

造成的:

造成的:

我知道这是根本原因
java.lang.LinkageError: Failed to link javax/faces/application/FacesMessage (Module "javax.faces.api:main" from local module loader @66133adc (finder: local module finder @7bfcd12c (roots: C:\Users\amoram\jbossstudio10\runtimes\jboss-eap\modules,C:\Users\amoram\jbossstudio10\runtimes\jboss-eap\modules\system\layers\base))): loader constraint violation: loader (instance of org/jboss/modules/ModuleClassLoader) previously initiated loading for a different type with name "javax/faces/application/FacesMessage"
这是我在 C:\Users\amoram\jbossstudio10\runtimes\jboss-eap\modules\system\layers\base\javax\faces\api\main 下的 modules.xml 的内容和它还有我的 jboss-jsf-api_2.2_spec-2.2.12.redhat-1.jar


这是我的 ejb 模块 pom.xml 的片段

以下是来自 Parent pom 的片段

我想附上我完整的 pom.xml 文件,但不知道怎么做,它们太大了,无法像我上面做的 modules.xml 那样添加它们。有人可以指导我吗?

0 投票
1 回答
12474 浏览

java - Java 类存在于类路径中,但启动失败并出现错误:无法找到或加载主类

我有一个foobar.jar包含以下两个类的 jar 文件:

另一个类如下所示:

如果我使用以下命令执行程序,程序将按预期运行并打印Foo

但是如果我尝试使用类中的 main 方法启动程序Bar,JVM 会打印一个启动错误并退出:

这与我尝试使用不在 jar 中的类启动程序相同的错误,例如

为什么我会收到此错误?该Foo.main方法可以启动并且我能够Bar从 jar 中反编译该类的事实证明,该类应该在类路径上可用。我意识到这可能与接口ItemProcessor不在类路径上有关。java.lang.ClassNotFoundException但在那种情况下我不应该得到一个吗?

0 投票
1 回答
28 浏览

java - 从 Java 类加载器查看加载的属性文件

Jar1 有一个属性文件名 abc.properties,Jar2 也有相同的文件 abc.properties。像这样我有100多个罐子。是否有任何机制可以了解从哪个 jar 加载 abc.properties。

我知道它是基于类路径的优先级。但我想知道加载 abc.properties 的 jar 的名称。

是否有任何类加载器挂钩可以找到相同或任何可能有帮助的工具。

该应用程序部署在 weblogic 中。如果需要,我也可以部署在 Tomcat 中。

0 投票
1 回答
137 浏览

hibernate - JBoss 6.4 类加载

我有一个包含多个 .war 的 .ear,我想将它部署到 jboss 6.4.7 服务器中。问题是其中一个 .war 正在使用 jboss 的模块 (hibernate-jpa-2.0),但该应用程序需要 hibernate-jpa-2.1 版本。如何告诉我的战争不使用这个 jboss 模块。我在 Ear/application/META-INF 中添加了一个 jboss-deployment-structure 并带有以下排除项:

但不工作..

“javax.persistence.api”写在 jboss 服务器上的 module.xml 中。

谢谢你的帮助。

0 投票
0 回答
225 浏览

jakarta-ee - Java EE 中的静态初始化在 parentfirst/parentlast 类加载策略之间有所不同,至少在 Websphere Liberty 中是这样

我在 Websphere Liberty / JEE 7 中发现了一个有趣的、可能是错误的行为,我喜欢讨论这是一个错误还是一个特性。

首先,所描述的代码是我接手的一个较旧的项目,而且代码并不总是最好的或最好的方式来做某事。所以让我们进入正题:有一个实用程序jar,其中包含一个ServletContextListener。侦听器以这种方式执行 log4j 初始化,当第一次加载类时,它有一个导致 log4j 初始化的最终静态变量。

maven 构建生成两个 WAR,其中每个 WAR 包含包含 ServletContextListener 的实用程序 jar。请参阅下图以查看 EAR 的结构:

我的 EAR 结构

这意味着我有两个包含相同实用程序 jar 的 webapps,其中包含一个像这样的静态初始化程序:

这是我的观点:当我使用标准类加载器策略(parentfirst)在 Liberty 上部署它时,静态初始化只发生一次!使用 parentLast Policy 时,静态初始化会发生两次。

我和一位同事讨论过这个问题,他首先说,没关系。但越想越觉得,这种行为其实是错误的。没有办法,webapp-1 找到任何属于 webapp-2 的类,反之亦然。这就是为什么必须为每个 webapp 分别进行静态初始化(即类加载)的原因。无论哪种类加载策略,因为 Liberty 没有自己的 log4j.jar。

那么,类加载器策略与它有什么关系呢?在我看来,这应该与此无关。

你怎么看?它是 Liberty 中的一个错误,是设计/意图(请解释)还是它是什么?

请注意,我不是在寻找解决方案,有很多。我只是感兴趣,其他开发人员如何看待这个话题。

这个问题似乎只影响类的静态成员。因为 log4j 初始化是静态的,所以 log4j 是为每个 webapp 初始化还是只初始化一次(首先加载的 webapp)。

您可以通过使用来自单独 jar 的实用程序类来检查这一点,该 jar 具有静态初始化的静态成员。使用 parentFirst 策略,它只会被初始化一次。这不应该,阿飞明白。

********** 加法,灵感来自 Andy McWright ***** parentFirst: [25.07.17 15:24:39:405 MESZ] 00000063 id=40ad88b3 lassloading.internal.ContainerClassLoader$SmartClassPathImpl > getUniversalContainersForPath Entry
[user.dir].m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar [25.07.17 15:25:02:880 MESZ] 00000063 id=0f48e3d8 com.ibm.ws.classloading.internal.AppClassLoader > findOrDelegateLoadClass Entry
org.apache.log4j.Logger

parentLast: [25.07.17 15:46:38:580 MESZ] 00000064 id=1d3c9ea4 lassloading.internal.ContainerClassLoader$SmartClassPathImpl > getUniversalContainersForPath Entry
[user.dir].m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar, [25.07.17 15:46:20:471 MESZ] 00000064 id=70f6cf68 com.ibm.ws.classloading.internal.ParentLastClassLoader > loadClass Entry
org.apache.log4j.Logger [25.07.17 15:46:20:471 MESZ] 00000064 id=70f6cf68 com.ibm.ws.classloading.internal.AppClassLoader > findClass Entry
org.apache.log4j.Logger [25.07.17 15:46:20:471 MESZ] 00000064 id=70f6cf68 com.ibm.ws.classloading.internal.AppClassLoader > findClassBytes Entry
org.apache.log4j.Logger [25.07.17 15:46:20:471 MESZ] 00000064 id=70f6cf68 com.ibm.ws.classloading.internal.ContainerClassLoader > findBytes Entry
org/apache/log4j/Logger.class [25.07.17 15:46:20:471 MESZ] 00000064 id=1d3c9ea4 lassloading.internal.ContainerClassLoader$SmartClassPathImpl > getByteResourceInformation Entry
org/apache/log4j/Logger.class [25.07.17 15:46:20:471 MESZ] 00000064 id=1d3c9ea4 lassloading.internal.ContainerClassLoader$SmartClassPathImpl > getUniversalContainersForPath Entry
org/apache/log4j/Logger.class


是的,类加载是不同的。问题是,这是正确的吗?我不这么认为,我认为这是一个缺陷。

0 投票
0 回答
36 浏览

jsf - 找出当前 JSF 页面是从哪个 JAR 加载的

我从不同 JAR 文件中的不同 JSF 页面调用 bean 方法。我如何确定(在运行时)从中加载 JSF 页面的 JAR 文件?

在 FacesContext 上是否有可能?我还没有找到任何解决方案。

小例子:

MyBean 应该知道调用页面是来自 A.jar 还是 B.jar

0 投票
3 回答
2125 浏览

java - java.lang 包中的类的 NoClassDefFoundError “错误名称”

我在主机上运行 Cassandra 2.2.11(并且不会升级)。定期,在 cron 作业中,我运行nodetool命令进行监控。nodetool被实现为另一个使用 JMX 与 Cassandra java 进程对话的 java 进程。我每分钟启动五个左右的命令。

偶尔(不是以任何可识别的模式), 的执行nodetool将失败,并带有NoClassDefFoundError引用来自 的类的 a java.lang。例如,

在此堆栈跟踪中,错误发生在FutureTask. 我也看过

但是也

所以它不仅发生在类初始化期间,而且在我收集的几个示例中,反射实现中的某些东西似乎确实是罪魁祸首。

Java 版本为 8

启动器nodetool始终使用相同的类路径。那里没有奇怪的类(或额外的类加载器)。相同的安装在数百个相同的节点上完成(在 Linux 上)。

我的热门搜索结果NoClassDefFoundError wrong name指的是使用简化的类名来启动的执行java,而不是完全限定的名称。这不是这里的问题。此外,错误消息中的名称是相同的。

NoClassDefFoundError那么,什么会导致“引导”类出现这种“错误名称”错误呢?

0 投票
1 回答
1445 浏览

wildfly - 将战争中的类加载到全局类路径中(Wildfly)

我想将一个 war 文件部署到 Wildfly 10 服务器并将一个类公开给全局类路径。我希望能够在其他战争文件中使用这个类。

你知道这在部署时是否可行?

最好的问候亚历克斯