Hạn chế truy cập: Loại 'Ứng dụng' không phải là API (hạn chế đối với thư viện bắt buộc rt.jar)


178

Đây là mã:

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);
    }
}

đây là lỗi:

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)

nhật thực nói điều này:

Hạn chế truy cập: Loại 'Ứng dụng' không phải là API (hạn chế đối với thư viện bắt buộc '/ L Library / Java / JavaVirtualMachines / jdk1.8.0_11.jdk / Content / Hom / jre / lib / art.jar')


3
Hãy thử chạy nó bằng Java 7.
spoko


Không sử dụng Xcode (chưa)
www139

Tôi không quen với java, anh ta không đưa ra một con đường chính xác. Anh ta có ý gì bởi: com / sun / xml / Internal / **
www139

1
Bạn có thể giải thích con đường mà anh ấy đang nói về? Cảm ơn bạn! Trong tương lai tôi sẽ chuyển sang xCode hoặc netbeans. Anh chàng nói trên nên dùng java 7 có nên không?
www139

Câu trả lời:


276

Điều này cũng xảy ra với tôi và câu trả lời được đưa ra ở đây không thỏa mãn, vì vậy tôi đã tự nghiên cứu.

Bối cảnh: Hạn chế truy cập Eclipse

Eclipse có một cơ chế gọi là hạn chế truy cập để ngăn bạn vô tình sử dụng các lớp mà Eclipse cho rằng không phải là một phần của API công khai. Thông thường, Eclipse nói đúng về điều đó, theo cả hai nghĩa: Chúng ta thường không muốn sử dụng thứ gì đó không phải là một phần của API công khai. Và Eclipse thường đúng về những gì và không phải là một phần của API công khai.

Vấn đề

Bây giờ, có thể có các tình huống, nơi bạn muốn sử dụng Non-API công khai, như sun.misc(bạn không nên, trừ khi bạn biết bạn đang làm gì). Và có thể có những tình huống, trong đó Eclipse không thực sự đúng (đó là những gì đã xảy ra với tôi, tôi chỉ muốn sử dụng javax.smartcardio). Trong trường hợp đó, chúng tôi gặp lỗi này trong Eclipse.

Giải pháp

Giải pháp là thay đổi các hạn chế truy cập.

  • Chuyển đến các thuộc tính của dự án Java của bạn,
    • tức là bằng cách chọn "Thuộc tính" từ menu ngữ cảnh của dự án trong "Gói Explorer".
  • Chuyển đến "Đường dẫn xây dựng Java", tab "Thư viện".
  • Mở rộng mục nhập thư viện
  • lựa chọn
    • "Quy tắc truy cập",
    • "Chỉnh sửa ..." và
    • "Thêm ..." một "Độ phân giải: Có thể truy cập" với mẫu quy tắc tương ứng. Đối với tôi đó là " javax/smartcardio/**", đối với bạn nó có thể là " com/apple/eawt/**".

28
Tôi có Eclipse Mars (4.5.0) và không có quy tắc truy cập nào trong Java Build Path -> Thư viện. FWIW có một cái búa lớn hơn (bạn có thể tắt tất cả chúng) trong Tùy chọn -> Java -> Trình biên dịch -> Lỗi / Cảnh báo -> API không dùng nữa và bị hạn chế.
Jonathan Ross

4
Tôi có Bản phát hành Mars.1 (4.5.1). Đối với tôi cả hai giải pháp làm việc. Câu trả lời từ Christian và bình luận từ Jonathan. Trong tab Thư viện, bạn phải mở một trong số "JAR và thư mục lớp" được liệt kê để xem "Quy tắc truy cập" thuộc về nó.
Laszlo Hirdi

