Używanie JavaFX w środowisku JRE 8, błąd „Ograniczenie dostępu”

84

Podczas próby użycia klas powiązanych z javafx w moim nowym projekcie java 8 otrzymuję błąd ograniczenia dostępu z eclipse. Jak dotąd jedynym „rozwiązaniem”, jakie udało mi się znaleźć, jest nakazanie Eclipse ignorowania ograniczeń dostępu, ale nie jestem z tego zadowolony. Przykład błędu:

Access restriction: The type Pane is not accessible due to 
restriction on required library C:\Program Files\Java\jre8_0\lib\ext\jfxrt.jar

Używam Eclipse Kepler z poprawką Eclipse JDT dla java 8.

Wydaje się, że jest to problem związany z faktem, że JavaFX nie jest częścią środowiska wykonawczego JavaSE.

Jestem teraz mocno zdezorientowany, ponieważ według http://en.wikipedia.org/wiki/JavaFX javaFX jest częścią JavaSE. Czy to możliwe, że Eclipse nie rozpoznaje, że jest częścią javaSE?

Lexxicon
źródło
3
Możesz mieć rację, zaproponowane przez niego rozwiązanie w połowie zadziałało dla mnie. Przez połowę pracowałem, mam na myśli, że jeśli dodam JRE przy użyciu `` domyślnego obszaru roboczego '' jre (jdk1.8.0), to działa, ale podczas korzystania z `` środowiska wykonawczego '' JavaSE-1.8 (jdk1.8.0) nadal mam błąd.
Lexxicon

Odpowiedzi:

67

Z punktu widzenia Eclipse błąd jest całkowicie poprawny, ponieważ JavaFX pochodzi ze ścieżki klas rozszerzenia i nie jest dostępna na WSZYSTKICH maszynach wirtualnych Java8 (np. Ibm!).

Jak wspomniano, możesz stłumić te ostrzeżenia, dodając reguły dostępu lub IMHO. Najlepszym rozwiązaniem jest zainstalowanie klipsu e (fx), który robi to automatycznie, a poza tym zapewnia nawet narzędzia dla JavaFX CSS i FXML.

Możesz pobrać wszystko w jednym pakiecie z http://efxclipse.bestsolution.at/install.html

tomsontom
źródło
1
To ma sens, nie zdawałem sobie sprawy, że inne maszyny wirtualne nie obsługują JFX. Myślę, że moje pierwotne pytanie jest bez odpowiedzi, ponieważ nie jest to błąd. Niestety nie mogę skorzystać z proponowanego przez Pana rozwiązania ze względu na politykę w pracy.
Lexxicon
3
Wiesz, że to wszystkie projekty Eclipse - pobieranie typu „wszystko w jednym” to po prostu fajna funkcja ułatwiająca szybkie rozpoczęcie pracy. Jeśli chcesz, możesz również zainstalować z Eclipse.org. Zobacz eclipse.org/efxclipse/install.html
tomsontom
Wiem, ale ze względu na wewnętrzne ograniczenia nie wolno mi tego używać. Biorąc to pod uwagę, jeśli uznasz, że jest to najlepsze rozwiązanie tego problemu, zaznaczę twoją odpowiedź jako poprawną.
Lexxicon
5
tylko coś na boku: jeśli nie możesz nawet zainstalować wtyczek eclipse w pracy, na pewno coś jest nie tak. Ograniczenie programistów do określonego zestawu narzędzi jest równoznaczne z ograniczeniem jego zestawu umiejętności i jakości pracy.
specializt
135

Dodam tutaj jeszcze jedną odpowiedź, aby zapewnić to, co uważam za najbardziej minimalne podejście. W mojej konfiguracji Eclipse mam zainstalowany e (fx) clipse, który zapewnia jedną poprawkę do tego, a także zapewnia wiele przydatnych funkcji programistycznych, które prawie na pewno będziesz potrzebować, pisząc aplikacje JavaFX. Jest to prawdopodobnie najbardziej praktyczne podejście. Jeśli z jakiegoś powodu nie chcesz tej wtyczki, rozwiązanie przedstawione w tej odpowiedzi rozwiąże problem z najmniejszą ilością innych skutków ubocznych.

Jak wskazano w innych odpowiedziach, Eclipse domyślnie nie zezwala na dostęp do klas w plikach jar w katalogu jre / lib / ext, ponieważ nie gwarantuje się ich obecności na wszystkich platformach Java. Jeśli piszesz aplikację JavaFX 8, zakładasz, że jesteś na platformie, na której plik jfxrt.jar jest dostępny w lokalizacji lib / ext.

