ข้อ จำกัด การเข้าถึง: ประเภท 'แอปพลิเคชัน' ไม่ใช่ API (ข้อ จำกัด ในไลบรารีที่จำเป็น rt.jar)


178

นี่คือรหัส:

package mscontroller;

import javax.swing.*;
import com.apple.eawt.Application;

public class Main {
    public static void main(String[] args)
    {
        Application app = new Application();
        app.setEnabledAboutMenu(true);

        AMEListener listener = new AMEListener();
        app.addApplicationListener(listener);
        JFrame mainFrame = new JFrame("Application Menu Example");
        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
    }
}

นี่คือข้อผิดพลาด:

Exception in thread "main" java.lang.Error: Unresolved compilation
problems:   Access restriction: The type 'Application' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The constructor 'Application()' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The type 'Application' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The method
'Application.setEnabledAboutMenu(boolean)' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    AMEListener cannot be resolved to a type    AMEListener cannot be
resolved to a type

    at mscontroller.Main.main(Main.java:9)

eclipse พูดว่า:

ข้อ จำกัด การเข้าถึง: ประเภท 'แอปพลิเคชัน' ไม่ใช่ API (ข้อ จำกัด ในไลบรารีที่จำเป็น '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')


3
ลองใช้นี้ใช้ Java 7
spoko

2
ตรวจสอบความเกี่ยวข้องเหล่านี้: stackoverflow.com/questions/860187/… , stackoverflow.com/questions/9266632/…
2864740

ไม่ได้ใช้ Xcode (ยัง)
www139

ฉันไม่คุ้นเคยกับจาวาคนที่แต่งตัวประหลาดไม่ได้ให้เส้นทางที่แน่นอน เขาหมายความว่าอย่างไรโดย: com / sun / xml / internal / **
www139

1
คุณช่วยตีความเส้นทางที่เขาพูดถึงได้ไหม ขอบคุณ! ในอนาคตฉันจะเปลี่ยนเป็น xCode หรือ netbeans คนข้างต้นบอกว่าจะลอง java 7 ฉันควร?
www139

คำตอบ:


276

สิ่งนี้เกิดขึ้นกับฉันเช่นกันและคำตอบที่ได้รับจากที่นี่ก็ไม่เป็นที่น่าพอใจ

พื้นหลัง: ข้อ จำกัด การเข้าถึง Eclipse

Eclipse มีกลไกที่เรียกว่าข้อ จำกัด การเข้าถึงเพื่อป้องกันคุณจากการใช้คลาสโดยไม่ตั้งใจซึ่ง Eclipse คิดว่าไม่ได้เป็นส่วนหนึ่งของ API สาธารณะ โดยปกติแล้ว Eclipse นั้นถูกต้องทั้งสองด้าน: โดยปกติเราไม่ต้องการใช้สิ่งที่ไม่ได้เป็นส่วนหนึ่งของ API สาธารณะ และ Eclipse นั้นถูกต้องเกี่ยวกับอะไรและอะไรที่ไม่ได้เป็นส่วนหนึ่งของ API สาธารณะ

ปัญหา

ตอนนี้อาจมีสถานการณ์ที่คุณต้องการใช้ Non-API สาธารณะเช่นsun.misc(คุณไม่ควรยกเว้นว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่) และอาจมีสถานการณ์ที่ Eclipse ไม่ถูกต้อง (นั่นคือสิ่งที่เกิดขึ้นกับฉันฉันแค่ต้องการใช้javax.smartcardio) ในกรณีนี้เราได้รับข้อผิดพลาดนี้ใน Eclipse

สารละลาย

