类加载器问题:IBM WebSphere LibertyBase 中的 GemFire JCA 资源适配器
ClassLoader issues: GemFire JCA Resource Adapter in IBM WebSphere LibertyBase
我正在尝试按照 link 在 IBM WebSphere Liberty 基础上为 Gemfire 9.8 设置 JCA 资源适配器
https://gemfire.docs.pivotal.io/98/geode/reference/archive_transactions/JTA_transactions.html#concept_cp1_zx1_wk
这是我的 ra.xml:
<connector xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
version="1.5">
<display-name>GFE JCA Adaptor</display-name>
<vendor-name></vendor-name>
<spec-version>1.5</spec-version>
<eis-type>GFE JCA</eis-type>
<version>1.5</version>
<resourceadapter>
<config-property>
<config-property-name>ProductName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>GemFire</config-property-value>
</config-property>
<config-property>
<config-property-name>UserName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value/>
</config-property>
<config-property>
<config-property-name>Version</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>8.0</config-property-value>
</config-property>
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>org.apache.geode.internal.ra.spi.JCAManagedConnectionFactory</managedconnectionfactory-class>
<connectionfactory-interface>org.apache.geode.ra.GFConnectionFactory</connectionfactory-interface>
<connectionfactory-impl-class>org.apache.geode.internal.ra.GFConnectionFactoryImpl</connectionfactory-impl-class>
<connection-interface>org.apache.geode.ra.GFConnection</connection-interface>
<connection-impl-class>org.apache.geode.internal.ra.GFConnectionImpl</connection-impl-class>
<transaction-support>LocalTransaction</transaction-support>
<reauthentication-support>false</reauthentication-support>
</connection-definition>
</outbound-resourceadapter>
</resourceadapter>
这是我的资源适配器设置:
<library id="gemfireRaLib" apiTypeVisibility="spec, ibm-api, stable, third-party, api">
<fileset dir="path/to/geode-lib" includes="geode-dependencies.jar"/>
</library>
<resourceAdapter id="gemfireJCA" location="/path/to/geode-lib/geode-jca-9.8.3.rar">
<classloader apiTypeVisibility="spec, ibm-api, stable, third-party, api" commonLibraryRef="gemfireRaLib" delegation="parentFirst"/>
</resourceAdapter>
当我启动我的 liberty 服务器时,spring 引导初始化失败,提示未找到 ClassNotFoundException org.apache.geode.ra.GFConnectionFactory。
然后我把所有的geode依赖作为一个共享库:
<library id="gemfireRaLib" apiTypeVisibility="spec, ibm-api, stable, third-party, api">
<fileset dir="/path/to/geode-lib" includes="geode-dependencies.jar"/>
<fileset dir="/path/to/geode-lib" includes="*.jar"/>
</library>
<resourceAdapter id="gemfireJCA" location="/path/to/geode-jca-9.8.3.rar">
<classloader apiTypeVisibility="spec, ibm-api, stable, third-party, api" commonLibraryRef="gemfireRaLib" delegation="parentFirst"/>
</resourceAdapter>
和
<webApplication contextRoot="apprRoot13" location="/path/to/mylocation.war" name="App13" id="App13">
<classloader apiTypeVisibility="spec, ibm-api, stable, third-party, api" commonProviderRef="gemfireRaLib" delegation="parentFirst" />
</webApplication>
错误:
spring-data-gemfire initialization fails:
AnnotationConfigServletWebServerApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext-gemfire.xml]; nested exception is java.lang.NoClassDefFoundError: org.apache.geode.cache.PartitionResolver
在上述所有情况下,我都成功安装了 gemfireJCA 适配器。
更新 1
/path/to/shared/geode-lib/ 包含以下 jar:
geode-common-9.8.3.jar
geode-cq-9.8.3.jar
geode-jca-9.8.3.rar
geode-management-9.8.3.jar
geode-core-9.8.3.jar
geode-dependencies.jar
geode-lucene-9.8.3.jar
geode-wan-9.8.3.jar
当我将它们打包到 WAR 中时,应用程序启动但在
失败
lookup = (GFConnectionFactory) template.lookup("gfe/jca");
说:
java.lang.ClassCastException: org.apache.geode.internal.ra.GFConnectionFactoryImpl incompatible with org.apache.geode.ra.GFConnectionFactory
我得到 java.lang.ClassCastException: org.apache.geode.internal.ra.GFConnectionFactoryImpl incompatible with org.apache.geode.ra.GFConnectionFactory 因为 GFConnectionFactoryImpl 和 GFConnectionFactory 是由不同的类加载器加载的。这就是为什么我创建了一个 geode-lib 共享库。在 JCA 资源适配器和 Web 应用程序之间共享它
是什么导致了 NoClassDefFoundError
?
nested exception is java.lang.NoClassDefFoundError: org.apache.geode.cache.PartitionResolver
似乎您的基于 Spring (Data GemFire) 的 Web 应用程序在部署的工件中没有所有必需的依赖项 (WAR??)?
关于org.apache.geode.ra.GFConnectionFactory
,class在io.pivotal.gemfire:geode-core:9.8.7
。
在 WAS Liberty 描述符定义中:
<library id="gemfireRaLib" apiTypeVisibility="spec, ibm-api, stable, third-party, api">
<fileset dir="/path/to/shared/geode-lib" includes="geode-dependencies.jar"/>
<fileset dir="/path/to/shared/geode-lib" includes="*.jar"/>
</library>
我认为这是不正确的:
<fileset dir="/path/to/geode-lib" includes="geode-dependencies.jar"/>
例如,Pivotal GemFire 9.8 基于 Apache Geode 1.9。因此,我将使用 Apache Geode 1.9 发行版进行演示。
$ cd apache-geode-1.9.2/
jblum-mbpro-2:apache-geode-1.9.2 jblum$ $ jar -tvf lib/geode-dependencies.jar
0 Tue Oct 15 06:08:24 PDT 2019 META-INF/
2250 Tue Oct 15 06:08:24 PDT 2019 META-INF/MANIFEST.MF
19957 Tue Oct 15 06:05:14 PDT 2019 META-INF/LICENSE
575 Tue Oct 15 06:05:14 PDT 2019 META-INF/NOTICE
您知道 geode-dependencies.jar
是一个仅包含清单的 JAR 文件吗?
Manifest-only JAR 是一种方便的方式来引用应用程序中所需的其他 JAR class路径,因此您无需单独列出所有必需的 JAR,例如...
$ java -classpath /path/to/A.jar;/path/to/B.jar;...;/path/to/N.jar
仅包含清单的 JAR 不包含任何 class 文件或其他资源,正如您在上面看到的,清单文件除外。
仅清单 JAR 包含一个 META-INF/MANIFEST.MF
,其中 Class-Path
属性设置为所需的 JAR。 "required JARs" 是相对于仅包含清单的 JAR(例如 geode-dependecies.jar
)。
由于 geode-dependencies.jar
包含在 ~/apache-geode-1.9.2/lib
中,因此只有 ~/apache-geode-1.9.2/lib
目录中的 JAR 是可解析的:
$ ll lib/
total 133376
-rw-r--r--@ 1 jblum staff 114165 Jun 13 2019 HdrHistogram-2.1.9.jar
-rw-r--r--@ 1 jblum staff 143577 Jul 17 2019 HikariCP-3.2.0.jar
-rw-r--r--@ 1 jblum staff 29779 Jun 13 2019 LatencyUtils-2.0.3.jar
-rw-r--r--@ 1 jblum staff 445288 Feb 6 2019 antlr-2.7.7.jar
-rw-r--r--@ 1 jblum staff 346684 Feb 6 2019 classgraph-4.0.6.jar
-rw-r--r--@ 1 jblum staff 246174 Feb 6 2019 commons-beanutils-1.9.3.jar
-rw-r--r--@ 1 jblum staff 284184 Feb 6 2019 commons-codec-1.10.jar
-rw-r--r--@ 1 jblum staff 588337 Feb 6 2019 commons-collections-3.2.2.jar
-rw-r--r--@ 1 jblum staff 196768 Feb 6 2019 commons-digester-2.1.jar
-rw-r--r--@ 1 jblum staff 214788 Feb 6 2019 commons-io-2.6.jar
-rw-r--r--@ 1 jblum staff 501879 Feb 6 2019 commons-lang3-3.8.1.jar
-rw-r--r--@ 1 jblum staff 61829 Feb 6 2019 commons-logging-1.2.jar
-rw-r--r--@ 1 jblum staff 1692782 Aug 21 2019 commons-math3-3.2.jar
-rw-r--r--@ 1 jblum staff 112005 Aug 21 2019 commons-modeler-2.0.1.jar
-rw-r--r--@ 1 jblum staff 186077 Feb 6 2019 commons-validator-1.6.jar
-rw-r--r--@ 1 jblum staff 18800316 Jun 13 2019 fastutil-8.2.2.jar
-rw-r--r--@ 1 jblum staff 15322 Feb 6 2019 findbugs-annotations-1.3.9-1.jar
-rw-r--r--@ 1 jblum staff 23712 Aug 21 2019 geo-0.7.1.jar
-rw-r--r--@ 1 jblum staff 12987 Oct 15 06:07 geode-common-1.9.2.jar
-rw-r--r--@ 1 jblum staff 130813 Oct 15 06:08 geode-connectors-1.9.2.jar
-rw-r--r--@ 1 jblum staff 12280133 Oct 15 06:08 geode-core-1.9.2.jar
-rw-r--r--@ 1 jblum staff 96220 Oct 15 06:08 geode-cq-1.9.2.jar
-rw-r--r--@ 1 jblum staff 8200 Oct 15 06:08 geode-dependencies.jar
-rw-r--r--@ 1 jblum staff 24431 Oct 15 06:08 geode-jca-1.9.2.rar
-rw-r--r--@ 1 jblum staff 220612 Oct 15 06:08 geode-lucene-1.9.2.jar
-rw-r--r--@ 1 jblum staff 103539 Oct 15 06:07 geode-management-1.9.2.jar
-rw-r--r--@ 1 jblum staff 14225 Oct 15 06:08 geode-old-client-support-1.9.2.jar
-rw-r--r--@ 1 jblum staff 110608 Oct 15 06:08 geode-protobuf-1.9.2.jar
-rw-r--r--@ 1 jblum staff 607104 Oct 15 06:07 geode-protobuf-messages-1.9.2.jar
-rw-r--r--@ 1 jblum staff 22805 Oct 15 06:08 geode-rebalancer-1.9.2.jar
-rw-r--r--@ 1 jblum staff 516805 Oct 15 06:08 geode-redis-1.9.2.jar
-rw-r--r--@ 1 jblum staff 87754 Oct 15 06:08 geode-wan-1.9.2.jar
-rw-r--r--@ 1 jblum staff 41262 Oct 15 06:08 geode-web-1.9.2.jar
-rw-r--r--@ 1 jblum staff 8236 Oct 15 06:08 gfsh-dependencies.jar
-rw-r--r--@ 1 jblum staff 9902 Aug 21 2019 grumpy-core-0.2.2.jar
-rw-r--r--@ 1 jblum staff 767140 Jun 13 2019 httpclient-4.5.6.jar
-rw-r--r--@ 1 jblum staff 326356 Jun 13 2019 httpcore-4.4.10.jar
-rw-r--r--@ 1 jblum staff 20024 Jun 13 2019 istack-commons-runtime-2.2.jar
-rw-r--r--@ 1 jblum staff 66894 May 13 2019 jackson-annotations-2.9.8.jar
-rw-r--r--@ 1 jblum staff 325619 Feb 6 2019 jackson-core-2.9.8.jar
-rw-r--r--@ 1 jblum staff 1347236 Feb 6 2019 jackson-databind-2.9.8.jar
-rw-r--r--@ 1 jblum staff 283858 Aug 21 2019 jansi-1.17.1.jar
-rw-r--r--@ 1 jblum staff 78030 Jun 13 2019 javax.activation-1.2.0.jar
-rw-r--r--@ 1 jblum staff 56674 Jun 13 2019 javax.activation-api-1.2.0.jar
-rw-r--r--@ 1 jblum staff 219146 Aug 21 2019 javax.mail-api-1.6.2.jar
-rw-r--r--@ 1 jblum staff 69900 Jun 13 2019 javax.resource-api-1.7.1.jar
-rw-r--r--@ 1 jblum staff 95806 May 13 2019 javax.servlet-api-3.1.0.jar
-rw-r--r--@ 1 jblum staff 28016 Jun 7 2019 javax.transaction-api-1.3.jar
-rw-r--r--@ 1 jblum staff 128076 Jun 13 2019 jaxb-api-2.3.1.jar
-rw-r--r--@ 1 jblum staff 1099204 Jun 13 2019 jaxb-impl-2.3.1.jar
-rw-r--r--@ 1 jblum staff 195664 Jul 16 2019 jetty-http-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 139436 Jun 13 2019 jetty-io-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 93077 Jul 16 2019 jetty-security-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 609290 Jun 13 2019 jetty-server-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 110983 Oct 7 15:01 jetty-servlet-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 502985 Jun 13 2019 jetty-util-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 128579 Jul 16 2019 jetty-webapp-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 52044 Jul 16 2019 jetty-xml-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 2512913 Feb 6 2019 jgroups-3.6.14.Final.jar
-rw-r--r--@ 1 jblum staff 213854 Feb 6 2019 jline-2.12.jar
-rw-r--r--@ 1 jblum staff 914597 Feb 6 2019 jna-4.1.0.jar
-rw-r--r--@ 1 jblum staff 78146 Feb 6 2019 jopt-simple-5.0.4.jar
-rw-r--r--@ 1 jblum staff 264060 Jul 3 2019 log4j-api-2.11.1.jar
-rw-r--r--@ 1 jblum staff 1607947 Aug 8 2019 log4j-core-2.11.1.jar
-rw-r--r--@ 1 jblum staff 12664 Aug 21 2019 log4j-jcl-2.11.1.jar
-rw-r--r--@ 1 jblum staff 23999 Sep 3 2019 log4j-jul-2.11.1.jar
-rw-r--r--@ 1 jblum staff 23241 Aug 20 2019 log4j-slf4j-impl-2.11.1.jar
-rw-r--r--@ 1 jblum staff 1513791 Feb 6 2019 lucene-analyzers-common-6.6.2.jar
-rw-r--r--@ 1 jblum staff 26142 Feb 6 2019 lucene-analyzers-phonetic-6.6.2.jar
-rw-r--r--@ 1 jblum staff 2783525 Feb 6 2019 lucene-core-6.6.2.jar
-rw-r--r--@ 1 jblum staff 237891 Feb 6 2019 lucene-queries-6.6.2.jar
-rw-r--r--@ 1 jblum staff 405545 Feb 6 2019 lucene-queryparser-6.6.2.jar
-rw-r--r--@ 1 jblum staff 422554 Jun 13 2019 micrometer-core-1.1.3.jar
-rw-r--r--@ 1 jblum staff 409467 Feb 6 2019 mx4j-3.0.2.jar
-rw-r--r--@ 1 jblum staff 172221 Aug 21 2019 mx4j-remote-3.0.2.jar
-rw-r--r--@ 1 jblum staff 497017 Aug 21 2019 mx4j-tools-3.0.1.jar
-rw-r--r--@ 1 jblum staff 3905888 Aug 21 2019 netty-all-4.1.31.Final.jar
-rw-r--r--@ 1 jblum staff 1421323 Aug 21 2019 protobuf-java-3.6.1.jar
-rw-r--r--@ 1 jblum staff 17522 Oct 15 06:08 ra.jar
-rw-r--r--@ 1 jblum staff 110848 Feb 6 2019 rmiio-2.1.2.jar
-rw-r--r--@ 1 jblum staff 13601 Feb 6 2019 shiro-cache-1.4.0.jar
-rw-r--r--@ 1 jblum staff 18037 Feb 6 2019 shiro-config-core-1.4.0.jar
-rw-r--r--@ 1 jblum staff 43303 Feb 6 2019 shiro-config-ogdl-1.4.0.jar
-rw-r--r--@ 1 jblum staff 410541 Feb 6 2019 shiro-core-1.4.0.jar
-rw-r--r--@ 1 jblum staff 24024 Feb 6 2019 shiro-crypto-cipher-1.4.0.jar
-rw-r--r--@ 1 jblum staff 10873 Feb 6 2019 shiro-crypto-core-1.4.0.jar
-rw-r--r--@ 1 jblum staff 34298 Feb 6 2019 shiro-crypto-hash-1.4.0.jar
-rw-r--r--@ 1 jblum staff 19210 Feb 6 2019 shiro-event-1.4.0.jar
-rw-r--r--@ 1 jblum staff 51122 Feb 6 2019 shiro-lang-1.4.0.jar
-rw-r--r--@ 1 jblum staff 41203 Feb 6 2019 slf4j-api-1.7.25.jar
-rw-r--r--@ 1 jblum staff 57954 Feb 6 2019 snappy-0.4.jar
-rw-r--r--@ 1 jblum staff 379904 Sep 4 2019 spring-aop-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 763445 Aug 21 2019 spring-beans-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 1142763 Aug 21 2019 spring-context-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 1130638 Aug 21 2019 spring-core-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 274952 Aug 21 2019 spring-expression-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 195025 Feb 6 2019 spring-shell-1.2.0.RELEASE.jar
-rw-r--r--@ 1 jblum staff 828588 Sep 4 2019 spring-web-4.3.20.RELEASE.jar
在 lib
目录中看到 geode-dependenies.jar
?
现在,让我们检查 META-INF/MANIFEST.MF
文件。
$ $ jar -xvf lib/geode-dependencies.jar META-INF/MANIFEST.MF
inflated: META-INF/MANIFEST.MF
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Organization: Apache Software Foundation (ASF)
Class-Path: geode-common-1.9.2.jar geode-core-1.9.2.jar geode-connecto
rs-1.9.2.jar geode-lucene-1.9.2.jar geode-redis-1.9.2.jar geode-old-c
lient-support-1.9.2.jar geode-protobuf-1.9.2.jar geode-protobuf-messa
ges-1.9.2.jar geode-management-1.9.2.jar geode-wan-1.9.2.jar geode-cq
-1.9.2.jar geode-rebalancer-1.9.2.jar antlr-2.7.7.jar jgroups-3.6.14.
Final.jar jackson-databind-2.9.8.jar jackson-annotations-2.9.8.jar sp
ring-shell-1.2.0.RELEASE.jar commons-io-2.6.jar commons-validator-1.6
.jar javax.activation-1.2.0.jar jaxb-api-2.3.1.jar jaxb-impl-2.3.1.ja
r istack-commons-runtime-2.2.jar commons-lang3-3.8.1.jar micrometer-c
ore-1.1.3.jar fastutil-8.2.2.jar javax.resource-api-1.7.1.jar jna-4.1
.0.jar jopt-simple-5.0.4.jar log4j-slf4j-impl-2.11.1.jar log4j-core-2
.11.1.jar log4j-jcl-2.11.1.jar log4j-jul-2.11.1.jar log4j-api-2.11.1.
jar jetty-webapp-9.4.12.v20180830.jar jetty-servlet-9.4.12.v20180830.
jar jetty-security-9.4.12.v20180830.jar jetty-server-9.4.12.v20180830
.jar spring-core-4.3.20.RELEASE.jar snappy-0.4.jar shiro-core-1.4.0.j
ar classgraph-4.0.6.jar rmiio-2.1.2.jar jansi-1.17.1.jar shiro-cache-
1.4.0.jar shiro-crypto-hash-1.4.0.jar shiro-crypto-cipher-1.4.0.jar s
hiro-config-ogdl-1.4.0.jar shiro-config-core-1.4.0.jar shiro-event-1.
4.0.jar shiro-crypto-core-1.4.0.jar shiro-lang-1.4.0.jar slf4j-api-1.
7.25.jar commons-beanutils-1.9.3.jar commons-collections-3.2.2.jar ht
tpclient-4.5.6.jar commons-logging-1.2.jar javax.servlet-api-3.1.0.ja
r httpcore-4.4.10.jar jackson-core-2.9.8.jar javax.activation-api-1.2
.0.jar HdrHistogram-2.1.9.jar LatencyUtils-2.0.3.jar javax.transactio
n-api-1.3.jar jetty-xml-9.4.12.v20180830.jar jetty-http-9.4.12.v20180
830.jar jetty-io-9.4.12.v20180830.jar jline-2.12.jar jetty-util-9.4.1
2.v20180830.jar commons-codec-1.10.jar HikariCP-3.2.0.jar lucene-anal
yzers-phonetic-6.6.2.jar lucene-analyzers-common-6.6.2.jar lucene-que
ryparser-6.6.2.jar lucene-core-6.6.2.jar lucene-queries-6.6.2.jar geo
-0.7.1.jar netty-all-4.1.31.Final.jar grumpy-core-0.2.2.jar commons-m
ath3-3.2.jar protobuf-java-3.6.1.jar
Title: geode
Version: 1.9.2
Created-By: jdeppe
Class-Path
清单文件属性中列出的所有 JAR 都是相对于 geode-dependencies.jar
的,也是您在 WAS 中的 class 路径上需要的 JAR...
因此,多个 <fileset>
声明最少,Geode/GemFire JAR...
geode-核心
geode-cq
大地发光
geode-wan
...以及任何 Spring Data GemFire needs 的 JAR,可能包括基于您使用的 GemFire 特性的第 3 方库(即传递依赖项)(也许) ,例如Lucene..
lucene-xyz.jar
等等
有道理吗?
让我们从这里开始,并在需要时进行迭代。这应该会让你更进一步。
希望对您有所帮助!
正如 alasdair 对 post 的评论所建议的那样,您的应用程序类加载器引用没有指向正确的东西。在您的代码段中,它指向共享库而不是资源适配器:
<webApplication contextRoot="apprRoot13" location="/path/to/mylocation.war" name="App13" id="App13">
<classloader ... commonProviderRef="gemfireRaLib" ... />
</webApplication>
改为将其指向资源适配器:
<webApplication contextRoot="apprRoot13" location="/path/to/mylocation.war" name="App13" id="App13">
<classloader ... commonProviderRef="gemfireJCA" ... />
</webApplication>
更新 1:
一位同事指出我的代码片段中有错字,让我再试一次。假设:
你把所有的 geode 东西转储到一个共享库中
RA 需要访问geode 类
您的应用需要访问geode 类
你的 server.xml 应该是这样的:
<resourceAdapter id="gemfireJCA" location="/path/to/geode-lib/geode-jca-9.8.3.rar">
<classloader commonLibraryRef="gemfireRaLib" />
</resourceAdapter>
<library id="gemfireRaLib">
<fileset dir="/path/to/geode-lib" includes="*.jar"/>
</library>
<webApplication contextRoot="apprRoot13" location="/path/to/mylocation.war" name="App13" id="App13">
<classloader commonLibraryRef="gemfireRaLib" />
</webApplication>
请注意,我现在摆脱了 apiTypeVisibility 和委派,通常默认值是正确的。
非常感谢您的回复。这是问题的根本原因。
- 在 Liberty 中,每个应用程序策略都没有 SingleClassloader。 JCA资源适配器的classloader不同,WebApplication不同
- 因此 geode-*.jar 由 2 个不同的类加载器加载。
- gemfireJCA RA 提供的GFConnectionFactory 与应用程序不同。因此,不可能 'class cast' 由 JCA 类加载器加载的 GFConnectionFactory 进入应用程序类加载器。
为了解决这个问题,我可以采用以下任一解决方案:
解决方案 1:
在单个 EAR 中部署 GemfireJCA 和 WAR。将 geode-jca.rar 与 geode-*.jar 和 geode-dependencies.jar 一起打包为一个公共库和 WAR.
请注意:这些 geode-*.jar 不应在 WAR 的 WEB-INF/lib 中。
这是 EAR 树:
App13.ear:
|
|--gemfire-jca-9.8.3.rar
|--WebApp13.war(Without geode-*.jar)
|--lib
| |--geode-common-9.8.3.jar
| |--geode-cq-9.8.3.jar
| |--geode-management-9.8.3.jar
| |--geode-core-9.8.3.jar
| |--geode-dependencies.jar
| |--geode-lucene-9.8.3.jar
| |--geode-wan-9.8.3.jar
|--META-INF
| |--application.xml (with module connector for gemfireJCA using gemfire-jca-9.8.3.rar)
解决方案 2:
通过源代码处理连接:
@Bean
public JCAManagedConnectionFactory jcaManagedConnectionFactory() {
JCAManagedConnectionFactory jcaManagedConnectionFactory =
new JCAManagedConnectionFactory();
jcaManagedConnectionFactory.setProductName("GemFire");
jcaManagedConnectionFactory.setUserName(""); // DO NOT SET ANY USERNAME
jcaManagedConnectionFactory.setVersion("8.0");
return jcaManagedConnectionFactory;
}
@Bean
public JCAManagedConnection jcaManagedConnection(JCAManagedConnectionFactory jcaManagedConnectionFactory)
throws ResourceException {
return (JCAManagedConnection) jcaManagedConnectionFactory
.createManagedConnection(null, null);
}
@Bean
public GFConnectionFactory getGFConnectionFactory(JCAManagedConnectionFactory jcaManagedConnectionFactory,
JCAManagedConnection jcaManagedConnection)
throws ResourceException {
GFConnectionFactory lookup =
(GFConnectionFactory) jcaManagedConnectionFactory
.createConnectionFactory(new ConnectionManager() {
private static final long serialVersionUID =
1L;
@Override
public Object allocateConnection(ManagedConnectionFactory mcf,
ConnectionRequestInfo cxRequestInfo)
throws ResourceException {
return jcaManagedConnection.getConnection(null,
cxRequestInfo);
}
});
return lookup;
}
关闭期间清理连接:
@Override
public void onApplicationEvent(ContextClosedEvent event) {
if (null != jcaManagedConnection) {
try {
jcaManagedConnection.cleanup();
} catch (ResourceException e) {
LOGGER.error("Error while shuttingdown the container {}",
e.getMessage());
LOGGER.error(e.getMessage(), e);
}
}
}
我正在尝试按照 link 在 IBM WebSphere Liberty 基础上为 Gemfire 9.8 设置 JCA 资源适配器 https://gemfire.docs.pivotal.io/98/geode/reference/archive_transactions/JTA_transactions.html#concept_cp1_zx1_wk
这是我的 ra.xml:
<connector xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
version="1.5">
<display-name>GFE JCA Adaptor</display-name>
<vendor-name></vendor-name>
<spec-version>1.5</spec-version>
<eis-type>GFE JCA</eis-type>
<version>1.5</version>
<resourceadapter>
<config-property>
<config-property-name>ProductName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>GemFire</config-property-value>
</config-property>
<config-property>
<config-property-name>UserName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value/>
</config-property>
<config-property>
<config-property-name>Version</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>8.0</config-property-value>
</config-property>
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>org.apache.geode.internal.ra.spi.JCAManagedConnectionFactory</managedconnectionfactory-class>
<connectionfactory-interface>org.apache.geode.ra.GFConnectionFactory</connectionfactory-interface>
<connectionfactory-impl-class>org.apache.geode.internal.ra.GFConnectionFactoryImpl</connectionfactory-impl-class>
<connection-interface>org.apache.geode.ra.GFConnection</connection-interface>
<connection-impl-class>org.apache.geode.internal.ra.GFConnectionImpl</connection-impl-class>
<transaction-support>LocalTransaction</transaction-support>
<reauthentication-support>false</reauthentication-support>
</connection-definition>
</outbound-resourceadapter>
</resourceadapter>
这是我的资源适配器设置:
<library id="gemfireRaLib" apiTypeVisibility="spec, ibm-api, stable, third-party, api">
<fileset dir="path/to/geode-lib" includes="geode-dependencies.jar"/>
</library>
<resourceAdapter id="gemfireJCA" location="/path/to/geode-lib/geode-jca-9.8.3.rar">
<classloader apiTypeVisibility="spec, ibm-api, stable, third-party, api" commonLibraryRef="gemfireRaLib" delegation="parentFirst"/>
</resourceAdapter>
当我启动我的 liberty 服务器时,spring 引导初始化失败,提示未找到 ClassNotFoundException org.apache.geode.ra.GFConnectionFactory。
然后我把所有的geode依赖作为一个共享库:
<library id="gemfireRaLib" apiTypeVisibility="spec, ibm-api, stable, third-party, api">
<fileset dir="/path/to/geode-lib" includes="geode-dependencies.jar"/>
<fileset dir="/path/to/geode-lib" includes="*.jar"/>
</library>
<resourceAdapter id="gemfireJCA" location="/path/to/geode-jca-9.8.3.rar">
<classloader apiTypeVisibility="spec, ibm-api, stable, third-party, api" commonLibraryRef="gemfireRaLib" delegation="parentFirst"/>
</resourceAdapter>
和
<webApplication contextRoot="apprRoot13" location="/path/to/mylocation.war" name="App13" id="App13">
<classloader apiTypeVisibility="spec, ibm-api, stable, third-party, api" commonProviderRef="gemfireRaLib" delegation="parentFirst" />
</webApplication>
错误:
spring-data-gemfire initialization fails:
AnnotationConfigServletWebServerApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext-gemfire.xml]; nested exception is java.lang.NoClassDefFoundError: org.apache.geode.cache.PartitionResolver
在上述所有情况下,我都成功安装了 gemfireJCA 适配器。
更新 1
/path/to/shared/geode-lib/ 包含以下 jar:
geode-common-9.8.3.jar
geode-cq-9.8.3.jar
geode-jca-9.8.3.rar
geode-management-9.8.3.jar
geode-core-9.8.3.jar
geode-dependencies.jar
geode-lucene-9.8.3.jar
geode-wan-9.8.3.jar
当我将它们打包到 WAR 中时,应用程序启动但在
失败lookup = (GFConnectionFactory) template.lookup("gfe/jca");
说:
java.lang.ClassCastException: org.apache.geode.internal.ra.GFConnectionFactoryImpl incompatible with org.apache.geode.ra.GFConnectionFactory
我得到 java.lang.ClassCastException: org.apache.geode.internal.ra.GFConnectionFactoryImpl incompatible with org.apache.geode.ra.GFConnectionFactory 因为 GFConnectionFactoryImpl 和 GFConnectionFactory 是由不同的类加载器加载的。这就是为什么我创建了一个 geode-lib 共享库。在 JCA 资源适配器和 Web 应用程序之间共享它
是什么导致了 NoClassDefFoundError
?
nested exception is java.lang.NoClassDefFoundError: org.apache.geode.cache.PartitionResolver
似乎您的基于 Spring (Data GemFire) 的 Web 应用程序在部署的工件中没有所有必需的依赖项 (WAR??)?
关于org.apache.geode.ra.GFConnectionFactory
,class在io.pivotal.gemfire:geode-core:9.8.7
。
在 WAS Liberty 描述符定义中:
<library id="gemfireRaLib" apiTypeVisibility="spec, ibm-api, stable, third-party, api">
<fileset dir="/path/to/shared/geode-lib" includes="geode-dependencies.jar"/>
<fileset dir="/path/to/shared/geode-lib" includes="*.jar"/>
</library>
我认为这是不正确的:
<fileset dir="/path/to/geode-lib" includes="geode-dependencies.jar"/>
例如,Pivotal GemFire 9.8 基于 Apache Geode 1.9。因此,我将使用 Apache Geode 1.9 发行版进行演示。
$ cd apache-geode-1.9.2/
jblum-mbpro-2:apache-geode-1.9.2 jblum$ $ jar -tvf lib/geode-dependencies.jar
0 Tue Oct 15 06:08:24 PDT 2019 META-INF/
2250 Tue Oct 15 06:08:24 PDT 2019 META-INF/MANIFEST.MF
19957 Tue Oct 15 06:05:14 PDT 2019 META-INF/LICENSE
575 Tue Oct 15 06:05:14 PDT 2019 META-INF/NOTICE
您知道 geode-dependencies.jar
是一个仅包含清单的 JAR 文件吗?
Manifest-only JAR 是一种方便的方式来引用应用程序中所需的其他 JAR class路径,因此您无需单独列出所有必需的 JAR,例如...
$ java -classpath /path/to/A.jar;/path/to/B.jar;...;/path/to/N.jar
仅包含清单的 JAR 不包含任何 class 文件或其他资源,正如您在上面看到的,清单文件除外。
仅清单 JAR 包含一个 META-INF/MANIFEST.MF
,其中 Class-Path
属性设置为所需的 JAR。 "required JARs" 是相对于仅包含清单的 JAR(例如 geode-dependecies.jar
)。
由于 geode-dependencies.jar
包含在 ~/apache-geode-1.9.2/lib
中,因此只有 ~/apache-geode-1.9.2/lib
目录中的 JAR 是可解析的:
$ ll lib/
total 133376
-rw-r--r--@ 1 jblum staff 114165 Jun 13 2019 HdrHistogram-2.1.9.jar
-rw-r--r--@ 1 jblum staff 143577 Jul 17 2019 HikariCP-3.2.0.jar
-rw-r--r--@ 1 jblum staff 29779 Jun 13 2019 LatencyUtils-2.0.3.jar
-rw-r--r--@ 1 jblum staff 445288 Feb 6 2019 antlr-2.7.7.jar
-rw-r--r--@ 1 jblum staff 346684 Feb 6 2019 classgraph-4.0.6.jar
-rw-r--r--@ 1 jblum staff 246174 Feb 6 2019 commons-beanutils-1.9.3.jar
-rw-r--r--@ 1 jblum staff 284184 Feb 6 2019 commons-codec-1.10.jar
-rw-r--r--@ 1 jblum staff 588337 Feb 6 2019 commons-collections-3.2.2.jar
-rw-r--r--@ 1 jblum staff 196768 Feb 6 2019 commons-digester-2.1.jar
-rw-r--r--@ 1 jblum staff 214788 Feb 6 2019 commons-io-2.6.jar
-rw-r--r--@ 1 jblum staff 501879 Feb 6 2019 commons-lang3-3.8.1.jar
-rw-r--r--@ 1 jblum staff 61829 Feb 6 2019 commons-logging-1.2.jar
-rw-r--r--@ 1 jblum staff 1692782 Aug 21 2019 commons-math3-3.2.jar
-rw-r--r--@ 1 jblum staff 112005 Aug 21 2019 commons-modeler-2.0.1.jar
-rw-r--r--@ 1 jblum staff 186077 Feb 6 2019 commons-validator-1.6.jar
-rw-r--r--@ 1 jblum staff 18800316 Jun 13 2019 fastutil-8.2.2.jar
-rw-r--r--@ 1 jblum staff 15322 Feb 6 2019 findbugs-annotations-1.3.9-1.jar
-rw-r--r--@ 1 jblum staff 23712 Aug 21 2019 geo-0.7.1.jar
-rw-r--r--@ 1 jblum staff 12987 Oct 15 06:07 geode-common-1.9.2.jar
-rw-r--r--@ 1 jblum staff 130813 Oct 15 06:08 geode-connectors-1.9.2.jar
-rw-r--r--@ 1 jblum staff 12280133 Oct 15 06:08 geode-core-1.9.2.jar
-rw-r--r--@ 1 jblum staff 96220 Oct 15 06:08 geode-cq-1.9.2.jar
-rw-r--r--@ 1 jblum staff 8200 Oct 15 06:08 geode-dependencies.jar
-rw-r--r--@ 1 jblum staff 24431 Oct 15 06:08 geode-jca-1.9.2.rar
-rw-r--r--@ 1 jblum staff 220612 Oct 15 06:08 geode-lucene-1.9.2.jar
-rw-r--r--@ 1 jblum staff 103539 Oct 15 06:07 geode-management-1.9.2.jar
-rw-r--r--@ 1 jblum staff 14225 Oct 15 06:08 geode-old-client-support-1.9.2.jar
-rw-r--r--@ 1 jblum staff 110608 Oct 15 06:08 geode-protobuf-1.9.2.jar
-rw-r--r--@ 1 jblum staff 607104 Oct 15 06:07 geode-protobuf-messages-1.9.2.jar
-rw-r--r--@ 1 jblum staff 22805 Oct 15 06:08 geode-rebalancer-1.9.2.jar
-rw-r--r--@ 1 jblum staff 516805 Oct 15 06:08 geode-redis-1.9.2.jar
-rw-r--r--@ 1 jblum staff 87754 Oct 15 06:08 geode-wan-1.9.2.jar
-rw-r--r--@ 1 jblum staff 41262 Oct 15 06:08 geode-web-1.9.2.jar
-rw-r--r--@ 1 jblum staff 8236 Oct 15 06:08 gfsh-dependencies.jar
-rw-r--r--@ 1 jblum staff 9902 Aug 21 2019 grumpy-core-0.2.2.jar
-rw-r--r--@ 1 jblum staff 767140 Jun 13 2019 httpclient-4.5.6.jar
-rw-r--r--@ 1 jblum staff 326356 Jun 13 2019 httpcore-4.4.10.jar
-rw-r--r--@ 1 jblum staff 20024 Jun 13 2019 istack-commons-runtime-2.2.jar
-rw-r--r--@ 1 jblum staff 66894 May 13 2019 jackson-annotations-2.9.8.jar
-rw-r--r--@ 1 jblum staff 325619 Feb 6 2019 jackson-core-2.9.8.jar
-rw-r--r--@ 1 jblum staff 1347236 Feb 6 2019 jackson-databind-2.9.8.jar
-rw-r--r--@ 1 jblum staff 283858 Aug 21 2019 jansi-1.17.1.jar
-rw-r--r--@ 1 jblum staff 78030 Jun 13 2019 javax.activation-1.2.0.jar
-rw-r--r--@ 1 jblum staff 56674 Jun 13 2019 javax.activation-api-1.2.0.jar
-rw-r--r--@ 1 jblum staff 219146 Aug 21 2019 javax.mail-api-1.6.2.jar
-rw-r--r--@ 1 jblum staff 69900 Jun 13 2019 javax.resource-api-1.7.1.jar
-rw-r--r--@ 1 jblum staff 95806 May 13 2019 javax.servlet-api-3.1.0.jar
-rw-r--r--@ 1 jblum staff 28016 Jun 7 2019 javax.transaction-api-1.3.jar
-rw-r--r--@ 1 jblum staff 128076 Jun 13 2019 jaxb-api-2.3.1.jar
-rw-r--r--@ 1 jblum staff 1099204 Jun 13 2019 jaxb-impl-2.3.1.jar
-rw-r--r--@ 1 jblum staff 195664 Jul 16 2019 jetty-http-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 139436 Jun 13 2019 jetty-io-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 93077 Jul 16 2019 jetty-security-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 609290 Jun 13 2019 jetty-server-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 110983 Oct 7 15:01 jetty-servlet-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 502985 Jun 13 2019 jetty-util-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 128579 Jul 16 2019 jetty-webapp-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 52044 Jul 16 2019 jetty-xml-9.4.12.v20180830.jar
-rw-r--r--@ 1 jblum staff 2512913 Feb 6 2019 jgroups-3.6.14.Final.jar
-rw-r--r--@ 1 jblum staff 213854 Feb 6 2019 jline-2.12.jar
-rw-r--r--@ 1 jblum staff 914597 Feb 6 2019 jna-4.1.0.jar
-rw-r--r--@ 1 jblum staff 78146 Feb 6 2019 jopt-simple-5.0.4.jar
-rw-r--r--@ 1 jblum staff 264060 Jul 3 2019 log4j-api-2.11.1.jar
-rw-r--r--@ 1 jblum staff 1607947 Aug 8 2019 log4j-core-2.11.1.jar
-rw-r--r--@ 1 jblum staff 12664 Aug 21 2019 log4j-jcl-2.11.1.jar
-rw-r--r--@ 1 jblum staff 23999 Sep 3 2019 log4j-jul-2.11.1.jar
-rw-r--r--@ 1 jblum staff 23241 Aug 20 2019 log4j-slf4j-impl-2.11.1.jar
-rw-r--r--@ 1 jblum staff 1513791 Feb 6 2019 lucene-analyzers-common-6.6.2.jar
-rw-r--r--@ 1 jblum staff 26142 Feb 6 2019 lucene-analyzers-phonetic-6.6.2.jar
-rw-r--r--@ 1 jblum staff 2783525 Feb 6 2019 lucene-core-6.6.2.jar
-rw-r--r--@ 1 jblum staff 237891 Feb 6 2019 lucene-queries-6.6.2.jar
-rw-r--r--@ 1 jblum staff 405545 Feb 6 2019 lucene-queryparser-6.6.2.jar
-rw-r--r--@ 1 jblum staff 422554 Jun 13 2019 micrometer-core-1.1.3.jar
-rw-r--r--@ 1 jblum staff 409467 Feb 6 2019 mx4j-3.0.2.jar
-rw-r--r--@ 1 jblum staff 172221 Aug 21 2019 mx4j-remote-3.0.2.jar
-rw-r--r--@ 1 jblum staff 497017 Aug 21 2019 mx4j-tools-3.0.1.jar
-rw-r--r--@ 1 jblum staff 3905888 Aug 21 2019 netty-all-4.1.31.Final.jar
-rw-r--r--@ 1 jblum staff 1421323 Aug 21 2019 protobuf-java-3.6.1.jar
-rw-r--r--@ 1 jblum staff 17522 Oct 15 06:08 ra.jar
-rw-r--r--@ 1 jblum staff 110848 Feb 6 2019 rmiio-2.1.2.jar
-rw-r--r--@ 1 jblum staff 13601 Feb 6 2019 shiro-cache-1.4.0.jar
-rw-r--r--@ 1 jblum staff 18037 Feb 6 2019 shiro-config-core-1.4.0.jar
-rw-r--r--@ 1 jblum staff 43303 Feb 6 2019 shiro-config-ogdl-1.4.0.jar
-rw-r--r--@ 1 jblum staff 410541 Feb 6 2019 shiro-core-1.4.0.jar
-rw-r--r--@ 1 jblum staff 24024 Feb 6 2019 shiro-crypto-cipher-1.4.0.jar
-rw-r--r--@ 1 jblum staff 10873 Feb 6 2019 shiro-crypto-core-1.4.0.jar
-rw-r--r--@ 1 jblum staff 34298 Feb 6 2019 shiro-crypto-hash-1.4.0.jar
-rw-r--r--@ 1 jblum staff 19210 Feb 6 2019 shiro-event-1.4.0.jar
-rw-r--r--@ 1 jblum staff 51122 Feb 6 2019 shiro-lang-1.4.0.jar
-rw-r--r--@ 1 jblum staff 41203 Feb 6 2019 slf4j-api-1.7.25.jar
-rw-r--r--@ 1 jblum staff 57954 Feb 6 2019 snappy-0.4.jar
-rw-r--r--@ 1 jblum staff 379904 Sep 4 2019 spring-aop-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 763445 Aug 21 2019 spring-beans-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 1142763 Aug 21 2019 spring-context-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 1130638 Aug 21 2019 spring-core-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 274952 Aug 21 2019 spring-expression-4.3.20.RELEASE.jar
-rw-r--r--@ 1 jblum staff 195025 Feb 6 2019 spring-shell-1.2.0.RELEASE.jar
-rw-r--r--@ 1 jblum staff 828588 Sep 4 2019 spring-web-4.3.20.RELEASE.jar
在 lib
目录中看到 geode-dependenies.jar
?
现在,让我们检查 META-INF/MANIFEST.MF
文件。
$ $ jar -xvf lib/geode-dependencies.jar META-INF/MANIFEST.MF
inflated: META-INF/MANIFEST.MF
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Organization: Apache Software Foundation (ASF)
Class-Path: geode-common-1.9.2.jar geode-core-1.9.2.jar geode-connecto
rs-1.9.2.jar geode-lucene-1.9.2.jar geode-redis-1.9.2.jar geode-old-c
lient-support-1.9.2.jar geode-protobuf-1.9.2.jar geode-protobuf-messa
ges-1.9.2.jar geode-management-1.9.2.jar geode-wan-1.9.2.jar geode-cq
-1.9.2.jar geode-rebalancer-1.9.2.jar antlr-2.7.7.jar jgroups-3.6.14.
Final.jar jackson-databind-2.9.8.jar jackson-annotations-2.9.8.jar sp
ring-shell-1.2.0.RELEASE.jar commons-io-2.6.jar commons-validator-1.6
.jar javax.activation-1.2.0.jar jaxb-api-2.3.1.jar jaxb-impl-2.3.1.ja
r istack-commons-runtime-2.2.jar commons-lang3-3.8.1.jar micrometer-c
ore-1.1.3.jar fastutil-8.2.2.jar javax.resource-api-1.7.1.jar jna-4.1
.0.jar jopt-simple-5.0.4.jar log4j-slf4j-impl-2.11.1.jar log4j-core-2
.11.1.jar log4j-jcl-2.11.1.jar log4j-jul-2.11.1.jar log4j-api-2.11.1.
jar jetty-webapp-9.4.12.v20180830.jar jetty-servlet-9.4.12.v20180830.
jar jetty-security-9.4.12.v20180830.jar jetty-server-9.4.12.v20180830
.jar spring-core-4.3.20.RELEASE.jar snappy-0.4.jar shiro-core-1.4.0.j
ar classgraph-4.0.6.jar rmiio-2.1.2.jar jansi-1.17.1.jar shiro-cache-
1.4.0.jar shiro-crypto-hash-1.4.0.jar shiro-crypto-cipher-1.4.0.jar s
hiro-config-ogdl-1.4.0.jar shiro-config-core-1.4.0.jar shiro-event-1.
4.0.jar shiro-crypto-core-1.4.0.jar shiro-lang-1.4.0.jar slf4j-api-1.
7.25.jar commons-beanutils-1.9.3.jar commons-collections-3.2.2.jar ht
tpclient-4.5.6.jar commons-logging-1.2.jar javax.servlet-api-3.1.0.ja
r httpcore-4.4.10.jar jackson-core-2.9.8.jar javax.activation-api-1.2
.0.jar HdrHistogram-2.1.9.jar LatencyUtils-2.0.3.jar javax.transactio
n-api-1.3.jar jetty-xml-9.4.12.v20180830.jar jetty-http-9.4.12.v20180
830.jar jetty-io-9.4.12.v20180830.jar jline-2.12.jar jetty-util-9.4.1
2.v20180830.jar commons-codec-1.10.jar HikariCP-3.2.0.jar lucene-anal
yzers-phonetic-6.6.2.jar lucene-analyzers-common-6.6.2.jar lucene-que
ryparser-6.6.2.jar lucene-core-6.6.2.jar lucene-queries-6.6.2.jar geo
-0.7.1.jar netty-all-4.1.31.Final.jar grumpy-core-0.2.2.jar commons-m
ath3-3.2.jar protobuf-java-3.6.1.jar
Title: geode
Version: 1.9.2
Created-By: jdeppe
Class-Path
清单文件属性中列出的所有 JAR 都是相对于 geode-dependencies.jar
的,也是您在 WAS 中的 class 路径上需要的 JAR...
因此,多个 <fileset>
声明最少,Geode/GemFire JAR...
geode-核心 geode-cq 大地发光 geode-wan
...以及任何 Spring Data GemFire needs 的 JAR,可能包括基于您使用的 GemFire 特性的第 3 方库(即传递依赖项)(也许) ,例如Lucene..
lucene-xyz.jar
等等
有道理吗?
让我们从这里开始,并在需要时进行迭代。这应该会让你更进一步。
希望对您有所帮助!
正如 alasdair 对 post 的评论所建议的那样,您的应用程序类加载器引用没有指向正确的东西。在您的代码段中,它指向共享库而不是资源适配器:
<webApplication contextRoot="apprRoot13" location="/path/to/mylocation.war" name="App13" id="App13">
<classloader ... commonProviderRef="gemfireRaLib" ... />
</webApplication>
改为将其指向资源适配器:
<webApplication contextRoot="apprRoot13" location="/path/to/mylocation.war" name="App13" id="App13">
<classloader ... commonProviderRef="gemfireJCA" ... />
</webApplication>
更新 1: 一位同事指出我的代码片段中有错字,让我再试一次。假设:
你把所有的 geode 东西转储到一个共享库中
RA 需要访问geode 类
您的应用需要访问geode 类
你的 server.xml 应该是这样的:
<resourceAdapter id="gemfireJCA" location="/path/to/geode-lib/geode-jca-9.8.3.rar">
<classloader commonLibraryRef="gemfireRaLib" />
</resourceAdapter>
<library id="gemfireRaLib">
<fileset dir="/path/to/geode-lib" includes="*.jar"/>
</library>
<webApplication contextRoot="apprRoot13" location="/path/to/mylocation.war" name="App13" id="App13">
<classloader commonLibraryRef="gemfireRaLib" />
</webApplication>
请注意,我现在摆脱了 apiTypeVisibility 和委派,通常默认值是正确的。
非常感谢您的回复。这是问题的根本原因。
- 在 Liberty 中,每个应用程序策略都没有 SingleClassloader。 JCA资源适配器的classloader不同,WebApplication不同
- 因此 geode-*.jar 由 2 个不同的类加载器加载。
- gemfireJCA RA 提供的GFConnectionFactory 与应用程序不同。因此,不可能 'class cast' 由 JCA 类加载器加载的 GFConnectionFactory 进入应用程序类加载器。
为了解决这个问题,我可以采用以下任一解决方案:
解决方案 1:
在单个 EAR 中部署 GemfireJCA 和 WAR。将 geode-jca.rar 与 geode-*.jar 和 geode-dependencies.jar 一起打包为一个公共库和 WAR.
请注意:这些 geode-*.jar 不应在 WAR 的 WEB-INF/lib 中。
这是 EAR 树:
App13.ear:
|
|--gemfire-jca-9.8.3.rar
|--WebApp13.war(Without geode-*.jar)
|--lib
| |--geode-common-9.8.3.jar
| |--geode-cq-9.8.3.jar
| |--geode-management-9.8.3.jar
| |--geode-core-9.8.3.jar
| |--geode-dependencies.jar
| |--geode-lucene-9.8.3.jar
| |--geode-wan-9.8.3.jar
|--META-INF
| |--application.xml (with module connector for gemfireJCA using gemfire-jca-9.8.3.rar)
解决方案 2:
通过源代码处理连接:
@Bean
public JCAManagedConnectionFactory jcaManagedConnectionFactory() {
JCAManagedConnectionFactory jcaManagedConnectionFactory =
new JCAManagedConnectionFactory();
jcaManagedConnectionFactory.setProductName("GemFire");
jcaManagedConnectionFactory.setUserName(""); // DO NOT SET ANY USERNAME
jcaManagedConnectionFactory.setVersion("8.0");
return jcaManagedConnectionFactory;
}
@Bean
public JCAManagedConnection jcaManagedConnection(JCAManagedConnectionFactory jcaManagedConnectionFactory)
throws ResourceException {
return (JCAManagedConnection) jcaManagedConnectionFactory
.createManagedConnection(null, null);
}
@Bean
public GFConnectionFactory getGFConnectionFactory(JCAManagedConnectionFactory jcaManagedConnectionFactory,
JCAManagedConnection jcaManagedConnection)
throws ResourceException {
GFConnectionFactory lookup =
(GFConnectionFactory) jcaManagedConnectionFactory
.createConnectionFactory(new ConnectionManager() {
private static final long serialVersionUID =
1L;
@Override
public Object allocateConnection(ManagedConnectionFactory mcf,
ConnectionRequestInfo cxRequestInfo)
throws ResourceException {
return jcaManagedConnection.getConnection(null,
cxRequestInfo);
}
});
return lookup;
}
关闭期间清理连接:
@Override
public void onApplicationEvent(ContextClosedEvent event) {
if (null != jcaManagedConnection) {
try {
jcaManagedConnection.cleanup();
} catch (ResourceException e) {
LOGGER.error("Error while shuttingdown the container {}",
e.getMessage());
LOGGER.error(e.getMessage(), e);
}
}
}