Antecedentes de problemas
En la plataforma de datos, la construcción del proyecto requiere el uso de ES y HBase para crear una interfaz de consulta de datos. Durante el proceso de integración, se producen los conflictos del paquete JAR: com.google.common.base.stopwatch. () V de la clase org.apache.hadoop.hbase.zookeepers.metatablelocator
org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator at org.apache.hadoop.hbase.client.rpcretricyingcaller.translateException (rpCretryRingCaller.Java:239) en org.apache.hadoop.hbase.client.rpcretryretryingcaller.callwithritries (rpCretricyingcaller.Java:150) ... AT java.lang.Thread.run(Thread.java:745)Caused by: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator at org.apache.hadoop.hbase.zookeeperer.metatableLocator.blockuntil ... en org.apache.hadoop.hbase.client.regionserverCallable.prepare (regionServerCallable.java:75) en org.apache.hadoop.hbase.client.rpcretryingcaller.callwithretries (rpcretryryingcaller.java:134) ... 45 más
Solución
Después de la investigación, se confirmó que era un conflicto causado por el paquete com.google.guava. ES depende de la versión 18 y superior, mientras que HBase solo admite la versión 16 y superior. El paquete de guayaba cambia internamente de 17 y el método cambia, por lo que 18 no será compatible con la versión 16. Durante la operación del proyecto, si las versiones 16 y 18 se introducen al mismo tiempo, el proceso de llamada de ES y HBase se confundirá. Entonces será fácil de hacer a continuación. Podemos volver a empaquetar, escribir GuAVA18 en ES y luego mostrar el paquete que hace referencia a la versión Guava16 en el archivo POM. De esta manera, ES llama a Guava18 que se ingresa dentro del paquete, mientras que HBase llama Guava16 que se ingresa afuera.
Reempaquetamiento
Cree un nuevo proyecto Maven y configúrelo en el archivo POM de la siguiente manera:
<? xml versión = "1.0" encoding = "utf-8"?> <Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschemainstance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion> 4.0.0 </modelversion> <! en ES, requerido Guava 18+ o Up. Pero en HBase debes usar Guava 16 o soplar. CD El directorio del proyecto y ejecutar 'sh ./cleanbuild.sh', obtendrá un frasco nuevo. Luego, ajuste su proyecto pom.xml Whatth: <Spendency> <MoupRid> douguo.shaded.elasticsearch </proupid> <artifactid> douguo_shaded_elasticsearch </artifactid> <version> 1.0-snapshot </proion> <excusions> <excusion> <grupid> org.elasticsearch </groupid> <artifactId> Elasticsearch </arfactid> </extusion> </excusionions> </pendency> Finalmente, su combate jar se solucionará. @Date: 2017-11-30 @author: zhangjianfei @since: douguo.shaded.elasticsearch-1.0.0-> <proupid> douguo.shaded.elasticsearch </proupid> <artifactid> douguo_shaded_elasticsearch </artifiCid> <Ponectrion> <Elasticsearch.version> 2.4.1 </elasticsearch.version> </propiences> <pendencies> <pendency> <MoupRoMID> org.elasticsearch </uproupid> <artifactid> elasticsearch </artifactid> <verision> $ {elasticsearch.version} </version> </dependency> <ependency> <grupeID> org.elasticsears. <artifactid> shield </arfactid> <versever> $ {elasticsearch.version} </ververy> </dependency> </pendencs> <struple> <glugins> <grupoD> org.apache.maven.plugins <//groupid> <artifactid> maven-shade-plugin </artifactid> <versersever> Version> <1/Configuration> <RediedependencyReducePom> false </createPendencyUducedPom> </figuration> <secution> <fase> paquete </fase> <SOTS> <SOTH> sombra </meta> </metas> <figuration> <Elsocations> <Slocation> <Mother> Com.Google.Guava </mattern> <DoundPattern> doonguo.shaded.elasticsearch.guaVaVa </shadeDpattern> </relocation> <relocation> <pattern>org.joda</pattern> <shadedPattern>douguo.shaded.elasticsearch.joda</shadedPattern> </relocation> <relocation> <pattern>com.google.common</pattern> <shadedPattern>douguo.shaded.elasticsearch.common</shadedPattern> </relocation> <relocation> <Patter> com.google.thirdParty </matter> <shadedpattern> douguo.shaded.elasticsearch.thirdParty </shedpattern> </socation> </relocations> <transformers> <implementación de transformador = "org.apache.maven.plugins.shade.resource.manifressurcetransformer"/</transformadores "/</transformadores"///////Configuración de transformadores </Configuración </Configuración </Configuración </Configuración/</Configuración </Configuración </Configuración </Configuración </Configuración </Configuración </Configuración </Configuración </Configuración </Configuración </Configuración </Configuración </Configuración </Transformers </Transformers </Transformers </Transformers </Configurations </secution> </ejecutions> </tugin> </build> <Repositories> <Repository> <id> elasticsearch-releases </id> <url> http://maven.elasticsearch.org/releases </url> <lotes> <Encation> true </ledapled> <Actualypolicy> diarypolicy> </releates> <sapshots> <Dabled> falso </sepable> </stapshots> </ Repository> </ Repository> </ Repositories> </Project> Migrate org.joda y otros 4 posibles paquetes JAR en conflicto a través del complemento Maven-shade-plugin y los paquetes de jar de reyos para que al introducir este paquete JAR, pueda usar las propias dependencias del paquete JAR en lugar de usar dependencias externas. Cabe señalar aquí que todos los com.google.common y otros 4 paquetes deben ser remigados, de lo contrario java.lang.illegalaccesserror: intenté acceder al método com.google.common.base El error se producirá.
Paquete de proyecto
Instalación limpia MVN
El nuevo paquete de dependencia estará en el almacén .m2 Maven. Si la compañía construye el almacén, es necesario cargar el paquete JAR. Si ejecuta el paquete JAR directamente, recuerde recompilar el proyecto y reemplazar el directorio LIB
El proyecto carga un nuevo paquete
Simplemente configúrelo en el archivo POM:
< <artifactid> Elasticsearch </arfactid> </extusion> </excusions> </pepertency> <!-https://mvnrepository.com/artifact/com.google.guava/guava-> <!-Esta guava solo se usa en el habse en ES, 18.0+ se requiere, pero solo se requiere 16.0 o soporte. Limpie como instalar douguo.shaded.elasticsearch -> <pendency> <MoupRid> com.google.guava </groupid> <artifactid> guava </artifactid> <versión> 16.0 </versión> </pendency>
De esta manera, el paquete Guava18 está bajo douguo.shaded.elasticsearch, y ES se llamará primero. La GUAVA16 configurada externamente será llamado por HBase. ¡Las 2 versiones de los paquetes JAR existen independientemente el uno del otro!
En este punto, ¡el problema se resuelve!
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.