การ จำกัด การเข้าถึงในชั้นเรียนเนื่องจากข้อ จำกัด ในไลบรารีที่จำเป็น rt.jar?


824

ฉันพยายามที่จะรวบรวมJava 1.4รหัสที่ถูกสร้างขึ้นโดยไอบีเอ็ม WSDL2JavaในJava5โดยไม่ต้องสร้างไม่สมบูรณ์และเห็นข้อผิดพลาดในEclipse
ฉันอยู่ภายใต้การสันนิษฐานว่าต้นขั้วที่สร้างขึ้นควรรวบรวมตราบเท่าที่รันไทม์jarsพร้อมใช้งาน (มี)

Access restriction: The type QName is not accessible due to restriction on required library C:\Program Files\Java\jdk1.5.0_16\jre\lib\rt.jar

ชื่อคลาสเต็มคือ javax.xml.namespace.QName

เกิดอะไรขึ้นที่นี่? เป็นกรณีที่ฉันพยายาม refactor หมูจากไส้กรอกหรือไม่ ฉันดีกว่าที่จะสร้างต้นขั้วขึ้นใหม่หรือไม่


1
ฉันไม่เข้าใจทำไมคุณไม่รวบรวมมันไว้ที่อื่นและเรียกใช้มันในเป้าหมายของคุณ (ฉันเดา) สภาพแวดล้อม 1.4?
Tim Büthe

สภาพแวดล้อมเป้าหมายสุดท้ายคือ jboss4.2 บน jdk5
พะยอม

2
เกี่ยวกับ "การป้องกัน" สถานะ: ใน StackOverflow ไม่มีอะไรบอกว่า "ขอบคุณ" หรือ "ฉันเกินไป" เป็น upvote;)
OscarRyz

6
ดูคำตอบที่ได้รับการโหวตมากที่สุด ... ดูรายละเอียดที่เหลือของหน้านี้ 96% ค้นหา: "Nels Beckman", 1 ก.พ. 53 เวลา 4:09 น.
จะ

1
สิ่งที่ใช้ได้ผลสำหรับฉันคือการแก้ไข / เปลี่ยนไลบรารีระบบ JRE จากสภาวะแวดล้อมการเรียกใช้งาน (หรือค่าดีฟอลต์ของเวิร์กสเปซ)เป็นJRE สำรอง (ฉันเลือกเวอร์ชัน Java เดียวกัน) คุณต้องตรวจสอบให้แน่ใจ(1)ลำดับที่ถูกต้องในแท็บคำสั่งซื้อและส่งออก(2)ระดับความสอดคล้องที่ถูกต้องในการตั้งค่าJava Compiler (เช่นเดียวกับรุ่น Java ที่เลือก)
ADTC

คำตอบ:


1884

มีวิธีแก้ไขปัญหาอื่นที่ใช้งานได้

  1. ไปที่การตั้งค่าBuild Pathในคุณสมบัติโครงการ
  2. ลบไลบรารีระบบ JRE
  3. เพิ่มกลับ เลือก"เพิ่มห้องสมุด"และเลือกระบบห้องสมุด JRE ค่าเริ่มต้นใช้งานได้สำหรับฉัน

สิ่งนี้ได้ผลเพราะคุณมีหลายคลาสในไฟล์ jar ที่แตกต่างกัน การลบและเพิ่ม JRE lib ใหม่จะทำให้คลาสที่ถูกต้องเป็นอันดับแรก หากคุณต้องการโซลูชันพื้นฐานให้แน่ใจว่าคุณแยกไฟล์ jar ด้วยคลาสเดียวกัน

สำหรับฉันฉันได้: javax.xml.soap.SOAPPartในสามขวดที่แตกต่างกันaxis-saaj-1.4.jar, saaj-api-1.3.jarและrt.jar


1
มันเป็นข้อผิดพลาดของ Eclipse หรือเราตั้งใจแก้ไขข้อ จำกัด (และละเมิดข้อกำหนดสิทธิการใช้งาน) โดยไม่ได้ตั้งใจหรือไม่? หากเป็นข้อผิดพลาด Eclipse จะมีการบันทึกข้อบกพร่องหรือไม่
docwhat

@Doctor ฉันไม่เคยใช้สิ่งนี้กับรหัสที่มีความสำคัญเป็นพิเศษดังนั้นฉันจึงไม่ได้ตรวจสอบอะไรอีกต่อไป ... หากคุณพบสิ่งใดโปรดแจ้งให้เราทราบ
Nels Beckman