3
Điều này KHÔNG làm việc cho tôi. Nguyệt thực Luna. Đã thử JDK 1.8, 1.7, thêm quy tắc truy cập, dự án sạch, các lỗi tiếp tục quay trở lại. Cũng đã thử đề xuất của @JonathanRoss - đầu tiên ở cấp độ dự án. Ở đó, mặc dù các cấu hình cấp dự án cho các API bị cấm / không được khuyến khích được đặt thành Cảnh báo, tôi vẫn gặp lỗi. Sau đó, tôi đã thử (như Jonathan đề xuất) thông qua các tùy chọn cho cài đặt mức không gian làm việc và THERE, API bị cấm được đặt thành Lỗi. Thay đổi thành cảnh báo đã làm cho vấn đề biến mất, nhưng cài đặt mức dự án nên được ghi đè, nghĩ rằng đó là một lỗi trong Eclipse.
Steve Cohen

2
Tôi đã không được phép sửa đổi hạn chế truy cập trong trường hợp của mình: Eclipse neon với dự án maven jar trên jar "jfxrt.jar".
pdem

2
Có một cách khác đơn giản hơn nhiều: xóa và thêm lại Thư viện hệ thống JRE, như được chỉ ra trong stackoverflow.com/a/2174607/222838
mico

81

Tôi đã có cùng một vấn đề. Khi tôi ban đầu tạo dự án java trong Eclipse, tôi đã chỉ định JRE 8. Khi tôi đi vào đường dẫn xây dựng của dự án và chỉnh sửa Thư viện hệ thống JRE, môi trường thực thi Java 8 đã được chọn. Khi tôi chọn sử dụng "Alernate JRE" (vẫn là java 8), nó đã sửa lỗi cho tôi.


2
Tôi muốn sửa lỗi toàn cầu, nhưng nó tốt hơn tất cả các câu trả lời khác cho phép API bị hạn chế trên toàn cầu. (Tôi không muốn vô tình sử dụng mặt trời. * Trong ứng dụng javafx của mình).
Mark Jeronimus

1
Cảm ơn, điều này đã xóa tất cả các cảnh báo trong dự án của tôi. Eclipse đã phàn nàn về tất cả các lớp được cung cấp bởi JavaFX (jfxrt.jar)
Goran Vasic

2
Xác nhận ... Tôi đã thay đổi JRE 8 u60 bằng ... JRE 8 u60. Rõ ràng, việc xây dựng lại này được kích hoạt, trái ngược với bất kỳ cách nào khác để làm như vậy, có tác dụng phụ trong việc khắc phục vấn đề. (Để được giải thích chi tiết hơn về cách thay đổi cài đặt này, hãy xem câu trả lời của Nikhil Mahajan tại đây: stackoverflow.com/questions/6881622/ nam .)
người cao tuổi

Cảm ơn bạn! Với chiến lược này, tôi đã có thể biên dịch thành công khung java spark.
Martin Pabst

1
Kỳ lạ là điều này đã làm việc. Tôi chỉ có một JDK được cài đặt. Thật kỳ lạ.
WesternGun

65

Thêm quyền truy cập javafx trong oxy nhật thực vào dự án> thuộc tính> đường dẫn xây dựng java> thư viện> sau đó mở rộng thư viện và nhấp đúp vào> Quy tắc truy cập ở đó bạn đặt quyền Giải quyết: Mẫu quy tắc có thể truy cập: javafx / **

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


23

Để bắt đầu ( và không liên quan ), việc tự khởi tạo Applicationlớp học dường như không phải là mục đích sử dụng của nó. Từ những gì người ta có thể đọc từ nguồn của nó , bạn sẽ sử dụng thể hiện tĩnh được trả về bởi getApplication().

Bây giờ chúng ta hãy đi đến các báo cáo Eclipse lỗi. Gần đây tôi đã gặp phải một vấn đề tương tự:Access restriction: The method ... is not API (restriction on required project) . Tôi đã gọi phương thức trong câu hỏi là một phương thức của một đối tượng kế thừa phương thức đó từ một siêu lớp. Tất cả những gì tôi phải làm là thêm gói siêu hạng vào các gói được nhập bởi plugin của tôi.

