Ograniczenie dostępu do klasy z powodu ograniczenia wymaganej biblioteki rt.jar?

824

Ja próbuje skompilować Java 1.4 kod, który został stworzony przez IBM WSDL2Java na java5 bez odtworzenie odcinki i zobaczyłem ten błąd w Eclipse .
Zakładam, że wygenerowane kody pośredniczące powinny się po prostu kompilować, o ile środowisko wykonawcze jarsjest dostępne (są).

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

Pełna nazwa klasy to javax.xml.namespace.QName

Co tu się właściwie dzieje? Czy to jest przypadek, w którym próbuję refaktoryzować świnię z kiełbasy? Czy lepiej odtworzyć kody pośredniczące?

sal
źródło
1
Nie rozumiem, dlaczego po prostu nie skompilujesz go gdzieś indziej i nie uruchomisz go w docelowym (tak sądzę) środowisku 1.4?
Tim Büthe
Docelowym środowiskiem docelowym jest jboss4.2 na jdk5.
sal
2
O statusie „chroniony”: w StackOverflow Nic nie mówi „dziękuję” ani „ja też” jako głos pozytywny;)
OscarRyz
6
Zobacz dużą najczęściej głosowaną odpowiedź ... Zignoruj ​​96% reszty tej strony. Szukaj: „Nels Beckman”, 1 lutego 2010 o 4:09
będzie
1
Dla mnie zadziałała edycja / zmiana biblioteki systemowej JRE ze środowiska wykonawczego (lub domyślnego Workspace) na alternatywne środowisko JRE (wybrałem tę samą wersję Java). Musisz także zapewnić (1) prawidłową kolejność na karcie Zamówienia i eksport , (2) prawidłowy poziom zgodności w ustawieniach kompilatora Java (taki sam, jak w wybranej wersji Java).
ADTC

Odpowiedzi:

1884

Jest inne rozwiązanie, które również działa.

  1. Przejdź do ustawień ścieżki kompilacji we właściwościach projektu.
  2. Usuń bibliotekę systemową JRE
  3. Dodaj to z powrotem; Wybierz „Dodaj bibliotekę” i wybierz bibliotekę systemową JRE . Domyślnie działało dla mnie.

Działa to, ponieważ masz wiele klas w różnych plikach jar. Usunięcie i ponowne dodanie biblioteki JRE sprawi, że odpowiednie klasy będą pierwsze. Jeśli potrzebujesz podstawowego rozwiązania, upewnij się, że wykluczasz pliki jar z tymi samymi klasami.

Dla mnie mam: javax.xml.soap.SOAPPartw trzech różnych słoików: axis-saaj-1.4.jar, saaj-api-1.3.jarart.jar

Nels Beckman
źródło
1
Czy to błąd Eclipse, czy przypadkowo omijamy to ograniczenie (i naruszamy warunki licencji)? Jeśli jest to błąd Eclipse, to czy zgłoszono błąd?
docwhat
@Doctor Nigdy nie użyłem tego do żadnego kodu, który byłby szczególnie ważny, więc nie badałem dalej ... Jeśli coś znajdziesz, daj nam znać.
Nels Beckman,
3
@ URL87 Jeśli klikniesz prawym przyciskiem myszy folder projektu, przejdź do „Ścieżki kompilacji ...”, „Konfiguruj ścieżkę kompilacji”, „Biblioteki” (karta), powinieneś zobaczyć „Dodaj bibliotekę” jako jeden z przycisków po prawej stronie. Dla mnie też zadziałało, doskonała odpowiedź
Alexei Blue
8
Lepszym rozwiązaniem w najnowszych wersjach Eclipse nie jest usunięcie Biblioteki systemowej JRE, ale przejście do zakładki „Zamów i eksportowanie” i po prostu przeniesienie Biblioteki systemowej JRE na dół (co faktycznie robi usuwanie i dodawanie, ale nie musisz to usunąć i dodać).
user1676075,
1
To jest 2018, a wersja zaćmienia to 5.0. Ten błąd / problem nadal istnieje. Wielkie dzięki @NelsBeckman. Twoja odpowiedź pomogła mi po 3/4 dekady, odkąd została opublikowana.
Aravamudhan
120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.html działał najlepiej dla mnie.