วิธีแก้ไขคือเปลี่ยนข้อ จำกัด การเข้าถึง

  • ไปที่คุณสมบัติของโปรเจ็กต์ Java ของคุณ
    • เช่นโดยการเลือก "คุณสมบัติ" จากเมนูบริบทของโครงการใน "Package Explorer"
  • ไปที่ "Java Build Path", แท็บ "Libraries"
  • ขยายรายการไลบรารี
  • เลือก
    • "กฎการเข้าถึง"
    • "แก้ไข ... " และ
    • "เพิ่ม ... " a "การแก้ไข: ใช้งานได้" ที่มีรูปแบบกฎที่สอดคล้องกัน สำหรับฉันนั่นคือ " javax/smartcardio/**" สำหรับคุณมันอาจจะเป็น " com/apple/eawt/**" แทนก็ได้

28
ฉันมี Eclipse Mars (4.5.0) และไม่มีกฎการเข้าถึงใน Java Build Path -> Libraries FWIW มีค้อนที่ใหญ่กว่า (คุณสามารถปิดได้ทั้งหมด) ในการตั้งค่า -> Java -> คอมไพเลอร์ -> ข้อผิดพลาด / คำเตือน -> API ที่เลิกใช้แล้วและถูก จำกัด
Jonathan Ross

4
ฉันมี Eclipse Mars.1 Release (4.5.1) สำหรับฉันวิธีแก้ปัญหาทั้งสองทำงาน คำตอบจากคริสเตียนและความคิดเห็นจากโจนาธาน ในแท็บไลบรารี่คุณต้องเปิดอันใดอันหนึ่งในรายการ "JARs และโฟลเดอร์คลาส" เพื่อดู "กฎการเข้าถึง" ที่เป็นของมัน
Laszlo Hirdi

3
สิ่งนี้ไม่ได้ผลสำหรับฉัน Eclipse Luna พยายาม JDK 1.8, 1.7, เพิ่มกฎการเข้าถึง, ทำความสะอาดโครงการ, ข้อผิดพลาดให้กลับมา ลองข้อเสนอแนะของ @JonathanRoss - เป็นลำดับแรกที่ระดับโครงการ ถึงแม้ว่าจะมีการกำหนดค่าระดับโครงการสำหรับ API ที่ต้องห้าม / ไม่สนับสนุนถูกตั้งค่าเป็นคำเตือนฉันยังคงมีข้อผิดพลาด จากนั้นฉันลอง (ตามที่โจนาธานแนะนำ) ผ่านการกำหนดค่าตามความชอบสำหรับการตั้งค่าระดับพื้นที่ทำงานและมี API ที่ต้องห้ามถูกตั้งค่าเป็นข้อผิดพลาด การเปลี่ยนเป็นการเตือนทำให้ปัญหาหายไป แต่การตั้งค่าระดับโครงการควรจะถูกเขียนทับคิดว่าเป็นข้อบกพร่องใน Eclipse
Steve Cohen

2
ฉันไม่ได้รับอนุญาตให้แก้ไขข้อ จำกัด การเข้าถึงในกรณีของฉัน: Eclipse Neon กับโครงการ maven jar บน jar "jfxrt.jar"
pdem

3
มีทางเลือกที่ง่ายกว่ามากคือการลบและเพิ่มไลบรารีระบบ JRE กลับตามที่ระบุไว้ในstackoverflow.com/a/2174607/222838
mico

81

ฉันมีปัญหาเดียวกัน เมื่อฉันเริ่มสร้างโปรเจ็กต์ Java ใน Eclipse ฉันระบุ JRE 8 เมื่อฉันเข้าไปในพา ธ บิลด์ของโปรเจ็กต์และแก้ไข JRE System Library สภาพแวดล้อมการเรียกใช้งาน Java 8 ถูกเลือก เมื่อฉันเลือกที่จะใช้ "Alernate JRE" (ยัง java 8) มันแก้ไขข้อผิดพลาดสำหรับฉัน


2
ฉันต้องการการแก้ไขระดับโลก แต่จะดีกว่าคำตอบอื่น ๆ ทั้งหมดที่เปิดใช้ API แบบ จำกัด ทั่วโลก (ฉันไม่ต้องการใช้ดวงอาทิตย์โดยไม่ตั้งใจ * ในแอปพลิเคชัน javafx ของฉัน)
Mark Jeronimus