Tuy nhiên, có rất nhiều nguyên nhân khác nhau gây ra lỗi dựa trên "hạn chế đối với dự án / thư viện bắt buộc ". Tương tự như vấn đề được mô tả ở trên, loại bạn đang sử dụng có thể có các phụ thuộc vào các gói không được thư viện xuất hoặc có thể không được xuất. Trong trường hợp đó, bạn có thể cố gắng theo dõi các gói bị thiếu và tự xuất chúng, như được đề xuất ở đây hoặc thử Quy tắc truy cập. Các kịch bản khác có thể bao gồm:

  • Eclipse muốn ngăn bạn sử dụng các gói có sẵn không phải là một phần của API Java công cộng (giải pháp 1 , 2 )
  • Sự phụ thuộc được thỏa mãn bởi nhiều nguồn, các phiên bản xung đột, v.v. (giải pháp 1 , 2 , 3 )
  • Eclipse đang sử dụng JRE trong đó cần có JDK (có thể là trường hợp ở đây, từ những gì lỗi của bạn nói; giải pháp ) hoặc phiên bản JRE / JDK trong đường dẫn xây dựng dự án không phải là đúng

Điều này đã kết thúc giống như một hỗn hợp các vấn đề liên quan đến hạn chế hơn là một câu trả lời thực tế. Nhưng vì hạn chế đối với các dự án bắt buộc là một lỗi linh hoạt như vậy được báo cáo, công thức hoàn hảo có lẽ vẫn còn được tìm thấy.


18

Tôi gặp vấn đề này vì khía cạnh dự án liên quan đến dự án của tôi là phiên bản java sai.

Để khắc phục điều này là tôi đã làm như sau:

  1. Nhấp chuột phải vào dự án và chọn Thuộc tính
  2. Chọn Fac Project Facets 'và thay đổi phiên bản java thành thứ gì đó lớn hơn 1.4.
  3. Nhấp vào [Áp dụng]

Điều này sẽ xây dựng lại dự án của bạn và hy vọng lỗi sẽ được giải quyết.


15

Chúng tôi đã phải thay đổi ứng dụng của mình để xây dựng dựa trên JDK 1.8 bằng Window-> Preferences-> Java-> JREs đã cài đặt . Tuy nhiên, sau khi thay đổi điều đó, Thư viện hệ thống JRE được chỉ định trong Project Explorer vẫn không chính xác. Để khắc phục điều này, nhấp chuột phải vào "Thư viện hệ thống JRE [sai-jre-here]" và thay đổi từ môi trường thực thi: thành "Mặc định không gian làm việc (yer-default-here)"

nhập mô tả hình ảnh ở đây


1
Cảm ơn! Điều đó an toàn cho cuộc sống của tôi :)
KMC

13

Nó hoạt động: Thuộc tính dự án -> ProjectFacets -> Runtimes -> jdk1.8.0_45 -> Áp dụng