W systemie Windows: Windows -> Preferencje -> Java -> Kompilator -> Błędy / Ostrzeżenia -> Nieaktualne i ograniczone API -> Zabronione odniesienia (reguły dostępu): -> zmień na ostrzeżenie

W systemie Mac OS X / Linux: Eclipse -> Preferencje -> Java -> Kompilator -> Błędy / Ostrzeżenia -> Nieaktualne i ograniczone API -> Zabronione odniesienia (reguły dostępu): -> zmień na ostrzeżenie

scommab
źródło
62
Może to działać, ale nie jest to właściwe rozwiązanie. Musisz przede wszystkim zrozumieć, dlaczego ograniczenie dostępu istniało. Ukryje również wszystkie przyszłe przypadki tego, co może być ważniejsze!
Adrian Mouat,
1
@AdrianMouat, który jest praktycznie nieistotny. Jeśli chcę, żeby zniknęło, chcę, żeby zniknęło. Ale z pewnością - nie należy kodować przeciwko niepublicznym interfejsom API, nie.
stolsvik,
3
@stolsvik - straciłeś mnie; czy mówisz, że powód, dla którego istnieje problem, jest nieistotny?
Adrian Mouat,
1
Mam ten problem na JEDNEJ metodzie. Wyobrażam sobie użycie alternatywnego JDK (jak OpenJDK jest lepszą opcją). To powiedziawszy z jednej strony, że „kiedyś może być fajnie”. NIE w kodzie produkcyjnym. Nie dla ciągłego wysiłku projektowego. Nie mogę ci powiedzieć, ile osobodni gubi się podczas tego typu cr-hacka.
będzie
5
@AdrianMouat - ma sens. Nie chciałbym robić czegoś takiego w reaktorze jądrowym - Za dużo ciepła w sterowni? Więc wyłącz wszystkie ostrzeżenia. Zrób wielkie nagłówki następnego dnia. : P
David Blaine
67

Spotkałem ten sam problem. Odpowiedź znalazłem na stronie: http://www.17ext.com .
Najpierw usuń biblioteki systemowe JRE. Następnie ponownie zaimportuj biblioteki systemowe JRE.

Nie wiem dlaczego, ale to rozwiązało mój problem, mam nadzieję, że może ci pomóc.

sanwanxian
źródło
10
Huh, najwyraźniej odpowiedziałeś na to pytanie tak samo jak ja kilka miesięcy wcześniej. Nie jestem pewien, dlaczego wtedy nie widziałem twojej odpowiedzi ...
Nels Beckman
34

Domyślam się, że próbujesz zastąpić standardową klasę, która jest dostarczana z Javą 5, klasą, którą masz w bibliotece.

Nie jest to dozwolone zgodnie z warunkami umowy licencyjnej, jednak AFAIK nie było egzekwowane aż do Java 5.

Widziałem to wcześniej w QName i „naprawiłem” to, usuwając klasę ze słoika, który miałem.

EDYTUJ http://www.manpagez.com/man/1/java/ uwagi dotyczące opcji „-Xbootclasspath:”

„Aplikacje korzystające z tej opcji w celu przesłonięcia klasy w pliku rt.jar nie powinny być wdrażane, ponieważ naruszyłoby to licencję na kod binarny Java 2 Runtime Environment”.

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

„Ograniczenia technologii Java. Nie można modyfikować interfejsu platformy Java („ JPI ”, zidentyfikowanego jako klasy zawarte w pakiecie„ java ”lub jakimkolwiek podpakiecie pakietu„ java ”), tworząc dodatkowe klasy w ramach JPI lub w inny sposób powodując dodanie lub modyfikacja klas w JPI. W przypadku utworzenia dodatkowej klasy i powiązanych interfejsów API, które (i) rozszerzają funkcjonalność platformy Java oraz (ii) są udostępniane zewnętrznym programistom w celu opracowania dodatkowego oprogramowania, które wywołuje taki dodatkowy interfejs API, musisz niezwłocznie opublikować szeroko dokładną specyfikację takiego interfejsu API do bezpłatnego użytku przez wszystkich programistów. Nie możesz tworzyć ani autoryzować swoich licencjobiorców do tworzenia dodatkowych klas, interfejsów,lub podpakiety, które są w jakikolwiek sposób identyfikowane jako „java”, „javax”, „sun” lub podobna konwencja określona przez Sun w dowolnym oznaczeniu konwencji nazewnictwa. ”

