问题标签 [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 投票
2 回答
2917 浏览

java - OpenJdk 初始启动时间很慢

我在服务器上运行 openjdk 11.0.3。每当服务器重新启动(每晚):对于我的应用程序的第一次初始启动,用户必须等待 35 秒才能启动应用程序。(在从 main 方法编写第一个 System.out.println 之前。)(尽管后续启动非常快)我尝试了以下选项来调试它:

以下是最重要的发现:

为什么在加载 java.security.NoSuchAlgorithmException 和 jdk.internal.logger.DefaultLoggerFinder 之间会挂起 23 秒?那么其他几秒钟的减速呢?

编辑:根据评论,我会澄清一些。这是一个 Windows rdp 服务器。实际上,它不止一台服务器,但问题仍然存在于所有服务器上。该应用程序是一个独立的应用程序。所以每天早上都会出现问题,因为登录启动应用程序的用户会在“没有任何反应”时尝试多次启动它。我现在尝试重新启动其中一台服务器很多次,这就是我发现的:

重新启动后使用 java11 启动我的应用程序在第一个 System.out.println 之前平均需要 40 秒。然后在我的第一个 JFrame 显示之前只有 1-2 秒。重新启动后使用 java8 (sun) 启动我的应用程序在第一个 System.out.println 之前平均需要 16 秒。但是在我的第一个 JFrame 显示之前,我会延迟 25 秒。在已经使用 java8 启动之后使用 java11 启动我的应用程序平均需要 4-6 秒。

0 投票
1 回答
108 浏览

spring - 多模块Maven应用程序中的类加载问题

我有多模块 Maven 应用程序。在父 pom 所在的主目录中,我有一些模块。我正在添加另一个与其他模块相同级别的模块。该应用程序是打包为 EAR 并部署到 Websphere 中,此 EAR 配置为使用共享库,该库基本上是一个包含 jar 的目录。在这个共享库中,Apache Crimson 被一些模块使用。我正在添加基于 Spring Framework 4.0.0.RELEASE 的新模块。整个项目是一个遗留项目,使用 Java 6 和 Hibernate 2.1 :( 。问题是这个 Crimson 使我的新模块在部署过程中崩溃:

BeanDefinitionStoreException:解析器配置异常从ServletContext资源解析XML[/WEB-INF/spring/root-context.xml];嵌套异常是 javax.xml.parsers.ParserConfigurationException: Unable to validate using XSD: Your JAXP provider [org.apache.crimson.jaxp.DocumentBuilderFactoryImpl@706b4db8] 不支持 XML Schema。您是否使用 Apache Crimson 在 Java 1.4 上运行?升级到 Apache Xerces(或 Java 1.5)以获得完整的 XSD 支持。

所以我在我的新模块中添加了这个:

但是应用程序仍然从共享库中获取 crimson.jar。我试图从父 pom 中排除这个 crimson.jar,但它仍然是从共享库中获取的。一些其他模块需要 Crimson 被打包为 jar,因此 crimson 存在于 EAR/lib 级别。另一种尝试是更改类加载器顺序以首先从新模块中获取罐子,然后在层次结构中向上(我的新战争模块然后是父耳朵)。但这给了我一些其他的例外。问题是 - 如何在 EAR 模块内的 WAR 模块中不从耳朵级别获取 jar(它也包含在 EAR/lib 中)并且仅从 WAR 级别获取?

0 投票
1 回答
818 浏览

jboss - 如何指定 JBoss WildFly 部署应加载其 lib 模块并导入服务?

我有一个结构如下的 ear 文件,我正试图在 WildFly 17 中部署它:

my-library-jar 包含 META-INF/services 下标准类加载器默认不加载的内容。

我正在尝试使用 services 属性来允许类加载器访问 META-INF/services 目录,但我找不到将库 jar 指定为模块或包含 META-INF/ 的资源的方法服务。

有没有办法做到这一点?这是我尝试过的 [其中一些] 事情的一个例子:

如果可能的话,我宁愿使用部署描述符,而不是修改清单文件的 Dependencies 属性。

这个应用程序非常大并且在 JBoss 5.1 中运行良好,但是证明它的结构很难用新的类加载器来描述。

0 投票
0 回答
116 浏览

java - 加载在一个类中的 Oracle JDBC 驱动程序在同一包中的另一个类中无法访问

我正在开发一个 EAR 应用程序(部署在 WLS 12c 上),它具有为 Oracle 配置和测试 jdbc 连接的功能。因此,在我的 jsp 页面中,用户选择驱动程序为 oracle.jdbc.OracleDriver,输入连接 URL、用户名和密码,然后单击 testConnection。在执行此操作时,应用程序会返回一个错误,说明 java.sql.SQLException:找不到合适的驱动程序
jdbc:oracle:thin:@XXX-xx:1525/YYYY

简要介绍此应用程序中使用的架构:

在应用程序启动时,我们指的是具有所有 JDBC 默认值的 xml,并尝试加载该 xml 中存在的所有受支持的 jdbc 驱动程序。而 oracle.jdbc.OracleDriver 也是其中之一。这种注册是通过一个实用类 JDBCUtil.java 完成的,它有 2 个静态方法:registerDriver(String driverName) 和 isDriverRegistered(String driverName)。

因此,第一次调用 JDBCUtil.registerDriver("oracle.jdbc.OracleDriver") 时,isDriverRegistered 返回 false,在 registerDriver 中,我们调用 class.forName(driverName) 来加载驱动程序。

isDriverRegistered 中的逻辑通过调用 DriverManager.getDrivers 获取向 DriverManager 注册的所有驱动程序的枚举,并检查传递给它的 driverName 字符串是否等于 driver.getClass.getName。

在第一次调用 OracleDriver 的 JDBCUtil 之后,对 OracleDriver 的 registerDriver 的任何后续调用都应跳过 class.forName,因为 isDriverRegistered 应返回 true。但是在添加日志语句和调试时,我注意到每次为 OracleDriver 调用 registerDriver->isDriverRegistered 时,它总是返回 false。调用 DriverManager getDrivers 得到的枚举,从不包含 OracleDriver。

其次,在另一个类 JDBCDS.java 中,我们调用 JDBCUtil.registerDriver("oracle.jdbc.OracleDriver") 并且正如预期的那样,在 registerDriver 函数中执行 Class.forName("oracle.jdbc.OracleDriver") 因为 isDriverRegistered 返回 false 。在 JDBCDS.java 中,在调用 registerDriver 之后,我们通过传入 url、用户名和密码来调用 DriverManager.getConnection。这个调用抛出 SQLException 说 NoSuitableDriverFound。

因此,作为另一个调试测试,我在 JDBCDS.java 中调用了 Class.forName("oracle.jdbc.OracleDriver") ,然后调用了 DriverManager.getConnection ,这一次我能够成功建立连接。

我已经在这个论坛上解决了所有与 NoSuitableDriverFound 异常相关的问题,但没有什么适合我的问题。

我试图通过在 JDBCDS.java 中调用 new oracle.jdbc.OracleDriver() 来调用创建驱动程序的新实例,并查看它是否接受我的 url 并且确实如此。此外,这也排除了任何类路径问题。jar 肯定在类路径中。我们的类路径包括以下内容:
com.oracle.db.jdbc7-dms.jar以及 weblogic.jar

com.oracle.db.jdbc7-dms.jar在这两种情况下,内部都有指向 ojdbc8dms.jar 的链接,而 weblogic.jar 内部通过其 MANIFEST.MF 文件的 Class-Path 属性包含了 ojdbc8.jar。

此外,此问题仅适用于特定环境。在具有相同设置的其他环境中,一切正常,没有问题。

从 JDBCUtil.java :

用于注册驱动程序的静态 Util 方法:

查看驱动程序是否已注册的静态方法:

JDBCDS.java 中用于执行测试连接的代码:

JDBCUtil.java 和 JDBCDS.java 都在同一个包中。

谁能指出我可以做些什么来解决这个问题?

0 投票
1 回答
687 浏览

java - Java:扩展类加载器从 Java 13 中的哪里获取类?

我能找到的所有文档都提到了“jre/lib/ext”文件夹,但在我的 JRE 13 安装中不存在这样的文件夹。

我猜想在 Java 8(我可以在 jre/lib/ext 中看到 jar)和 Java 13 之间的某个地方,它们移动了,但我无法确定它是何时以及如何完成的。

有人可以根据扩展类当前所在的位置详细说明新 JRE 的情况吗?

0 投票
1 回答
247 浏览

jboss - 带有 spring-data-jpa 的 ClassCastException

我正在使用 Spring Web Services 和 Spring JPA Data。

我有三个项目:

  • 文档-ws。Web 应用程序,它是我的文档 Web 服务的端点。
  • 标志-ws。Web 应用程序,它是我的签名 Web 服务的端点。
  • 数据-ws。具有所有 jpa 实体 (@Entity)、spring jpa 存储库 (@Repository) 和 spring 服务类 (@Services) 的 Jar 模块。

doc-ws 和 sign-ws 与 data-ws 有依赖关系,所以 doc-ws.war 和 sign-ws.war 中包含了一个 data-ws.jar。

当我单独部署 doc-ws Web 应用程序时,所有 Web 服务测试都可以正常工作。当我单独部署 sign-ws Web 应用程序时,所有 Web 服务测试都可以正常工作。但是,当我在同一个 Jboss EAP 7.1 中同时部署这两个 Web 应用程序时,我在执行 Web 服务测试时遇到了 ClassCastExceptions。

java.lang.ClassCastException:com.ieci.mugeju.data.entity.IdocConfiguration 无法转换为 com.ieci.mugeju.data.entity.IdocConfiguration

异常消息引用了同一个 jpa 实体(com.ieci.mugeju.data.entity.IdocConfiguration),所以我不明白为什么会抛出这个异常。

这一定是两个 Web 应用程序之间的类加载问题,但我不确定。

我正在使用 JBoss EAP 7.1、spring-data-jpa 2.0.5、eclipseling 2.6.4、spring-ws-core 3.0.1。

知道为什么我会收到此异常吗?我该怎么解决?

谢谢

0 投票
0 回答
327 浏览

java - 在生产中不使用 spring-boot 类加载器有什么注意事项吗?

什么

我想用jdk.internal.loader.ClassLoaders$AppClassLoader而不是 spring-boots org.springframework.boot.loader.LaunchedURLClassLoader。但是,我不确定这将如何影响 spring-boot 运行时。

为什么

java.lang.InstantiationError我们最近在 java 中调用 Spring 存储库时遇到了parallelStream(). 我了解到并行流中的线程正在使用AppClassLoader,因此无法找到驻留在类加载器层次结构中LaunchedURLClassLoader的子级中的应用程序类。AppClassLoader

如何

spring-boot 文档显示您可以在不使用类加载器的情况下运行解压缩的 spring-boot jar。这很方便地意味着应用程序类也被加载AppClassLoaderparallelStream().

注意:这也是 Intellij IDEA 运行 spring-boot 应用程序的方式。

问题

谁知道 spring-boot 类加载器所做的不仅仅是启用我应该知道的可执行 jar 和 war 文件。我发现文档不够明确。在生产中不使用 spring-boot 类加载器是否安全?

0 投票
2 回答
197 浏览

java - JBoss 类加载 IncompatibleClassChangeError

我正在将一个项目从 JBoss 5 迁移到 6.4。在此过程中,我更新了构建中的几个 jar 文件。我有几个 ClassCastExceptions,我通过从 JBoss 系统模块中的 jar 中获取特定类的版本并在我的应用程序构建中使用它来解决这些问题。我已经用两个罐子做到了,jbossweb-7.5.26.Final-redhat-1.jar它们分别jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-2.jar包含类org.apache.catalina.connector.Requestjavax.servlet.http.HttpServletRequest。我在我的应用程序构建中使用这两个 jar 作为库,并且所有的编译都没有错误或警告。我已经确认,当我删除这些库时,应用程序无法编译,因为它找不到包含的引用类,所以我知道我实际上并没有在我的构建中引用这些类的其他副本。该应用程序部署良好,但是当我尝试点击它时出现异常

JBWEB001018:请求处理过程中容器发生异常或错误:java.lang.IncompatibleClassChangeError: Class org.apache.catalina.connector.Request 未实现请求的接口 javax.servlet.http.HttpServletRequest

当我在我的编辑器 (JDeveloper 12c) 中查看 jar 中的类定义时,我可以看到org.apache.catalina.connector.Request定义jbossweb-7.5.26.Final-redhat-1在.javax.servlet.http.HttpServletRequestjboss-servlet-api_3.0_spec-1.0.2.Final-redhat-2.jar

我打开了类加载的详细日志记录(JAVA_OPT -verbose:class),并确认当 JBoss 正在加载这两个类时,它们实际上是从这两个 jar 文件中加载的,而不是我不知道的其他一些。我可以在我的开发人员工具中看到,我在项目中包含的 .class 文件来自这两个相同的 jar 文件。

可能相关的是,类加载日志说 JBoss 正在org.apache.catalina.connector.RequestRedHat/JBoss/EAP-6.4.0/modules/system/layers/base/.overlays/layer-base-jboss-eap-6.4.18.CP/org/jboss/as/web/main/. 我不确定它为什么使用该副本/位置而不是RedHat\JBoss\EAP-6.4.0\modules\system\layers\base\org\jboss\as\web\main.

那么给了什么?我在错误中读到的内容会向我建议,它jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-2.jar是针对不同版本的 HttpServletRequest 编译的,而不是jbossweb-7.5.26.Final-redhat-1包含的。

这种解释或错误是否正确?JBoss 6.4 是否真的在其系统模块中附带了不兼容的 jar 文件?如果是这样,我需要这些 jar 的哪些版本以及如何检查兼容性?我可以安全地切换到不同的 jar 文件而不引入更多与其他 jar 的不兼容性吗?我还可能遗漏哪些其他原因?在这里非常感谢任何帮助。

0 投票
2 回答
539 浏览

open-liberty - OpenLiberty 中托管的 Web 应用程序无法通过系统类加载器找到类

我已经在开放的自由中托管了一个 Web 应用程序,我正在尝试类加载一些在 jar 中的第三方 Java 类。我将该文件夹添加为包含 jar 文件的库,并将该库添加为类加载器。但是当我尝试加载它时,我得到了一个找不到类的异常。

此外,当我使用 URLClassLoader 时,它工作得非常好。但我想将 URLClassLoader 更改为 System ClassLoader

我的 server.xml 包含以下几行。

对此高度赞赏的任何帮助。

0 投票
1 回答
125 浏览

java - java - 如何使用Java部署文件夹中的反射类加载来获取带有前缀包的子类?

尝试下面的代码,但它给出的结果为零(subTypesOf 大小为零)。

这里subTypesOf大小为零。但是类文件存在于扩展 com.comp.framework.bean.SuperNumeratorIdEntity 的项目文件夹中

我正在寻找的类如下所示: public class XyzEntity extends SuperNumeratorIdEntity