1
ขอบคุณสิ่งนี้ล้างคำเตือนทั้งหมดในโครงการของฉัน Eclipse บ่นเกี่ยวกับทุกชั้นเรียนที่จัดทำโดย JavaFX (jfxrt.jar)
Goran Vasic

2
ยืนยัน ... ฉันเปลี่ยน JRE 8 u60 ด้วย ... JRE 8 u60 เห็นได้ชัดว่าการสร้างใหม่นี้จะถูกเรียกใช้ซึ่งตรงกันข้ามกับวิธีอื่นที่จะทำเช่นนั้นมีผลข้างเคียงของการแก้ไขปัญหา (สำหรับคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับวิธีเปลี่ยนการตั้งค่านี้ให้ดูคำตอบของ Nikhil Mahajan ที่นี่: stackoverflow.com/questions/6881622/… .)
ผู้สูงอายุ

ขอบคุณ! ด้วยกลยุทธ์นี้ฉันสามารถรวบรวมเฟรมเวิร์ก java spark ได้สำเร็จ
Martin Pabst

1
สิ่งนี้ทำงานได้แปลก ฉันมี JDK หนึ่งตัวเท่านั้น ช่างน่ากลัวขนาดไหน
WesternGun

65

การเพิ่มสิทธิ์ที่สามารถเข้าถึงได้javafxใน eclipse oxygen ไปที่โครงการ> คุณสมบัติ> เส้นทางสร้าง java> ไลบรารี> จากนั้นขยายไลบรารีและดับเบิลคลิกที่> กฎการเข้าถึงที่นั่นคุณตั้งค่าการอนุญาตการแก้ไข: รูปแบบกฎที่สามารถเข้าถึงได้: javafx / **

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

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

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


23

ในการเริ่มต้นด้วย ( และไม่เกี่ยวข้อง ) การยกApplicationระดับชั้นเรียนด้วยตัวเองดูเหมือนจะไม่เป็นการใช้ที่ตั้งใจ จากสิ่งที่เราสามารถอ่านได้จากแหล่งที่มาคุณคาดว่าจะใช้อินสแตนซ์แบบสแตติกที่ส่งคืนโดยgetApplication()คุณคาดว่าค่อนข้างที่จะใช้อินสแตนซ์คงกลับโดย

ตอนนี้ไปที่รายงานข้อผิดพลาดของ Eclipse ฉันพบปัญหาที่คล้ายกันเมื่อเร็ว ๆ นี้:Access restriction: The method ... is not API (restriction on required project)นี้: ฉันเรียกวิธีการดังกล่าวว่าเป็นวิธีการหนึ่งของวัตถุซึ่งสืบทอดวิธีการนั้นจากคลาสสุดยอด สิ่งที่ฉันต้องทำก็คือการเพิ่มแพ็กเกจที่คลาสซุปเปอร์อยู่ในแพ็คเกจที่นำเข้าโดยปลั๊กอินของฉัน

อย่างไรก็ตามมีหลายสาเหตุที่แตกต่างกันสำหรับข้อผิดพลาดตาม"ข้อ จำกัด ในโครงการ / ไลบรารีที่จำเป็น " คล้ายกับปัญหาที่อธิบายไว้ข้างต้นประเภทที่คุณใช้อาจมีการอ้างอิงกับแพ็กเกจที่ไม่ได้ถูกส่งออกโดยห้องสมุดหรืออาจไม่ได้ถูกส่งออกเอง ในกรณีนี้คุณสามารถลองติดตามแพ็คเกจที่หายไปและส่งออกด้วยตนเองตามที่แนะนำที่นี่หรือลองใช้กฎการเข้าถึง สถานการณ์ที่เป็นไปได้อื่น ๆ ได้แก่ :

  • Eclipse ต้องการป้องกันไม่ให้คุณใช้แพ็คเกจที่มีอยู่ซึ่งไม่ได้เป็นส่วนหนึ่งของ Java API สาธารณะ (โซลูชัน1 , 2 )
  • การพึ่งพานั้นขึ้นอยู่กับแหล่งที่มาหลายรุ่นเวอร์ชันที่ขัดแย้งกันเป็นต้น (โซลูชัน1 , 2 , 3 )
  • Eclipse ใช้ JRE ซึ่งจำเป็นต้องใช้ JDK (ซึ่งอาจเป็นกรณีนี้จากข้อผิดพลาดที่คุณพูดวิธีแก้ไข ) หรือรุ่น JRE / JDK ในเส้นทางการสร้างโครงการไม่ถูกต้อง

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