Peter Lawrey
źródło
2
Otóż ​​to. jeden ze słoików na ścieżce miał klasę QName. odnaleźć . -nazwa „* .jar” -print -exec rozpakuj -t {} \; | grep „QName” je znalazło.
sal
1
Czy możesz podać odniesienie do tego, że nie wolno ci zastępować klas dostarczanych z Javą? Wszystko, co znalazłem w umowie licencyjnej, to ograniczenia związane z rozpowszechnianiem samej Javy, a nie programów Java, ale nie szukałem długo.
Adrian Mouat,
25

Ten błąd również pojawia się, ale mój projekt jest zbudowany w wierszu poleceń przy użyciu Mavena i kompilatora tycho (jest to zestaw wtyczek OSGi). Po przeszukaniu wielu osób mających ten sam problem, ale naprawieniu go w Eclipse zamiast w wierszu poleceń, znalazłem wiadomość na forum programistów Tycho, która odpowiedziała na moje pytanie, używając konfiguracji w pom.xmlcelu zignorowania ostrzeżenia kompilatora o ograniczeniu dostępu:

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

Więcej informacji można znaleźć w FAQ Tycho . Zajęło mi to WIEK, aby wypracować, więc pomyślałem, że pomogę każdemu, kto spróbuje naprawić te błędy ograniczenia dostępu z wiersza polecenia, publikując tę ​​odpowiedź.

Dawngerpony
źródło
13
  • Przejdź do ustawień ścieżki kompilacji we właściwościach projektu. Windows -> Preferences -> Java Compiler
  • Usuń bibliotekę systemową JRE
  • Dodaj kolejne środowisko JRE z „idealnym dopasowaniem”
  • wyczyść i ponownie zbuduj projekt. To zadziałało dla mnie.
Mayur
źródło
13

Właśnie miałem ten problem. Najwyraźniej na mojej ścieżce kompilacji ustawiłem JRE na 1,5 zamiast 1,6.

Dorus
źródło
1
Ten sam problem tutaj. W moim przypadku użycie Maven, która domyślnie wynosi 1,5, jeśli nie jest określona.
Greg Haskins
Pamiętaj, aby umieścić to w POM, aby nie zmieniło się po aktualizacji. <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </properties>
Philip Rego
8

Oprócz rozwiązania Nelsa Beckmana mam następujące wskazówki:

W obszarze Konfiguruj ścieżkę kompilacji musiałem zmienić kolejność wpisów w sekcji Zamów i eksportuj .

Ponadto, jako programista Eclipse PDE, musiałem zmienić kolejność moich zależności MANIFEST.MF, dodając problematyczny pakiet jako pierwszy na liście.

Grając z tymi tarczami, wraz z uruchomieniem Project> Clean pomiędzy, mogłem rozwiązać te ostrzeżenia.

modulitos
źródło
8

dla mnie tak to rozwiązuję:

  • przejdź do ścieżki kompilacji bieżącego projektu

w Bibliotekach

  • wybierz „ JRE System Library [jdk1.8xxx]”
  • kliknij edytuj
  • i wybierz „Domyślne środowisko JRE obszaru roboczego (jdk1.8xx)” LUB Alternatywne środowisko JRE
  • Kliknij koniec
  • Kliknij OK

wprowadź opis zdjęcia tutaj

Uwaga: upewnij się, że w Eclipse / Preferences (NIE w projekcie) / Java / Installed JRE, że jdk wskazuje na folder JDK, a nie JRE C: \ Program Files \ Java \ jdk1.8.0_74

wprowadź opis zdjęcia tutaj

