Sử dụng JavaFX trong JRE 8, lỗi "Hạn chế truy cập"


83

Khi cố gắng sử dụng các lớp liên quan đến javafx trong dự án java 8 mới của mình, tôi gặp lỗi hạn chế truy cập từ eclipse. Cho đến nay, 'giải pháp' duy nhất mà tôi có thể tìm thấy là yêu cầu eclipse bỏ qua hạn chế truy cập, nhưng tôi không hài lòng với điều đó. Một ví dụ về lỗi:

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

Tôi đang sử dụng Eclipse Kepler với bản vá Eclipse JDT cho java 8.

Đây dường như là một vấn đề liên quan đến thực tế là JavaFX không phải là một phần của môi trường thực thi JavaSE.

Bây giờ tôi rất bối rối vì theo http://en.wikipedia.org/wiki/JavaFX javaFX là một phần của JavaSE. Có thể Eclipse không nhận ra rằng nó là một phần của javaSE?



3
Bạn có thể đúng, giải pháp được đề xuất của anh ấy có hiệu quả với tôi một nửa. Ý tôi là nếu tôi thêm JRE bằng cách sử dụng 'mặc định không gian làm việc' jre (jdk1.8.0) thì nó sẽ hoạt động, nhưng khi sử dụng 'môi trường thực thi' JavaSE-1.8 (jdk1.8.0), tôi vẫn gặp lỗi.
Lexxicon

Câu trả lời:


66

Theo quan điểm của Eclipse, lỗi là hoàn toàn chính xác vì JavaFX đến từ classpath mở rộng và không khả dụng trên TẤT CẢ các máy ảo Java8 (ví dụ: ibm!).

Như đã trình bày, bạn có thể loại bỏ những cảnh báo đó bằng cách thêm quy tắc truy cập hoặc IMHO, giải pháp tốt nhất là cài đặt e (fx) clipse thực hiện điều này tự động cho bạn và bên cạnh đó, thậm chí còn cung cấp cho bạn công cụ cho JavaFX CSS và FXML.

Bạn có thể lấy gói tất cả trong một từ http://efxclipse.bestsolution.at/install.html


1
Điều đó có lý, tôi đã không nhận ra rằng vm khác không hỗ trợ JFX. Tôi nghĩ rằng câu hỏi ban đầu của tôi không thể trả lời được do nó không phải là một lỗi. Rất tiếc, tôi không thể sử dụng giải pháp đề xuất của bạn do một số vấn đề chính trị tại nơi làm việc.
Lexxicon

3
Bạn biết tất cả những điều đó là các dự án Eclipse - tải xuống tất cả trong một chỉ đơn giản là một tính năng thú vị để giúp bạn bắt đầu nhanh chóng. Bạn cũng có thể cài đặt từ Eclipse.org nếu muốn. Xem eclipse.org/efxclipse/install.html
tomsontom

Tôi biết, nhưng do những hạn chế nội bộ, tôi không được phép sử dụng. Điều đó đang được nói, nếu bạn cảm thấy đây là giải pháp tốt nhất cho vấn đề này, tôi sẽ đánh dấu câu trả lời của bạn là đúng.
Lexxicon

5
chỉ là một cái gì đó ở bên: nếu bạn thậm chí không thể cài đặt các plugin eclipse tại nơi làm việc thì chắc chắn có điều gì đó sai. Giới hạn các nhà phát triển trong một bộ công cụ cụ thể đồng nghĩa với việc giới hạn bộ kỹ năng và chất lượng công việc của anh ta.
specializt

133

Tôi sẽ thêm một câu trả lời nữa ở đây, chỉ để cung cấp những gì tôi nghĩ là cách tiếp cận tối thiểu nhất. Trong thiết lập Eclipse của tôi, tôi đã cài đặt e (fx) clipse, cung cấp một bản sửa lỗi cho vấn đề này, cũng như cung cấp nhiều tính năng phát triển hữu ích mà bạn gần như chắc chắn sẽ muốn nếu bạn đang viết ứng dụng JavaFX. Đây có lẽ là cách tiếp cận thiết thực nhất. Nếu vì lý do nào đó mà bạn không muốn plugin đó, giải pháp được nêu trong câu trả lời này sẽ khắc phục sự cố với ít tác dụng phụ nhất.

Như đã chỉ ra trong các câu trả lời khác, Eclipse, theo mặc định, không cho phép truy cập vào các lớp trong tệp jar trong thư mục jre / lib / ext, vì chúng không được đảm bảo có mặt trên tất cả các nền tảng Java. Nếu bạn đang viết một ứng dụng JavaFX 8, bạn đang giả định rằng bạn đang ở trên một nền tảng mà jfxrt.jar có sẵn ở vị trí lib / ext.

