Ograniczenie dostępu: typ „Aplikacja” nie jest API (ograniczenie wymaganej biblioteki rt.jar)


178

Oto kod:

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

tutaj jest błąd:

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)

zaćmienie mówi tak:

Ograniczenie dostępu: typ „Aplikacja” nie jest API (ograniczenie wymaganej biblioteki „/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar”)


3
Spróbuj uruchomić to za pomocą Java 7.
spoko


Nie używam Xcode (jeszcze)
www139,

Nie jestem zaznajomiony z Javą, facet nie podaje dokładnej ścieżki. Co ma na myśli przez: com / sun / xml / internal / **
www139

1
Czy mógłbyś zinterpretować, o jakiej ścieżce on mówi? Dziękuję Ci! W przyszłości przełączę się na xCode lub netbeans. Facet powyżej powiedział, że powinienem wypróbować Javę 7?
www139,

Odpowiedzi:


276

Mnie też się to przydarzyło, a udzielone tutaj odpowiedzi już nie były satysfakcjonujące, więc przeprowadziłem własne badania.

Tło: ograniczenia dostępu Eclipse

Eclipse ma mechanizm zwany ograniczeniami dostępu który zapobiega przypadkowemu użyciu klas, które zdaniem Eclipse nie są częścią publicznego interfejsu API. Zazwyczaj Eclipse ma co do tego rację, w obu znaczeniach: zwykle nie chcemy używać czegoś, co nie jest częścią publicznego API. Eclipse ma zwykle rację co do tego, co jest, a co nie jest częścią publicznego API.

Problem

Teraz mogą wystąpić sytuacje, w których chcesz użyć publicznego Non-API, na przykład sun.misc(nie powinieneś, chyba że wiesz, co robisz). I mogą być sytuacje, w których Eclipse nie jest naprawdę w porządku (to właśnie mi się przydarzyło, po prostu chciałem użyćjavax.smartcardio ). W takim przypadku otrzymujemy ten błąd w Eclipse.

Rozwiązanie