test użytkownika
źródło
Mój był już ustawiony na 1,7 ... 79, więc wpadłem w panikę. Ale po prostu wybrałem go ponownie, kliknąłem Zastosuj, a błąd zniknął. Uff
Marvo,
Łał. Pomogło to również tutaj - przejście ze „środowiska wykonawczego” na „alternatywne środowisko JRE”. Jeśli ktoś ma jakieś logiczne wytłumaczenie tego ... (tutaj miało to miejsce po zmianie Java projektu-kranu z 1.5 (5.0 w pliku konfiguracyjnym .settings) na 1.8. Zmiana z błędu na ostrzeżenie w globalnych prefiksach (patrz inna odpowiedź) nie help: wciąż błędy.
Chodzi
6

Przepraszamy za aktualizację starego POST. Otrzymałem zgłoszony problem i rozwiązałem go, jak powiedziano poniżej.

Zakładając, że używasz wtyczki Eclipse + m2e maven, jeśli pojawi się ten błąd ograniczenia dostępu, kliknij prawym przyciskiem myszy projekt / moduł, w którym wystąpił błąd -> Właściwości -> Ścieżka kompilacji -> Biblioteka -> Zastąp JDK / JRE do tego, który jest używany w obszarze roboczym zaćmienia.

Postępowałem zgodnie z powyższymi krokami i problem został rozwiązany.

Arun B Chandrasekaran
źródło
W porządku, ale w zasadzie powtórzyłeś sformułowanie zaakceptowanej odpowiedzi Nelsa Beckmana.
Steven Wolfe
5

W przypadku, gdy masz pewność, że powinieneś mieć dostęp do danej klasy, może to oznaczać, że dodałeś kilka słoików do swojego projektu zawierających klasy o identycznych nazwach (lub ścieżkach), ale o innej treści i wzajemnie się przesłaniają (zazwyczaj stary zwyczaj jar kompilacji zawiera wbudowaną starszą wersję biblioteki innej firmy).

Na przykład po dodaniu słoika implementującego:

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

ale także starsza wersja implementująca tylko:

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

Wszystko działa poprawnie w edytorze kodu, ale nie działa podczas kompilacji, jeśli „stara” biblioteka przyćmiewa nową - d2 nagle okazuje się „brakująca lub niedostępna”, nawet gdy jest.

Rozwiązaniem jest sprawdzenie kolejności bibliotek czasu kompilacji i upewnienie się, że ta z poprawną implementacją jest pierwsza.

Pan Napik
źródło
4

Przejdź do ścieżki kompilacji Java we właściwościach projektu. Usuń istniejącą bibliotekę systemową JRE Następnie dodaj ją ponownie, tj. Dodaj bibliotekę -> JRE Lib - wybierz jre ---> Zakończ. Na koniec wybierz kartę zamówienia i eksportu , wybierz JRE Lib i przejdź na górę. Otóż ​​to.

Vijay Bhatt
źródło
3

Wystarczy zmienić kolejność bibliotek ścieżek kompilacji projektu. Kliknij prawym przyciskiem myszy projekt> Ścieżka kompilacji> Konfiguruj ścieżkę kompilacji> Wybierz zamówienie i eksport (karta)> Zmień kolejność wpisów. Mam nadzieję, że przeniesienie „biblioteki systemowej JRE” na dół zadziała. Tak mi się udało. Łatwe i proste .... !!!

Samitha Chathuranga
źródło
3

W moim przypadku wystąpiło niedopasowanie między ścieżką kompilacji JRE a zainstalowanym środowiskiem JRE w środowisku wykonawczym. Przeprowadziłem się do Projekt> Właściwości> Kompilator Java. Na dole było ostrzeżenie.

Kliknąłem linki „Zainstalowane środowisko JRE”, „Środowisko wykonawcze”, „Ścieżka kompilacji Java” i zmieniłem wersję JDK na 1.7, a ostrzeżenie zniknęło.

Soumyajit Swain
źródło
0

Dodanie odpowiedniego systemu JRE poprzez ścieżkę kompilacji jest rozwiązaniem, ale twoje zaćmienie może nadal zawierać błąd. Aby rozwiązać ten problem, przejdź do ścieżki kompilacji Java -> Zamów i eksportuj i przenieś bibliotekę systemową JRE na górę. To rozwiązało mój problem.

Abhishek Soni
źródło