18

ฉันมีปัญหานี้เพราะแง่มุมของโปรเจ็กต์ที่เกี่ยวข้องกับโปรเจ็กต์ของฉันคือเวอร์ชันจาวาที่ไม่ถูกต้อง

เพื่อแก้ไขปัญหานี้ฉันได้ทำสิ่งต่อไปนี้

  1. คลิกขวาที่โครงการและเลือกคุณสมบัติ
  2. เลือก 'Project Facets' และเปลี่ยนเวอร์ชันของจาวาเป็นอะไรที่มากกว่า 1.4
  3. คลิก [นำไปใช้]

สิ่งนี้จะสร้างโครงการของคุณใหม่และหวังว่าข้อผิดพลาดจะได้รับการแก้ไข


15

เราต้องเปลี่ยนแอปพลิเคชันของเราเพื่อสร้างเทียบกับ JDK 1.8 โดยใช้Window-> Preferences-> Java-> JRE ที่ติดตั้งไว้ อย่างไรก็ตามหลังจากเปลี่ยนแล้วไลบรารีระบบ JRE ที่ระบุใน Project Explorer ยังคงไม่ถูกต้อง ในการแก้ไขปัญหานี้ให้คลิกขวาที่ "ไลบรารีระบบ JRE [ไม่ถูกต้อง jre-here]" และเปลี่ยนจากสภาพแวดล้อมการดำเนินการ: เป็น "ค่าเริ่มต้นของพื้นที่ทำงาน (ค่าเริ่มต้นของพื้นที่ทำงานที่นี่)"

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


1
ขอบคุณ! ทำให้ชีวิตฉันปลอดภัย :)
KMC


12

ในแถบเมนูด้านบน Eclipse:

Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> 
Deprecated and restricted API -> Forbidden reference (access rules): -> change to warning

9

หากคุณมีปัญหาเดียวกันนี้โดยใช้ Spring Tool Suite:

IDE พื้นฐานของ Spring Tool Suite คือ Eclipse ฉันได้รับข้อผิดพลาดนี้ตอนนี้พยายามใช้บางcom.sun.netคลาส หากต้องการลบข้อผิดพลาดเหล่านี้และป้องกันไม่ให้ popping ในแพลตฟอร์ม Eclipse Luna SR1 (4.4.2) ของ STS:

  • นำทางไปยังโครงการ> คุณสมบัติ
  • ขยายส่วนหัว Java Compiler
  • คลิกที่ข้อผิดพลาด / คำเตือน
  • ขยาย API ที่เลิกใช้แล้วและถูก จำกัด
  • ถัดจาก "การอ้างอิงที่ต้องห้าม (กฎการเข้าถึง)" เลือก "ละเว้น"
  • ถัดจาก "การอ้างอิงที่ท้อแท้ (กฎการเข้าถึง)" เลือก "ละเว้น"

คุณดีไปแล้ว


6

มีปัญหาเดียวกัน นี่คือวิธีที่ฉันแก้ไขมัน: ไปที่ Package Explorer คลิกขวาที่ไลบรารีระบบ JRE และไปที่คุณสมบัติ ใน Classpath Container> เลือก JRE สำหรับพา ธ บิลด์โครงการเลือกตัวเลือกที่สาม (JRE ดีฟอลต์ของเวิร์กสเปซ)

ที่มา: https://thenewboston.com/forum/topic.php?id=3917


