พื้นหลังปัญหา
ในแพลตฟอร์มข้อมูลการก่อสร้างโครงการต้องใช้ ES และ HBASE เพื่อสร้างอินเทอร์เฟซแบบสอบถามข้อมูล ในระหว่างกระบวนการรวมแพคเกจ JAR เกิดขึ้น: com.google.common.base.stopwatch. () v จากคลาส org.apache.hadoop.hbase.zookeeper.metatablelocator
org.apache.hadoop.hbase.donotretryioexception: java.lang.illegalAccessError: พยายามเข้าถึงวิธีการ com.google.common.base.stopwatch. <init> () v จากคลาส org.apache.hadoop.hbase.zookeake org.apache.hadoop.hbase.client.rpcretryingcaller.translateException (rpcretryingcaller.java:239) ที่ org.apache.hadoop.hbase.client.rpcretryingCaller.CallwithRetries java.lang.thread.run (thread.java:745) เกิดจาก: java.lang.illegalaccesserror: พยายามเข้าถึงวิธีการ com.google.common.base.stopwatch <init> () V จากคลาส org.hadoop.hbase.zookeeper org.apache.hadoop.hbase.zookeeper.metatablelocator.blockuntil ... ที่ org.apache.hadoop.hbase.client.regionervercallable.prepare org.apache.hadoop.hbase.client.rpcretryingCaller.CallWithRetries (rpcretryingCaller.java:134) ... 45 เพิ่มเติม
สารละลาย
หลังจากการสอบสวนมันได้รับการยืนยันว่ามันเป็นความขัดแย้งที่เกิดจากแพ็คเกจ com.google.guava ES ขึ้นอยู่กับเวอร์ชัน 18 ขึ้นไปในขณะที่ HBASE รองรับรุ่นที่ 16 ขึ้นไปเท่านั้น แพ็คเกจ Guava เปลี่ยนไปจากภายใน 17 และการเปลี่ยนแปลงวิธีการดังนั้น 18 จะไม่สามารถย้อนกลับเข้ากันได้กับเวอร์ชัน 16 ในระหว่างการดำเนินการโครงการหากมีการแนะนำรุ่น 16 และ 18 ในเวลาเดียวกันกระบวนการโทรของ ES และ HBASE จะสับสน จากนั้นมันจะง่ายต่อการทำต่อไป เราสามารถบรรจุใหม่พิมพ์ guava18 ลงใน ES จากนั้นแสดงแพ็คเกจที่อ้างอิงเวอร์ชัน Guava16 ในไฟล์ POM ด้วยวิธีนี้ ES เรียก Guava18 ที่ป้อนภายในแพ็คเกจในขณะที่ HBase เรียก Guava16 ที่ป้อนออกไปด้านนอก
การบรรจุใหม่
สร้างโครงการ Maven ใหม่และกำหนดค่าในไฟล์ POM ดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/ XSI: Schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" ใน ES จำเป็นต้องใช้ Guava 18+ หรือสูงกว่า แต่ใน HBase คุณควรใช้ Guava 16- หรือระเบิด ซีดีไดเรกทอรีโครงการและเรียกใช้ 'sh ./cleanbuild.sh', คุณจะได้รับขวดใหม่ จากนั้นปรับโครงการของคุณ pom.xml whatth: <การพึ่งพา> <roupid> douguo.shaded.elasticsearch </groupid> <ratifactid> douguo_shaded_elasticsearch </artifactid> <persion> 1.0-snapshot </เวอร์ชัน> <ARTIFACTID> ELASTICSEARCH </ARTIFACTID> </Exclusion> </การยกเว้น> </การพึ่งพา> ในที่สุด Jar Comflic ของคุณจะได้รับการแก้ไข @Date: 2017-11-30 @author: Zhangjianfei @Since: Douguo.shaded.elasticsearch -1.0.0-> <Groupid> douguo.shaded.elasticsearch </groupid> <ElasticSearch.Version> 2.4.1 <AbloasticSearch.Version> </premerties> <การพึ่งพา> <การพึ่งพา> <roupId> org.elasticsearch </groupId> <RoupID> org.elasticsearch.plugin </groupId> <ratifactid> shield </artifactid> <sersion> $ {elasticsearch.version} </senture> </predency> </percies> <uffactain> <Sersion> 2.4.1 </Sentures> <การกำหนดค่า> <CreatedEpendEndenceReDucedPom> FALSE </createDependencyReducedPom> </การกำหนดค่า> <EXECUTION> <meppy> แพคเกจ </เฟส> <เป้าหมาย> <goal> Shade </เป้าหมาย> </เป้าหมาย> <การกำหนดค่า> <การเชื่อมต่อ> <dhadedpattern> douguo.shaded.elasticsearch.guava </shadedpattern> </relocation> <relocation> <mattern> org.joda </pattern> <dhatedpattern> douguo.shaded.elasticsearch.joda </shadedpattern> <dhadedpattern> douguo.shaded.elasticsearch.common </shadedpattern> </relocation> <relocation> <mattern> com.google.thirdparty </pattern> <dhatedpattern> douguo.shaded.elasticsearch.thirdparty </shadedpattern> การใช้งาน = "org.apache.maven.plugins.shade.resource.manifestresourceTransformer"/> </transformers> </การกำหนดค่า> </Execution> </encutions> </plugin> <url> http://maven.elasticsearch.org/releases </url> <leases> <enabled> true </enabled> <updatePolicy> รายวัน </updatePolicy> </releases> โยกย้าย org.joda และอีก 4 แพ็คเกจขวดที่ขัดแย้งกันที่เป็นไปได้ผ่านปลั๊กอิน maven-shade-plugin และแพ็คเกจ Jar ประเภทใหม่เพื่อให้เมื่อแนะนำแพ็คเกจ JAR นี้คุณสามารถใช้การพึ่งพาของแพ็คเกจ JAR แทนที่จะใช้การพึ่งพาภายนอก ควรสังเกตที่นี่ว่า com.google.common และแพ็คเกจอื่น ๆ 4 แพ็คเกจอื่น ๆ จำเป็นต้องได้รับการอพยพมิฉะนั้น java.lang.illegalaccesserror: พยายามเข้าถึงวิธีการ com.google.common.base ข้อผิดพลาดจะเกิดขึ้น
แพ็คเกจโครงการ
การติดตั้ง MVN Clean
แพ็คเกจการพึ่งพาใหม่จะอยู่ในคลังสินค้า. M2 Maven หาก บริษัท สร้างคลังสินค้าจำเป็นต้องอัปโหลดแพ็คเกจ JAR หากคุณเรียกใช้แพ็คเกจ JAR โดยตรงอย่าลืมคอมไพล์โครงการใหม่และแทนที่ไดเรกทอรี LIB
โครงการโหลดแพ็คเกจใหม่
เพียงกำหนดค่าไว้ในไฟล์ POM:
<!-douguo.shaded.elasticsearch-> <predency> <sdeperency> <sdeperency> <sdeperency> <roupId> douguo.shaded.elasticsearch </groupId> <ArtIfactId> douguo_shaded_elasticsearch </artifactid> <version> 1.0-snapshot </เวอร์ชัน> <ArtIfactId> Elasticsearch </artifactid> </excusion> </การยกเว้น> </การพึ่งพาอาศัย> <!-https://mvnrepository.com/artifact/com.google.guava/guava-> <! ทำความสะอาดเป็นติดตั้ง douguo.shaded.elasticsearch -> <predency> <sdeperency> <sdeperency> <roupid> com.google.guava </groupId> <ratifactid> Guava </artifactId>
ด้วยวิธีนี้แพ็คเกจ Guava18 อยู่ภายใต้ douguo.shaded.elasticsearch และ ES จะถูกเรียกว่าก่อน Guava16 ที่กำหนดค่าภายนอกจะถูกเรียกโดย HBase แพ็คเกจ JAR 2 เวอร์ชันมีอยู่เป็นอิสระซึ่งกันและกัน!
ณ จุดนี้ปัญหาได้รับการแก้ไขแล้ว!
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น