Vì vậy, cách khắc phục tối thiểu cho điều này là cho phép truy cập vào các lớp trong tệp jar này (và chỉ trong tệp jar này). Để thực hiện việc này, hãy nhấp chuột phải vào dự án và hiển thị hộp thoại thuộc tính của dự án. Chọn "Đường dẫn xây dựng" trong ngăn bên trái và chọn tab "Thư viện". Bạn sẽ thấy mục nhập "Thư viện hệ thống JRE". Mở rộng mục nhập đó và bạn sẽ thấy một mục phụ "Quy tắc truy cập":

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

Chọn mục nhập "Quy tắc truy cập" và nhấp vào "Chỉnh sửa". Nhấp vào "Thêm".

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

Trong "Độ phân giải", chọn "Có thể truy cập" và trong "Mẫu quy tắc", hãy nhập javafx/**:

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

Bấm OK để thoát khỏi tất cả các hộp thoại.

Cài đặt này sẽ cho phép truy cập vào tất cả các lớp trong bất kỳ gói nào bắt đầu javafx. , nhưng sẽ bảo toàn quy tắc trên thư mục ext cho tất cả các lớp khác và theo nghĩa đó là "tối thiểu".

Một lần nữa, những gì bạn có thể thực sự muốn làm là cài đặt plugin e (fx) clipse, nhưng theo hiểu biết của tôi thì đây là giải pháp có ít tác dụng phụ nhất khi thiết lập Eclipse của bạn.


Có cách nào để cấu hình điều này từ pom trong maven không?
RobAu

1
Giải thích rõ ràng cắt
xploreraj

@RobAu Xem ở đây để biết công việc của maven: stackoverflow.com/questions/32565193/…
Stefan

1
Đơn giản và hoàn hảo !! :)
Sanket Patel

Tôi thấy trong một dòng câu trả lời của bạn rằng e(fx)clipse is providing many useful development features . Một phần tử mới SashPanekhắc phục một số SliderPanevấn đề đã được thêm vào e (fx) clipse 2.6 nhưng tôi thực sự không thể hiểu được. Có lớp nào chúng ta có thể sử dụng từ e (fx) clipse không? Tôi không thể tìm thấy bất cứ điều gì tương tự. Ý tôi là tôi không thể truy cập vào bất kỳ lớp hoặc tìm một cái gì đó hữu ích mà tôi có thể sử dụng trong chương trình, như thư viện i mean.Correct tôi gây ra tôi biết tôi ở đâu đó sai ở đây ... :)
GOXR3PLUS

19

Tôi đã giải quyết vấn đề bằng cách xóa và đọc JDK vào đường dẫn xây dựng. Tuy nhiên, đừng hỏi tôi tại sao nó hoạt động.


1
Tôi tin rằng lý do nó có thể hiệu quả với bạn là khi bạn thêm thư viện jre vào đường dẫn xây dựng, nó (eclipse) dường như được đặt mặc định thành jre 'workspace default' thay vì sử dụng môi trường thực thi. Vì JFX dường như không phải là một phần của javaSE, môi trường mà tôi đã chọn, nên tôi đã giữ lại lỗi. Trong khi nếu bạn chỉ thêm jre không gian làm việc mặc định thì nó sẽ không còn những hạn chế đó nữa.
Lexxicon

11

Cách dễ dàng là cài đặt e (fx) clipse - một plugin cho Eclipse để hỗ trợ JavaFX:

  1. Chọn Trợ giúp -> Cài đặt Phần mềm Mới
  2. Nhấp vào nút Thêm để thêm trang web sau:
  3. Bấm OK
  4. Trong "Làm việc với", chọn trang web được thêm gần đây "efxclipse"
  5. Đánh dấu vào hộp kiểm "e (fx) clipse - install" để cài đặt tất cả các thành phần của lựa chọn này
  6. Chuyển sang các bước tiếp theo để hoàn tất cài đặt
  7. Khởi động lại Eclipse của bạn. Nếu nó vẫn không nhận ra thư viện JavaFX, hãy khởi động lại nó.

Thông tin gốc có thể được tìm thấy tại đây: https://www.eclipse.org/efxclipse/install.html#for-the-lazy


Cảm ơn;) Đơn giản và dễ dàng
J. Adam

Nó hoạt động, cảm ơn bạn! Vừa cập nhật URL Vị trí thành: download.eclipse.org/efxclipse/updates-released/3.6.0/site
Crozeta 27/09/19

7

Tôi đã giải quyết vấn đề này bằng cách sử dụng cẩn thận đường dẫn xây dựng của dự án Eclipse.

  • Hiển thị các thuộc tính của dự án ứng dụng của bạn và chọn phần 'Đường dẫn xây dựng'.
  • Thêm jre8_0 \ lib \ ext \ jfxrt.jar làm "Tệp JAR bên ngoài" trong tab 'Thư viện'.
  • Trong tab 'Đặt hàng / Xuất', hãy đảm bảo rằng jfxrt.jar này nằm đầu tiên trong danh sách.

Điều này đang làm là làm cho Eclipse xem jfxrt.jar chỉ là một tệp JAR thông thường của bên thứ ba. Thứ tự rất quan trọng để điều này được ưu tiên hơn mục nhập trong thư viện hệ thống JRE. Đó là cùng một tệp JAR thực tế, nhưng Eclipse nhìn thấy nó khác.

Bạn có thể muốn thay đổi bất kỳ cấu hình chạy nào để nó không sử dụng phiên bản 'Đã xuất' của jfxrt.jar; tuy nhiên trong điều kiện thực tế, điều này sẽ không tạo ra sự khác biệt.

Tôi đã làm điều này với Java8 và Eclipse Luna; nhưng tôi chắc chắn sẽ làm việc với bất kỳ sự kết hợp nào của Java và Eclipse.


5
  • đi đến đường dẫn xây dựng của dự án hiện tại

thuộc Thư viện

  • chọn " Thư viện hệ thống JRE [jdk1.8xxx]"
  • nhấp vào chỉnh sửa
  • và chọn "JRE mặc định của không gian làm việc (jdk1.8xx)" HOẶC JRE thay thế
  • Bấm kết thúc
  • Bấm OK

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

Lưu ý: đảm bảo rằng trong Eclipse / Preferences (KHÔNG phải dự án) / Java / JRE đã cài đặt, jdk trỏ đến thư mục JDK không phải JRE C: \ Program Files \ Java \ jdk1.8.0_74

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


4

Tôi biết điều này đã được trả lời rồi, nhưng tôi thấy các giải pháp được đề xuất vẫn còn rắc rối.

  1. Tôi không muốn cài đặt một plugin chỉ để tránh những gì tôi coi là lỗi không hợp lệ.
  2. Thêm jfxrt.jar làm jar bên ngoài sẽ hoạt động, nhưng là một ý tưởng tồi nếu bạn định thực hiện xuất vì jfxrt.jar cũng sẽ được xuất. Có lẽ không phải những gì bạn muốn.

Một lựa chọn khác

Trong bản phát hành 'Mars' (và có thể là các phiên bản trước đó), bạn có thể tắt các lỗi hạn chế truy cập. Dưới

Chế độ xem Java-> Trình biên dịch-> Lỗi / Cảnh báo

"API hạn chế và không được chấp nhận"

bạn có thể đặt "Tham chiếu bị cấm (quy tắc truy cập)" để bỏ qua.

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


4

Làm theo các bước sau:

  1. Thêm jfxrt.jar (từ thư mục cài đặt của bạn) dưới dạng "Tệp JAR bên ngoài" trong tab 'Thư viện'.

  2. Trong tab 'Đặt hàng / Xuất', hãy đảm bảo rằng jfxrt.jar này nằm đầu tiên trong danh sách.

Điều này đã làm việc cho tôi.


2

Như James_D đã đề xuất, tôi đã thêm các quy tắc truy cập vào tệp classpath của mình. Tôi đã gỡ cài đặt plugin e (fx) clipse vào lúc này vì nó có lỗi xác thực css (xem Cách tắt cảnh báo css "Thuộc tính không xác định" trong Eclipse Mars? ).

Đây là mục nhập của tôi trong tệp classpath cho vùng chứa 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>

2

Tôi đã từng gặp vấn đề tương tự. Tôi đã sử dụng giải pháp của James_D nhưng giải pháp chính xác của anh ấy không hiệu quả với tôi. Nhưng sử dụng **/javafx/**thay vìjavafx/** giải quyết vấn đề cho tôi. Hy vọng rằng sẽ giúp.

Tái bút: Tôi sẽ đăng điều này như một bình luận theo giải pháp của James_D nhưng tôi chỉ đăng ký và không có đủ "danh tiếng" để làm như vậy.


0

Bước 1: Điều hướng đến jfxrt.jar của bạn. C: \ Program Files \ Java \ jre1.8.0_111 \ lib \ ext

Bước 2 Sao chép tệp jfxrt.jar

Bước 3: Vào Eclipse, Tạo một thư mục mới như sau: [Tạo tên thư mục lib để đặt tệp jfxrt.jar của chúng tôi] [2] [2]: https://i.stack.imgur.com/YsJ5S.png

Bước 4: Chọn thư mục lib và nhấn CTRL + V để dán jfxrt.jar [Dán jfxrt.jar của bạn] [1] [1]: https://i.stack.imgur.com/Ljogu.png

Bước 5: Nhấp chuột phải vào jfxrt.jar và đặt làm Đường dẫn xây dựng.

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.