1
ขอบคุณ ... โดยใช้คำตอบที่ C Hujer พบจริง ๆ แล้วมี "162 กฎ (ไม่สามารถแก้ไขได้)" สำหรับไฟล์ jfxrt.jar!
ไมค์หนู

5

ไปที่การตั้งค่าต่อไปนี้:

หน้าต่าง -> การตั้งค่า -> การอ้างอิง Java-Compiler- ข้อผิดพลาด / คำเตือน - เลิกใช้และถูก จำกัด - API (กฎการเข้าถึง)

ตั้งค่าให้หรือWarningIgnore


5

เราใช้ IBM Rational Application Developer (RAD) และมีปัญหาเดียวกัน

ข้อความผิดพลาด:

ข้อ จำกัด การเข้าถึง: ประเภท 'JAXWSProperties' ไม่ใช่ API (ข้อ จำกัด ของไลบรารีที่ต้องการ 'C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar')

สารละลาย:

ไปที่ java build พา ธ และใต้แท็บ Library ลบ JRE System Library จากนั้นเพิ่มไลบรารีอีกครั้ง -> ไลบรารีระบบ JRE


4

ใน Eclipse Mars.2 Release (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
เลือก JRE ... และกดแก้ไข: สลับเป็น Workspace JRE (jdk1.8.0_77)

ได้ผลสำหรับฉัน


3

ฉันมีคราส JRE 8.112 ไม่แน่ใจว่าสิ่งนั้นสำคัญ แต่สิ่งที่ฉันทำคือ:

  1. คลิกขวาที่โฟลเดอร์โครงการของฉัน
  2. ลงไปที่คุณสมบัติและคลิก
  3. คลิกที่โฟลเดอร์พา ธ การสร้าง Java
  4. เมื่ออยู่ข้างในฉันอยู่ในการสั่งซื้อและส่งออก
  5. ฉันตรวจสอบไลบรารีระบบ JRE [jre1.8.0_112]
  6. จากนั้นย้ายขึ้นเหนือไลบรารีระบบ JRE อื่นที่นั่น (ไม่แน่ใจว่าสิ่งนี้สำคัญหรือไม่)
  7. จากนั้นกดตกลง

นี่เป็นการแก้ไขปัญหาของฉัน



1

ฉันใช้ eclipse นีออน 3 ฉันแค่ต้องการใช้ javafx.application.Application ดังนั้นฉันจึงปฏิบัติตามคำตอบของ Christian Hujer ด้านบนและใช้งานได้ เพียงคำแนะนำ: กฎการเข้าถึงคล้ายกับคำสั่งนำเข้า สำหรับฉันกฎการเข้าถึงที่ฉันเพิ่มคือ "javafx / application / **" เพียงแทนที่จุดในคำสั่งการนำเข้าด้วยเครื่องหมายสแลชและนั่นคือกฎ หวังว่าจะช่วย


1

ฉันมีปัญหาแตกต่างกันเล็กน้อย ในโครงการ - คุณสมบัติ - ไลบรารี - ไลบรารี JRE ฉันมีเวอร์ชัน JRE lib ที่ไม่ถูกต้อง ลบและตั้งค่าจริงและ voila - Access restriction...คำเตือนทั้งหมดอยู่ห่าง


1

แม้ว่าคำถามเก่าสำหรับฉันใน Eclipse ฉันเพียงคลิกขวาที่โฟลเดอร์ Srcและคุณสมบัติ (Alt + Enter) และตรวจสอบIgnore optional compile problemsข้อผิดพลาดที่ถูกลบออก

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


0

หากมีใครมีปัญหานี้เฉพาะในเครื่องมือ CI ของคุณในขณะที่ทำงาน Maven MANIFEST.MFสิ่งที่ได้เคล็ดลับสำหรับผมคือการกำหนดอย่างชัดเจนสภาพแวดล้อมการดำเนินการในของคุณ

ในกรณีของฉันฉันทำสิ่งนี้โดยการแทรกบรรทัดต่อไปนี้ในไฟล์รายการบันเดิล OSGi ของฉัน:

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