Wildfly 无法注入价值?

Wildfly Unable to inject value?

我正在尝试获取一个私有的、闭源的 jar 以在 wildfly 服务器上运行。

这是我得到的堆栈跟踪:

2016-03-03 15:57:20,909 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 58) MSC000001: Failed to start service jboss.ra.deployer."eclsconnector.rar": org.jboss.msc.service.StartException in service jboss.ra.deployer."eclsconnector.rar": JBAS010446: Failed to start RA deployment [eclsconnector.rar]
    at org.jboss.as.connector.services.resourceadapters.deployment.ResourceAdapterDeploymentService.run(ResourceAdapterDeploymentService.java:157)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_51]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_51]
    at org.jboss.threads.JBossThread.run(JBossThread.java:122)
Caused by: org.jboss.jca.deployers.common.DeployException: IJ020060: Unable to inject: com.empolis.ecls.server.j2ee.jca.impl.ECLSManagedConnectionFactory property: ECLSPropFile value: /app/CMS/modules/server/config/properties/ecls.prop.jboss
    at org.jboss.jca.deployers.common.AbstractResourceAdapterDeployer.createObjectsAndInjectValue(AbstractResourceAdapterDeployer.java:2038) [ironjacamar-deployers-common-1.1.5.Final.jar:1.1.5.Final]
    at org.jboss.jca.deployers.common.AbstractResourceAdapterDeployer.createObjectsAndInjectValue(AbstractResourceAdapterDeployer.java:1173) [ironjacamar-deployers-common-1.1.5.Final.jar:1.1.5.Final]
    at org.jboss.as.connector.services.resourceadapters.deployment.ResourceAdapterDeploymentService$AS7RaDeployer.doDeploy(ResourceAdapterDeploymentService.java:209)
    at org.jboss.as.connector.services.resourceadapters.deployment.ResourceAdapterDeploymentService.start(ResourceAdapterDeploymentService.java:118)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_51]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_51]

这个异常是什么意思?我应该查看哪些文件以及我应该寻找什么来尝试修复它?我是否有必要反编译一些东西,修改它,然后重新编译,或者这是否表明我在 Wildfly 上配置不正确?

抱歉缺少详细信息。如果您让我知道哪些文件对我有帮助,我可以提供。这只是一个大项目,也是我第一次使用 wildfly,所以我不知道从哪里开始寻找。

当你遇到这个问题时,你应该做的是设置 Byteman。

这需要从此处下载并安装它:http://byteman.jboss.org/,然后将以下内容添加到您的 java_opts:

-javaagent:/path/to/byteman.jar=script:/path/to/bytemanRules.btm,boot:/path/to/byteman.jar,listener:true

/path/to/byteman.jar 的两个位置替换为您的 byteman jar 的路径,并将 /path/to/bytemanRules.btm 的一个位置替换为您的实际规则文件的路径。

如果你有像我这样的堆栈跟踪,那么从 byteman 开始的地方是 ECLSManagedConnectionFactory.setECLSPropFile - 添加规则,以便它在进入、退出或从该方法抛出时记录到文件.下一步是反编译 class.

找到class文件(jar/war/ear/rar文件都是zip文件——很容易打开),然后反编译。 IntelliJ 内置了一个反编译器。使用反编译后的 class 来弄清楚它调用的一些方法是什么。回到 byteman,根据你看到它调用的方法添加规则(使用 AT INVOKEAFTER INVOKE),找出它的去向和卡住的地方。

最后一个可能有用的技巧是将 -verbose:class 添加到您的 java_opts。这会导致 Java 吐出它加载的每个 jar 的完整路径,以及它在每个 jar 中找到的 classes。

最终我的上述问题 - 完全不可能通过单独查看此堆栈跟踪来确定 - 是我在不同的罐子中有不同版本的单个 class 。 ECLSManagedConnectionFactory.setECLSPropFile 调用的东西本意是与 class 的一个副本对话,但却与 class 的另一个副本对话...这导致了问题。

我无法提供更具体的帮助,但希望这个简短的工具和技术列表能为您提供一个有用的起点,让您可以使用 Wildfly 调试此问题和其他问题(甚至 Java 一般...这里没有什么是真正特定于 Wildfly 的。)