Zatem minimalnym rozwiązaniem tego problemu jest zezwolenie na dostęp do klas w tym pliku jar (i tylko w tym pliku jar). Aby to zrobić, kliknij prawym przyciskiem myszy projekt i otwórz okno dialogowe właściwości projektu. Wybierz opcję „Buduj ścieżkę” w lewym okienku i wybierz kartę „Biblioteki”. Zobaczysz wpis „JRE System Library”. Rozwiń ten wpis, a zobaczysz podpozycję „Reguły dostępu”:

wprowadź opis obrazu tutaj

Wybierz wpis „Reguły dostępu” i kliknij „Edytuj”. Kliknij „Dodaj”.

wprowadź opis obrazu tutaj

W sekcji „Rozdzielczość” wybierz „Dostępne” i w sekcji „Wzorzec reguły” wpisz javafx/**:

wprowadź opis obrazu tutaj

Kliknij OK, aby zamknąć wszystkie okna dialogowe.

To ustawienie umożliwi dostęp do wszystkich klas w każdym paczce javafx., ale zachowa regułę w folderze ext dla wszystkich innych klas i jest w tym sensie „minimalne”.

Ponownie, to, co prawdopodobnie naprawdę chcesz zrobić, to zainstalować wtyczkę e (fx) clipse, ale według mojej wiedzy jest to rozwiązanie z najmniejszymi efektami ubocznymi w konfiguracji Eclipse.

James_D
źródło
Czy jest też sposób na skonfigurowanie tego z pom in maven?
RobAu
1
Wyraźne wyjaśnienie
xploreraj
@RobAu Zobacz tutaj, aby obejść temat maven: stackoverflow.com/questions/32565193/ ...
Stefan
1
Proste i idealne !! :)
Sanket Patel
Widzę w jednej linijce twojej odpowiedzi e(fx)clipse is providing many useful development features . W e (fx) clipse 2.6 dodano nowy element, SashPanektóry rozwiązuje niektóre SliderPaneproblemy, ale naprawdę nie mogę tego zrozumieć. Czy są jakieś klasy, których możemy użyć z e (fx) clipse? Nie mogę znaleźć niczego podobnego. Chodzi mi o to, że nie mogę uzyskać dostępu do żadnej klasy ani znaleźć czegoś przydatnego, co mogę użyć w programie, mam na myśli bibliotekę. Popraw mnie, bo wiem, że gdzieś się mylę ... :)
GOXR3PLUS
19

Rozwiązałem problem, usuwając i wczytując JDK do ścieżki budowania. Nie pytaj mnie jednak, dlaczego to działa.

Promień
źródło
1
Uważam, że powodem, dla którego mogło to zadziałać, jest to, że kiedy dodajesz bibliotekę jre do ścieżki budowania, wydaje się, że domyślnie (eclipse) domyślnie korzysta z jre „domyślnego obszaru roboczego” zamiast używać środowiska wykonawczego. Ponieważ JFX nie wydaje się być częścią javaSE, środowiska, które wybrałem, zachowałem błąd. Natomiast jeśli po prostu dodasz domyślny obszar roboczy jre, nie będzie on już miał tych ograniczeń.
Lexxicon
11

Najprostszym sposobem jest zainstalowanie e (fx) clipse - wtyczki do Eclipse obsługującej JavaFX:

  1. Wybierz Pomoc -> Zainstaluj nowe oprogramowanie
  2. Kliknij przycisk Dodaj, aby dodać następującą witrynę:
  3. Kliknij OK
  4. W polu „Pracuj z” wybierz ostatnio dodaną witrynę „efxclipse”
  5. Zaznacz pole wyboru „e (fx) clipse - install”, aby zainstalować wszystkie składniki tego wyboru
  6. Przejdź do kolejnych kroków, aby zakończyć instalację
  7. Uruchom ponownie Eclipse. Jeśli nadal nie rozpoznaje biblioteki JavaFX, uruchom ją ponownie.

Oryginalne informacje można znaleźć tutaj: https://www.eclipse.org/efxclipse/install.html#for-the-lazy

Thach Van
źródło
Dzięki;) Proste i łatwe
J. Adam
Działa, dziękuję! Właśnie zaktualizowałem adres URL lokalizacji na: download.eclipse.org/efxclipse/updates-released/3.6.0/site
Crozeta
7

Rozwiązałem ten problem ostrożnie używając ścieżki budowania projektu Eclipse.

  • Wywołaj właściwości projektu swojej aplikacji i wybierz sekcję „Buduj ścieżkę”.
  • Dodaj plik jre8_0 \ lib \ ext \ jfxrt.jar jako „Zewnętrzny plik JAR” na karcie „Biblioteki”.
  • W zakładce „Zamów / Eksportuj” upewnij się, że ten plik jfxrt.jar jest pierwszy na liście.

To powoduje, że Eclipse postrzega jfxrt.jar jako zwykły plik JAR innej firmy. Kolejność jest ważna, ponieważ ma pierwszeństwo przed wpisem w bibliotece systemowej JRE. To ten sam rzeczywisty plik JAR, ale Eclipse widzi go inaczej.

Możesz zmienić dowolną konfigurację uruchamiania, aby nie korzystała z „wyeksportowanej” wersji jfxrt.jar; jednak w praktyce nie będzie to miało znaczenia.

Zrobiłem to z Java8 i Eclipse Luna; ale główny byłbym pewien, że działałby z dowolną kombinacją Java i Eclipse.

Calanais
źródło
6
  • przejdź do ścieżki kompilacji bieżącego projektu

pod Biblioteki

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

wprowadź opis obrazu tutaj

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

wprowadź opis obrazu tutaj

usertest
źródło
4

Wiem, że już na to odpowiedziano, ale proponowane rozwiązania wydają mi się niezgrabne.

  1. Nie chcę instalować wtyczki tylko po to, aby uniknąć tego, co uważam za nieprawidłowy błąd.
  2. Dodanie jfxrt.jar jako zewnętrznego pliku jar zadziała, ale jest złym pomysłem, jeśli planujesz eksportować, ponieważ jfxrt.jar również zostanie wyeksportowany. Prawdopodobnie nie to, czego chcesz.

Inna opcja

W wersji „Mars” (i prawdopodobnie we wcześniejszych wersjach) można wyłączyć błędy ograniczeń dostępu. Pod

Java-> Compiler-> Errors / Warnings view

i

„Wycofany i ograniczony interfejs API”

możesz ustawić „Niedozwolone odniesienie (reguła dostępu)” na ignorowanie.

wprowadź opis obrazu tutaj


źródło
4

Wykonaj następujące kroki:

  1. Dodaj plik jfxrt.jar (z folderu instalacyjnego) jako „Zewnętrzny plik JAR” na karcie „Biblioteki”.

  2. Na karcie „Zamów / Eksportuj” upewnij się, że ten plik jfxrt.jar jest pierwszy na liście.

To zadziałało dla mnie.

Natile
źródło
3

Miałem ten sam problem. Użyłem rozwiązania James_D, ale jego dokładne rozwiązanie nie zadziałało. Ale używając **/javafx/**zamiastjavafx/** rozwiązało problem za mnie. Mam nadzieję, że to pomoże.

PS: Chciałbym opublikować to jako komentarz pod rozwiązaniem James_D, ale właśnie się zarejestrowałem i nie miałem wystarczającej „reputacji”, aby to zrobić.

anand
źródło
2

Jak już zasugerował James_D, dodałem reguły dostępu do mojego pliku ścieżki klas. Odinstalowałem na razie wtyczkę e (fx) clipse, ponieważ ma ona błąd sprawdzania poprawności css (zobacz Jak wyłączyć ostrzeżenie css „Nieznana właściwość” w Eclipse Mars? ).

Oto mój wpis w pliku ścieżki klas dla kontenera JRE:

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.‌​launcher.StandardVMType/JavaSE-1.8">
    <attributes>
        <attribute name="maven.pomderived" value="true"/>
    </attributes> 
    <accessrules>
        <accessrule kind="accessible" pattern="javafx/**"/>
        <accessrule kind="accessible" pattern="com/sun/javafx/**"/>
    </accessrules>
</classpathentry>
Stefan
źródło
0

Krok 1: Przejdź do pliku jfxrt.jar. C: \ Program Files \ Java \ jre1.8.0_111 \ lib \ ext

Step-2 Skopiuj plik jfxrt.jar

Krok 3: Przejdź do Eclipse, utwórz nowy folder taki jak ten: [Tworzenie nazwy folderu lib, aby umieścić nasz plik jfxrt.jar] [2] [2]: https://i.stack.imgur.com/YsJ5S.png

Krok 4: Wybierz folder lib i naciśnij CTRL + V, aby wkleić plik jfxrt.jar [Wklej swój jfxrt.jar] [1] [1]: https://i.stack.imgur.com/Ljogu.png

Step-5: Kliknij prawym przyciskiem myszy jfxrt.jar i ustaw jako Build Path.

Mohd Jahid
źródło