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”)

www139
źródło
3
Spróbuj uruchomić to za pomocą Java 7.
spoko
2
Sprawdź je pod kątem trafności: stackoverflow.com/questions/860187/… , stackoverflow.com/questions/9266632/…
user2864740
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/**”.
Christian Hujer
źródło
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.

Bursztyn
źródło
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

vidyakumargv
źródło
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.

J. Katzwinkel
źródło
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.

Kiriya Keat
źródło
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

Dinsdale
źródło
1
Dzięki! To bezpieczne moje życie :)
KMC
13

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

Kamila O
źródło
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
Phil Long
źródło
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.

Grandclosing
źródło
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

Nishant_Singh
źródło
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.

cxj
źródło
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

Jonas_Hess
źródło
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.

Sven
źródło
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.

kwazar-światło
źródło
2

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

jessie
źródło
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.

Tony S.
źródło
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.

Gangnus
źródło
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

MrSimpleMind
źródło
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
Fernando Paz
źródło