【问题标题】:WildFly + java Preferences cannot find custom preferences class in classpathWildFly + java Preferences 在类路径中找不到自定义首选项类
【发布时间】:2016-07-28 07:39:34
【问题描述】:

我正在将具有以下结构的 EAR 部署到 Wildfly 9.0.2

my.ear  
  |-my.sar    (it is a SAR archive)
  |-lib
     |-myPreferencesImpl.jar

我可以直接从 my.sar 加载 lib/myPreferencesImpl.jar 中的类(如 class.forname(com.my.PreferencesFactory)。但是,java.util.prefs.Preferences.factory 无法加载com.my.PreferencesFactory。我在 WildFly 启动期间将 Djava.util.prefs.PreferencesFactory=com.my.PreferencesFactory 作为命令行参数传递。

下面是抛出的异常。

 Caused by: java.lang.ClassNotFoundException: com.my.PreferencesFactory from [Module "org.jboss.as.jmx:main" from local module loader @76a3e297 (finder: local module finder @4d3167f4 (roots: /CSA_wildfly/wildfly/modules,/CSA_wildfly/wildfly/modules/system/layers/base))]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:205)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:455)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:404)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:385)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:130)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at java.util.prefs.Preferences.factory(Preferences.java:254)

请帮我解决这个问题。

更新:
我最终通过将使用 JMX 服务的启动服务迁移到 @Singleton + @Startup EJB 来修复。无需进行其他更改。

【问题讨论】:

    标签: java jakarta-ee jboss wildfly


    【解决方案1】:

    当您在命令行中传递参数 Djava.util.prefs.PreferencesFactory=com.my.PreferencesFactory 时,Wildfly 将在其可用的类中查找类,该类是通过 modules 提供的。在 Wildfly 启动期间,它甚至不会知道存在具有该类的应用程序,它也无法为同一容器上的其他部署提供相同的类。因此,如果您希望命令行 arg 正常工作,请确保 deploy the Factory implementation as a Wildfly module

    【讨论】:

    • 是应用程序 (my.sar) 调用 java.util.prefs.PreferencesFactory 来实例化 com.my.PreferencesFactory。这发生在 Wildfly 启动之后。那为什么不行呢?
    • java.util.prefs.Preferences被初始化之前实际上是没有设置的。所以它应该工作。但是,没有其他部署或任何服务器依赖项能够使用首选项 API,因此它必须位于模块中。在这种情况下,JMX 正在尝试使用首选项 API,但不能。
    • @JamesR.Perkins 您应该将此作为答案发布。
    • 嗯,你的回答是正确的,我只是在澄清一点:)
    • 请记住,没有其他应用程序能够使用首选项 API。
    猜你喜欢
    • 1970-01-01
    • 2022-06-13
    • 2011-09-11
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多