Rozwiązaniem jest zmiana ograniczeń dostępu.

  • Przejdź do właściwości swojego projektu Java,
    • tzn. wybierając „Właściwości” z menu kontekstowego projektu w „Eksploratorze pakietów”.
  • Przejdź do „Ścieżka budowania Java”, zakładka „Biblioteki”.
  • Rozwiń pozycję biblioteki
  • Wybierz
    • "Zasady dostępu",
    • „Edytuj ...” i
    • „Dodaj ...” a „Rozwiązanie: dostępne” z odpowiednim wzorcem reguły. Dla mnie to było „ javax/smartcardio/**”, dla ciebie mogłoby to być zamiast tego „ com/apple/eawt/**”.

28
Mam Eclipse Mars (4.5.0) i nie ma reguł dostępu w Java Build Path -> Libraries. FWIW jest większy młot (możesz je wszystkie wyłączyć) w Preferencjach -> Java -> Kompilator -> Błędy / Ostrzeżenia -> Przestarzałe i ograniczone API.
Jonathan Ross

4
Mam Eclipse Mars.1 Release (4.5.1). U mnie oba rozwiązania zadziałały. Odpowiedź Christiana i komentarz Jonathana. W zakładce Biblioteki musisz otworzyć jeden z wymienionych „JARów i folderów klas”, aby zobaczyć, że należą do niego „Reguły dostępu”.
Laszlo Hirdi

3
To NIE działa dla mnie. Eclipse Luna. Wypróbowałem JDK 1.8, 1.7, dodane reguły dostępu, czysty projekt, błędy wciąż wracają. Próbowałem także sugestii @JonathanRoss - najpierw na poziomie projektu. Tam, chociaż konfiguracje na poziomie projektu dla zabronionych / zniechęconych interfejsów API były ustawione na Ostrzeżenie, nadal pojawiają się błędy. Następnie spróbowałem (jak zasugerował Jonathan) przejść przez preferencje dotyczące ustawień na poziomie obszaru roboczego i TAM, zabronione interfejsy API zostały ustawione na błąd. Zmiana na ostrzeżenie sprawiła, że ​​problem zniknął, ale ustawienie na poziomie projektu powinno było zostać zastąpione, myślę, że to błąd w Eclipse.
Steve Cohen

2
Nie pozwolono mi modyfikować ograniczenia dostępu w moim przypadku: Eclipse Neon z projektem jar maven na jar „jfxrt.jar”.
pdem

3
Istnieje znacznie prostsza alternatywa: usunięcie i dodanie z powrotem biblioteki systemowej JRE, jak wskazano na stackoverflow.com/a/2174607/222838
mico

81

Miałem ten sam problem. Kiedy początkowo tworzyłem projekt java w Eclipse, określiłem JRE 8. Kiedy wszedłem do ścieżki budowania projektu i edytowałem bibliotekę systemową JRE, wybrano środowisko wykonawcze Java 8. Kiedy zdecydowałem się użyć "Alernate JRE" (wciąż java 8), naprawiło to za mnie błąd.


2
Wolałbym globalną poprawkę, ale jest lepsza niż wszystkie inne odpowiedzi, które włączają ograniczony interfejs API na całym świecie. (Nie chcę przypadkowo użyć sun. * W mojej aplikacji javafx).
Mark Jeronimus,

1
Dzięki, to wyczyściło wszystkie ostrzeżenia w moim projekcie. Eclipse narzekał na wszystkie klasy dostarczone przez JavaFX (jfxrt.jar)
Goran Vasic

2
Potwierdzono ... Zmieniłem JRE 8 u60 na ... JRE 8 u60. Najwyraźniej uruchomienie tej przebudowy, w przeciwieństwie do jakiegokolwiek innego sposobu, ma ten efekt uboczny, że naprawia problem. (Bardziej szczegółowe wyjaśnienie, jak zmienić to ustawienie, znajduje się w odpowiedzi Nikhila Mahajana tutaj: stackoverflow.com/questions/6881622/… .)
starszy starszy

Dziękuję Ci! Dzięki tej strategii udało mi się pomyślnie skompilować framework java Spark.
Martin Pabst,

1
O dziwo to zadziałało. Mam tylko jeden JDK zainstalowany. Jakie dziwne.
WesternGun

65

Dodanie uprawnień dostępu javafx w eclipse Oxygen przejdź do projektu> właściwości> ścieżka budowania java> biblioteki> następnie rozwiń biblioteki i kliknij dwukrotnie> Reguły dostępu tam ustawisz uprawnienie Rozdzielczość: dostępny wzorzec reguł: javafx / **

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj


23

Po pierwsze ( i niezwiązane ), Applicationsamodzielne tworzenie instancji klasy nie wydaje się być jej przeznaczeniem. Z tego, co można odczytać ze źródła , oczekuje się raczej użycia instancji statycznej zwróconej przez getApplication().

Przejdźmy teraz do raportów o błędach Eclipse. Niedawno napotkałem podobny problem:Access restriction: The method ... is not API (restriction on required project) . Nazwałem tę metodę jako metodę obiektu, który odziedziczył tę metodę z superklasy. Wszystko, co musiałem zrobić, to dodać pakiet, w którym znajdowała się super klasa, do pakietów importowanych przez moją wtyczkę.

Jednak istnieje wiele różnych przyczyn błędów opartych na „ograniczeniu wymaganego projektu / biblioteki ”. Podobnie jak w przypadku opisanego powyżej problemu, używany typ może mieć zależności od pakietów, które nie są eksportowane przez bibliotekę lub mogą nie być eksportowane samodzielnie. W takim przypadku możesz spróbować znaleźć brakujące pakiety i wyeksportować je samodzielnie, zgodnie z sugestią tutaj , lub wypróbować reguły dostępu. Inne możliwe scenariusze obejmują:

  • Eclipse chce uniemożliwić korzystanie z dostępnych pakietów, które nie są częścią publicznego interfejsu API języka Java (rozwiązanie 1 , 2 )
  • Zależności spełnia wiele źródeł, wersje są ze sobą sprzeczne itp. (Rozwiązanie 1 , 2 , 3 )
  • Eclipse używa środowiska JRE, w którym JDK jest konieczny (co może mieć miejsce w tym przypadku, na podstawie tego, co mówią błędy; rozwiązanie ) lub wersja JRE / JDK w ścieżce budowania projektu nie jest właściwa

Skończyło się to bardziej jako mieszanina problemów związanych z ograniczeniami niż rzeczywista odpowiedź. Ale ponieważ ograniczenie wymaganych projektów jest tak wszechstronnym błędem, który należy zgłosić, prawdopodobnie nadal można znaleźć idealny przepis.


18

Miałem ten problem, ponieważ aspekt projektu powiązany z moim projektem był niewłaściwą wersją Java.

Aby to naprawić, wykonałem następujące czynności:

  1. Kliknij prawym przyciskiem myszy projekt i wybierz Właściwości
  2. Wybierz „Aspekty projektu” i zmień wersję Java na wyższą niż 1.4.
  3. Kliknij [Zastosuj]

Spowoduje to odbudowę projektu i miejmy nadzieję, że błąd zostanie rozwiązany.


15

Musieliśmy zmienić naszą aplikację tak, aby była zbudowana w oparciu o JDK 1.8, używając Window-> Preferences-> Java-> Installed JREs . Jednak po tej zmianie biblioteka systemowa JRE określona w Eksploratorze projektów nadal była niepoprawna. Aby to naprawić, kliknij prawym przyciskiem myszy „Biblioteka systemowa JRE [błędne-jre-tutaj]” i zmień ze środowiska wykonawczego: na „Domyślny obszar roboczy (yer-default-here)”

wprowadź opis obrazu tutaj


1
Dzięki! To bezpieczne moje życie :)
KMC

13

Zadziałało: Właściwości projektu -> ProjectFacets -> Runtimes -> jdk1.8.0_45 -> Apply


system rozłączył się :(
Saikat

12

Na górnym pasku menu Eclipse:

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

9

Jeśli masz ten sam problem podczas korzystania z pakietu Spring Tool Suite:

Podstawowym IDE pakietu Spring Tool Suite jest w rzeczywistości Eclipse. Otrzymałem ten błąd właśnie teraz, próbując użyć niektórych com.sun.netklas. Aby usunąć te błędy i zapobiec ich pojawianiu się na platformie STS Eclipse Luna SR1 (4.4.2):

  • Przejdź do projektu> Właściwości
  • Rozwiń nagłówek Kompilator Java
  • Kliknij Błędy / ostrzeżenia
  • Rozwiń wycofany i ograniczony interfejs API
  • Obok „Niedozwolone odniesienie (reguły dostępu)” wybierz „ignoruj”
  • Obok „Odradzane odniesienie (zasady dostępu)” wybierz „ignoruj”

Jesteś gotowy.


6

Miałem ten sam problem. Oto jak to rozwiązałem: Przejdź do Eksploratora pakietów. Kliknij prawym przyciskiem myszy bibliotekę systemową JRE i przejdź do Właściwości. W kontenerze Classpath> Wybierz środowisko JRE dla ścieżki budowania projektu wybierz trzecią opcję (domyślne środowisko JRE obszaru roboczego).

Źródło: https://thenewboston.com/forum/topic.php?id=3917


1
Dzięki… korzystając z odpowiedzi zaproponowanej przez C Hujera, okazało się, że dla pliku jfxrt.jar są "162 reguły (niemodyfikowalne)"!
mike gryzoń

5

Przejdź do następującego ustawienia:

Okno -> Preferencje -> Błędy kompilatora Java / Ostrzeżenia-Przestarzałe i ograniczone odwołanie do zabronionego interfejsu API (reguły dostępu)

Ustaw go na Warninglub Ignore.


5

Używamy IBM Rational Application Developer (RAD) i mieliśmy ten sam problem.

Komunikat o błędzie:

Ograniczenie dostępu: typ „JAXWSProperties” nie jest interfejsem API (ograniczenie do wymaganej biblioteki „C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar”)

Rozwiązanie:

przejdź do ścieżki kompilacji java i na karcie Biblioteka usuń bibliotekę systemową JRE. Następnie ponownie Dodaj bibliotekę -> Biblioteka systemowa JRE


4

W wydaniu Eclipse Mars.2 (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
wybierz JRE ... i naciśnij Edit: Switch to Workspace JRE (jdk1.8.0_77)

Pracuje dla mnie.


3

Mam zaćmienie JRE 8.112, nie jestem pewien, czy to ma znaczenie, ale zrobiłem to:

  1. Kliknąłem prawym przyciskiem myszy folder moich projektów
  2. zszedł do właściwości i kliknął
  3. kliknięto folder ścieżki budowania java
  4. gdy już byłem w środku, byłem w zamówieniu i wywoziłem
  5. Sprawdziłem bibliotekę systemową JRE [jre1.8.0_112]
  6. następnie przeniosłem go ponad jedną inną bibliotekę systemową JRE (nie jestem pewien, czy to ma znaczenie)
  7. następnie nacisnąłem ok

To rozwiązało mój problem.


2

Po prostu dodaję e (fx) clipse na eclipse marketplace. Łatwe i proste


1

Używam eclipse neon 3. Chciałem tylko użyć javafx.application.Application, więc zastosowałem się powyżej odpowiedzi Christiana Hujera i zadziałało. Tylko kilka wskazówek: reguły dostępu są bardzo podobne do instrukcji importu. U mnie dodane reguły dostępu to „javafx / application / **”. Po prostu zastąp kropkę w instrukcji import ukośnikiem i taka jest reguła. Mam nadzieję, że to pomoże.


1

Miałem trochę inny problem. W Projekt - Właściwości - Biblioteki - Biblioteka JRE mam niewłaściwą wersję biblioteki JRE. Usuń i ustaw właściwy, i voila - wszystkie Access restriction...ostrzeżenia zniknęły.


1

Nawet jeśli to stare pytanie, dla mnie w Eclipse po prostu klikam prawym przyciskiem myszy folder Src i właściwości (Alt + Enter) i sprawdzam, czy Ignore optional compile problemsusunięto błąd.

wprowadź opis obrazu tutaj


0

Jeśli ktoś ma ten problem tylko w twoim narzędziu CI podczas uruchamiania mavena, to co mi zrobiło, polegało na jawnym zdefiniowaniu środowiska wykonawczego w twoim MANIFEST.MF.

W moim przypadku zrobiłem to, wstawiając następujący wiersz w moim pliku manifestu pakietu OSGi:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.