3
@ URL87 หากคุณคลิกขวาที่โฟลเดอร์โครงการไปที่ "Build Path ... ", "Configure Build Path", "Libraries" (แท็บ) คุณควรเห็น "Add Library" เป็นปุ่มใดปุ่มหนึ่งทางด้านขวา .. สิ่งนี้ได้ผลดีสำหรับฉันเช่นกันคำตอบที่ยอดเยี่ยม
Alexei Blue

8
ทางออกที่ดีกว่าใน Eclipse เวอร์ชันล่าสุดคือไม่ลบ JRE System Library แต่ไปที่แท็บ "สั่งซื้อและส่งออก" และย้ายไลบรารีระบบ JRE ไปด้านล่าง (ซึ่งเป็นสิ่งที่มีประสิทธิภาพในการลบและเพิ่ม แต่คุณไม่ต้องทำ ไม่จำเป็นต้องลบและเพิ่มเพื่อทำมัน)
user1676075

1
นี่คือ 2018 และรุ่นคราสคือ 5.0 ข้อบกพร่อง / ปัญหานี้ยังคงมีอยู่ ขอบคุณมาก @NelsBeckman คำตอบของคุณได้ช่วยฉันหลังจาก 3/4 ของทศวรรษนับตั้งแต่มีการโพสต์
Aravamudhan

120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.htmlทำงานได้ดีที่สุดสำหรับฉัน

บน Windows: Windows -> การตั้งค่า -> Java -> คอมไพเลอร์ -> ข้อผิดพลาด / คำเตือน -> API ที่ถูกปฏิเสธและ จำกัด -> การอ้างอิงที่ต้องห้าม (กฎการเข้าถึง): -> เปลี่ยนเป็นคำเตือน

บน Mac OS X / Linux: Eclipse -> การตั้งค่า -> Java -> คอมไพเลอร์ -> ข้อผิดพลาด / คำเตือน -> API ที่ถูกปฏิเสธและ จำกัด -> การอ้างอิงที่ต้องห้าม (กฎการเข้าถึง): -> เปลี่ยนเป็นคำเตือน


62
สิ่งนี้อาจใช้งานได้ แต่มันไม่ใช่ทางออกที่เหมาะสม คุณต้องเข้าใจว่าทำไมข้อ จำกัด การเข้าถึงจึงมีอยู่ตั้งแต่แรก มันจะซ่อนกรณีในอนาคตทั้งหมดนี้ซึ่งอาจสำคัญกว่า!
Adrian Mouat

1
@AdrianMouat ที่ไม่เกี่ยวข้องเลยทีเดียว ถ้าฉันต้องการให้มันหายไปฉันก็อยากให้มันหายไป แต่แน่นอน - จะต้องไม่มีรหัสสำหรับ API ที่ไม่ใช่สาธารณะไม่ใช่
stolsvik

3
@stolsvik - คุณทำให้ฉันหลงทาง คุณกำลังบอกเหตุผลว่าทำไมปัญหาที่มีอยู่นั้นไม่เกี่ยวข้อง?
Adrian Mouat

1
ฉันมีปัญหานี้ในหนึ่งวิธี ฉันนึกภาพการใช้ JDK ทางเลือก (เช่น OpenJDK เป็นตัวเลือกที่ดีกว่า) ที่กล่าวว่าสำหรับสิ่งหนึ่งมันอาจจะเจ๋งครั้งเดียว ไม่อยู่ในรหัสการผลิต ไม่ใช่เพื่อความพยายามในการออกแบบ ฉันไม่สามารถบอกคุณได้ว่าจำนวนชั่วโมงของคนที่โดนแฮ็คประเภทนี้
จะ

5
@AdrianMouat - เข้าท่า ฉันเกลียดที่จะทำสิ่งนี้ในเครื่องปฏิกรณ์นิวเคลียร์ - ความร้อนในห้องควบคุมมากเกินไป? ดังนั้นปิดการใช้งานคำเตือนทั้งหมด ทำข่าวใหญ่ในวันถัดไป : P
david blaine

67

ฉันพบปัญหาเดียวกัน ผมพบคำตอบในเว็บไซต์: http://www.17ext.com
ก่อนอื่นให้ลบไลบรารีระบบ JRE จากนั้นอิมพอร์ตไลบรารีระบบ JRE อีกครั้ง

ฉันไม่รู้ว่าทำไมไม่ว่าจะแก้ไขปัญหาของฉันอย่างไรหวังว่ามันจะช่วยคุณได้