hệ thống gác máy :(
Saikat

12

Trong thanh menu trên cùng của Eclipse:

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

9

Nếu bạn gặp vấn đề tương tự khi sử dụng Spring Tool Suite:

IDE cơ bản của Spring Tool Suite, trên thực tế, là Eclipse. Tôi vừa nhận được lỗi này khi cố gắng sử dụng một số com.sun.netlớp. Để loại bỏ các lỗi này và ngăn chúng xuất hiện trong nền tảng Eclipse SR SR1 (4.4.2) của STS:

  • Điều hướng đến Dự án> Thuộc tính
  • Mở rộng tiêu đề Trình biên dịch Java
  • Nhấp vào Lỗi / Cảnh báo
  • Mở rộng API không dùng nữa và bị hạn chế
  • Bên cạnh "Tham chiếu bị cấm (quy tắc truy cập)" chọn "bỏ qua"
  • Bên cạnh "Tham chiếu không khuyến khích (quy tắc truy cập)" chọn "bỏ qua"

Bạn tốt để đi.


6

Có cùng một vấn đề. Đây là cách tôi giải quyết: Đi đến Gói Explorer. Nhấp chuột phải vào Thư viện hệ thống JRE và đi đến Thuộc tính. Trong Classpath Container> Chọn JRE cho đường dẫn xây dựng dự án, chọn tùy chọn thứ ba (JRE mặc định của Workspace).

Nguồn: https://thenewboston.com/forum/topic.php?id=3917


1
Cảm ơn ... bằng cách sử dụng câu trả lời được đề xuất bởi C Hujer, tôi thực sự đã tìm thấy có "162 quy tắc (không thể sửa đổi)" cho tệp jfxrt.jar!
mike gặm nhấm

5

Chuyển đến cài đặt sau:

Cửa sổ -> Tùy chọn -> Trình biên dịch Java-Lỗi / Cảnh báo-Không dùng và tham chiếu API bị hạn chế (quy tắc truy cập)

Đặt nó thành Warninghoặc Ignore.


5

Chúng tôi sử dụng IBM Rational Application Developer (RAD) và có cùng một vấn đề.

Thông báo lỗi:

Hạn chế truy cập: Loại 'JAXWSProperIES' không phải là API (hạn chế đối với thư viện bắt buộc 'C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar')

Giải pháp:

đi tới đường dẫn xây dựng java và trong tab Thư viện, xóa Thư viện hệ thống JRE. Sau đó, một lần nữa Thêm Thư viện -> Thư viện hệ thống JRE


4

Trong Bản phát hành Mars.2 (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
chọn JRE ... và nhấn Chỉnh sửa: Chuyển sang Không gian làm việc JRE (jdk1.8.0_77)

Làm việc cho tôi.


3

Tôi có nhật thực JRE 8.112, không chắc có vấn đề gì không nhưng những gì tôi đã làm là thế này:

  1. Nhấp chuột phải vào thư mục dự án của tôi
  2. đi xuống tài sản và nhấp
  3. nhấp vào thư mục đường dẫn xây dựng java
  4. Một khi bên trong, tôi đã được đặt hàng và xuất khẩu
  5. Tôi đã kiểm tra Thư viện hệ thống JRE [jre1.8.0_112]
  6. sau đó di chuyển nó lên trên một thư viện hệ thống JRE khác ở đó (không chắc điều này có quan trọng không)
  7. sau đó nhấn ok

Điều này đã giải quyết vấn đề của tôi.


2

Tôi chỉ đơn giản là thêm e (fx) clipse trong thị trường nhật thực. Dễ dàng và đơn giản


1

Tôi đang sử dụng nhật thực neon 3. Tôi chỉ muốn sử dụng javafx.application.Application, vì vậy tôi đã làm theo câu trả lời của Christian Hujun ở trên và nó đã hoạt động. Chỉ cần một số mẹo: quy tắc truy cập rất giống với câu lệnh nhập. Đối với tôi, các quy tắc truy cập mà tôi đã thêm là "javafx / application / **". Chỉ cần thay thế dấu chấm trong câu lệnh nhập bằng dấu gạch chéo về phía trước và đó là quy tắc. Mong rằng sẽ giúp.


1

Tôi đã có một chút vấn đề khác nhau. Trong Project - Properties - Thư viện - Thư viện JRE, tôi đã có phiên bản lib JRE sai. Xóa và đặt cái thực tế và voila - tất cả các Access restriction...cảnh báo đều biến mất.


1

Ngay cả khi câu hỏi cũ của nó, đối với tôi trong Eclipse, tôi chỉ cần nhấp chuột phải vào thư mục Src và các thuộc tính (Alt + Enter) và kiểm tra Ignore optional compile problemslỗi đã loại bỏ.

nhập mô tả hình ảnh ở đây


0

Nếu ai đó chỉ gặp vấn đề này trong công cụ CI của bạn khi chạy maven, thì mẹo cho tôi là xác định rõ ràng môi trường thực thi trong của bạn MANIFEST.MF.

Trong trường hợp của tôi, tôi đã làm điều này bằng cách chèn dòng sau vào tệp kê khai gói OSGi của tôi:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.