10
เห็นได้ชัดว่าคุณตอบคำถามนี้แบบเดียวกับฉันเมื่อหลายเดือนก่อน ไม่แน่ใจว่าทำไมฉันไม่เห็นคำตอบของคุณในตอนนั้น ...
Nels Beckman

34

ฉันเดาว่าคุณกำลังพยายามที่จะแทนที่คลาสมาตรฐานซึ่งมาพร้อมกับ Java 5 ด้วยหนึ่งในไลบรารีที่คุณมี

สิ่งนี้ไม่ได้รับอนุญาตภายใต้เงื่อนไขของข้อตกลงสิทธิ์การใช้งานอย่างไรก็ตาม AFAIK ไม่ได้บังคับใช้จนถึง Java 5

ฉันเคยเห็นสิ่งนี้ด้วย QName มาก่อนและฉัน "แก้ไข" โดยลบคลาสออกจากเหยือกที่ฉันมี

แก้ไข http://www.manpagez.com/man/1/java/หมายเหตุสำหรับตัวเลือก "-Xbootclasspath:"

"แอปพลิเคชันที่ใช้ตัวเลือกนี้เพื่อจุดประสงค์ในการเอาชนะคลาสใน rt.jar ไม่ควรนำไปใช้เพราะจะเป็นการฝ่าฝืนใบอนุญาตเลขฐานสองของ Java 2 Runtime Environment"

http://www.idt.mdh.se/rc/sumo/aJile/Uppackat/jre/LICENSE

"Java Technology Restrictions คุณไม่สามารถแก้ไข Java Platform Interface (" JPI "ซึ่งระบุว่าเป็นคลาสที่อยู่ในแพ็คเกจ" java "หรือแพ็กเกจย่อยของแพ็กเกจ" java ") โดยการสร้างคลาสเพิ่มเติมภายใน JPI หรือสาเหตุอื่น นอกจากนี้หรือการดัดแปลงคลาสใน JPI ในกรณีที่คุณสร้างคลาสเพิ่มเติมและ API ที่เกี่ยวข้องซึ่ง (i) ขยายการทำงานของแพลตฟอร์ม Java และ (ii) ถูกเปิดเผยต่อผู้พัฒนาซอฟต์แวร์บุคคลที่สามสำหรับ วัตถุประสงค์ของการพัฒนาซอฟต์แวร์เพิ่มเติมซึ่งเรียกใช้ API เพิ่มเติมดังกล่าวคุณจะต้องเผยแพร่ข้อกำหนดที่ถูกต้องสำหรับ API ดังกล่าวโดยทันทีเพื่อการใช้งานฟรีโดยนักพัฒนาทั้งหมดคุณไม่สามารถสร้างหรืออนุญาตสิทธิ์การใช้งานของคุณเพื่อสร้างคลาสเพิ่มเติมอินเทอร์เฟซหรือแพคเกจย่อยที่ระบุว่า "java", "javax", "sun" หรือการประชุมที่คล้ายกันตามที่ระบุโดย Sun ในการกำหนดแบบแผนการตั้งชื่อใด ๆ "


2
แค่นั้นแหละ. ขวดหนึ่งในพา ธ มีคลาส QName อยู่ หา -name "* .jar" -print -exec unzip -t {} \; | grep "QName" พบ
พะยอม

1
คุณสามารถให้ข้อมูลอ้างอิงเกี่ยวกับการไม่อนุญาตให้แทนที่คลาสที่จัดส่งด้วย Java ได้หรือไม่? สิ่งที่ฉันพบในข้อตกลงใบอนุญาตเป็นข้อ จำกัด ที่เกี่ยวข้องกับการเผยแพร่ Java เองไม่ใช่โปรแกรม Java แต่ฉันไม่ได้มองหานานนัก
Adrian Mouat

25

ฉันได้รับข้อผิดพลาดนี้เช่นกัน แต่โครงการของฉันสร้างขึ้นบนบรรทัดคำสั่งโดยใช้ Maven และคอมไพเลอร์tycho (เป็นชุดของปลั๊กอิน OSGi) หลังจากการกลั่นกรองจำนวนมากผ่านผู้ที่มีปัญหาเดียวกัน แต่แก้ไขใน Eclipse แทนที่จะเป็นบรรทัดคำสั่งฉันพบข้อความบนฟอรัมนักพัฒนา Tychoที่ตอบคำถามของฉันโดยใช้การตั้งค่าpom.xmlเพื่อละเว้นคำเตือนคอมไพเลอร์เกี่ยวกับข้อ จำกัด การเข้าถึง:

<plugin>
    <groupId>org.eclipse.tycho</groupId>
    <artifactId>tycho-compiler-plugin</artifactId>
    <version>${tycho.version}</version>
    <configuration>
        <compilerArgument>-warn:+discouraged,forbidden</compilerArgument>
    </configuration>
</plugin>

ข้อมูลเพิ่มเติมสามารถพบได้ในTycho คำถามที่พบบ่อย สิ่งนี้ทำให้ฉันมีอายุมากขึ้นในการทำงานดังนั้นฉันจึงคิดว่าฉันจะช่วยเหลือใครก็ตามที่พยายามแก้ไขข้อผิดพลาดการ จำกัด การเข้าถึงเหล่านี้จากบรรทัดคำสั่งโดยโพสต์คำตอบนี้


13
  • ไปที่การตั้งค่า Build Path ในคุณสมบัติโครงการ Windows -> Preferences -> Java Compiler
  • ลบไลบรารีระบบ JRE
  • เพิ่ม JRE อีกอันด้วย "คู่แท้"
  • ทำความสะอาดและสร้างโครงการของคุณอีกครั้ง มันใช้งานได้สำหรับฉัน

13

ฉันเพิ่งมีปัญหานี้ด้วย เห็นได้ชัดว่าฉันได้ตั้ง JRE เป็น 1.5 แทนที่จะเป็น 1.6 ในเส้นทางการสร้างของฉัน


1
ปัญหาเดียวกันที่นี่ ในกรณีของฉันใช้ Maven ซึ่งเริ่มต้นที่ 1.5 หากไม่ได้ระบุ
Greg Haskins

อย่าลืมใส่ไว้ใน POM ของคุณดังนั้นจึงไม่เปลี่ยนกลับเมื่อมีการอัปเดต <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </properties>
Philip Rego

8

นอกจากวิธีแก้ปัญหาของ Nels Beckmanฉันมีเคล็ดลับต่อไปนี้:

ภายใต้การกำหนดค่าการสร้างเส้นทางผมต้องจัดเรียงลำดับของรายการของฉันที่อยู่ภายใต้การสั่งซื้อและการส่งออก

นอกจากนี้ในฐานะนักพัฒนา Eclipse PDE ฉันต้องจัดเรียงลำดับการพึ่งพาของฉันMANIFEST.MFใหม่อีกครั้งโดยเพิ่มแพ็คเกจที่มีปัญหาเป็นอันดับแรกในรายการ

การเล่นกับแป้นหมุนเหล่านี้พร้อมกับการเรียกใช้โครงการ> ล้างในระหว่างนั้นฉันสามารถแก้ไขคำเตือนเหล่านี้ได้


8

สำหรับฉันแล้วฉันจะแก้มันอย่างไร:

  • ไปที่เส้นทางการสร้างของโครงการปัจจุบัน

ภายใต้ห้องสมุด

  • เลือก " JRE System Library [jdk1.8xxx]"
  • คลิกแก้ไข
  • และเลือก "เริ่มต้นพื้นที่ทำงาน JRE (jdk1.8xx)" หรือ JRE สำรอง
  • คลิกเสร็จสิ้น
  • คลิกตกลง

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: ตรวจสอบให้แน่ใจว่าใน Eclipse / Preferences (ไม่ใช่โครงการ) / Java / ที่ติดตั้ง JRE ว่า jdk ชี้ไปที่โฟลเดอร์ JDK ไม่ใช่ JRE C: \ Program Files \ Java \ jdk1.8.0_74

ป้อนคำอธิบายรูปภาพที่นี่


ฉันได้ตั้งค่าไว้ที่ 1.7 ... 79 ดังนั้นฉันจึงตื่นตระหนก แต่ฉันเลือกมันอีกครั้งคลิกนำไปใช้และข้อผิดพลาดก็หายไป ต๊าย
Marvo

ว้าว. สิ่งนี้ช่วยได้ที่นี่เช่นกัน - เปลี่ยนจาก "สภาพแวดล้อมการดำเนินการ" เป็น "JRE สำรอง" ถ้าใครมีคำอธิบายเชิงตรรกะสำหรับเรื่องนี้ .. (ที่นี่มันเกิดขึ้นหลังจากเปลี่ยน project-faucet Java จาก 1.5 (5.0 ในไฟล์. setset config) เป็น 1.8 การเปลี่ยนจากข้อผิดพลาดเป็นการเตือนใน prefs ทั่วโลก (ดูคำตอบอื่น ๆ ) ไม่ได้ ช่วย: ยังคงมีข้อผิดพลาดเกี่ยวกับคลาสอาทิตย์เก่าที่เราใช้จาก package com.sun.image.codec. *)
hyphan

6

ขออภัยที่อัปเดต POST เก่า ฉันได้รับรายงานปัญหาแล้วและแก้ไขตามที่ได้กล่าวไว้ด้านล่าง

สมมติว่าคุณกำลังใช้ปลั๊กอิน Maven Eclipse + m2e หากคุณได้รับข้อผิดพลาดการ จำกัด การเข้าถึงคลิกขวาที่โครงการ / โมดูลที่คุณมีข้อผิดพลาด -> Properties -> Build Path -> Library -> แทนที่ JDK / JRE สำหรับอันที่ใช้ในเวิร์กสเปซ eclipse

ฉันทำตามขั้นตอนข้างต้นและปัญหาได้รับการแก้ไขแล้ว


ยุติธรรมเพียงพอ แต่โดยทั่วไปคุณได้จำลองถ้อยคำของคำตอบที่ยอมรับโดย Nels Beckman
Steven Wolfe

5

ในกรณีที่คุณแน่ใจว่าคุณควรจะสามารถเข้าถึงคลาสที่กำหนดได้มากกว่านี้อาจหมายความว่าคุณเพิ่มขวดหลายใบในโครงการของคุณที่มีคลาสที่มีชื่อเหมือนกัน (หรือพา ธ ) แต่เนื้อหาที่แตกต่างกัน บิลด์บิวด์มีไลบรารี่ของบุคคลที่ 3 ในตัวรุ่นเก่ากว่า)

ตัวอย่างเช่นเมื่อคุณเพิ่ม jar ที่กำลังใช้งาน:

a.b.c.d1
a.b.c.d2

แต่ยังเป็นรุ่นเก่าที่ใช้งานเท่านั้น:

a.b.c.d1
(d2 is missing altogether or has restricted access)

ทุกอย่างใช้งานได้ดีในโปรแกรมแก้ไขโค้ด แต่ล้มเหลวในระหว่างการรวบรวมถ้าไลบรารี่ "เก่า" ทับทับสิ่งใหม่ - d2 เปลี่ยนเป็น "หายไปหรือเข้าไม่ถึง" ในทันทีแม้ว่ามันจะอยู่ที่นั่นก็ตาม

การแก้ปัญหาคือการตรวจสอบลำดับของไลบรารีเวลาคอมไพล์และตรวจสอบให้แน่ใจว่ารายการที่มีการใช้งานที่ถูกต้องไปก่อน


4

ไปที่ Java Build Path ในคุณสมบัติโครงการ ลบไลบรารีระบบ JRE ที่มีอยู่จากนั้นเพิ่มอีกครั้งเช่นเพิ่มไลบรารี -> JRE Lib - เลือก jre ---> เสร็จสิ้น สุดท้ายเลือกแท็บคำสั่งซื้อและส่งออกเลือก JRE Lib แล้วเลื่อนไปด้านบน แค่นั้นแหละ.


3

เพียงแค่เปลี่ยนลำดับของการสร้างไลบรารีพา ธ ของโครงการของคุณ คลิกขวาที่โปรเจ็กต์> Build Path> กำหนดค่า Build Path> เลือกคำสั่งซื้อและส่งออก (แท็บ)> เปลี่ยนลำดับของรายการ ฉันหวังว่าการย้าย "ไลบรารี JRE System" ไปที่ด้านล่างจะใช้งานได้ มันทำงานได้สำหรับฉัน ง่ายและเรียบง่าย .... !!!


3

ในกรณีของฉันมีข้อผิดพลาดระหว่าง build path JRE และ JRE ที่ติดตั้งบนสภาพแวดล้อมการทำงาน ฉันย้ายเข้าสู่โปรเจ็กต์> คุณสมบัติ> คอมไพเลอร์ Java มีข้อความเตือนที่ด้านล่าง

ฉันคลิกที่ลิงก์ 'Installed JRE', 'Execution environment', 'Java build path' และเปลี่ยนรุ่น JDK เป็น 1.7 และคำเตือนหายไป


0

การเพิ่ม JRE System ที่ถูกต้องผ่านทางบิลด์เป็นวิธีแก้ปัญหา แต่ eclipse ของคุณยังอาจมีข้อผิดพลาด เพื่อแก้ปัญหานั้นไปที่เส้นทาง Java Build -> สั่งซื้อและส่งออกและย้ายไลบรารีระบบ JRE ของคุณด้านบน นี่เป็นการแก้ไขปัญหาของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.