Hạn chế truy cập trên lớp do hạn chế về thư viện yêu cầu rt.jar?


824

Tôi đang cố gắng biên dịch mã Java 1.4 do WSDL2Java của IBM tạo ra trên Java5 mà không tạo lại các sơ khai và thấy lỗi này trong Eclipse . Tôi theo giả định rằng các sơ khai được tạo nên chỉ biên dịch miễn là thời gian chạy có sẵn (chúng là).
jars

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

Tên lớp đầy đủ là javax.xml.namespace.QName

Chính xác thì chuyện gì đang xảy ra ở đây vậy? Đây có phải là một trường hợp mà tôi đang cố gắng tái cấu trúc một con lợn từ xúc xích? Tôi có tốt hơn để tái tạo lại sơ khai?


1
Tôi không hiểu nó, tại sao bạn không chỉ biên dịch nó ở nơi khác và chạy nó trong môi trường được nhắm mục tiêu (vì vậy tôi đoán vậy)?
Tim Büthe

Môi trường đích cuối cùng là jboss4.2 trên jdk5.
sal

2
Về trạng thái "được bảo vệ": Trong StackOverflow Không có gì nói "Cảm ơn" hoặc "tôi cũng vậy" với tư cách là một upvote;)
OscarRyz

6
Xem câu trả lời được bình chọn nhiều nhất ... Bỏ qua 96% phần còn lại của trang này. Tìm kiếm: "Nels Beckman", 1 tháng 2, 10 lúc 4:09
sẽ

1
Điều làm việc cho tôi là chỉnh sửa / thay đổi Thư viện hệ thống JRE từ môi trường Thực thi (hoặc mặc định Không gian làm việc) thành JRE thay thế (Tôi đã chọn cùng một phiên bản Java). Bạn cũng phải đảm bảo (1) thứ tự đúng trong tab Thứ tự và Xuất , (2) mức độ tuân thủ chính xác trong cài đặt Trình biên dịch Java (giống như phiên bản Java đã chọn).
ADTC

Câu trả lời:


1884

Có một giải pháp khác cũng hoạt động.

  1. Chuyển đến cài đặt Đường dẫn xây dựng trong thuộc tính dự án.
  2. Xóa thư viện hệ thống JRE
  3. Thêm nó trở lại; Chọn "Thêm thư viện" và chọn Thư viện hệ thống JRE . Mặc định làm việc cho tôi.

Điều này hoạt động vì bạn có nhiều lớp trong các tệp jar khác nhau. Xóa và thêm lại lib JRE sẽ làm cho các lớp bên phải là đầu tiên. Nếu bạn muốn một giải pháp cơ bản, hãy đảm bảo bạn loại trừ các tệp jar có cùng các lớp.

Đối với tôi, tôi có: javax.xml.soap.SOAPParttrong ba lọ khác nhau: axis-saaj-1.4.jar, saaj-api-1.3.jarrt.jar


1
Đây có phải là một lỗi của Eclipse hay chúng ta đang vô tình khắc phục các hạn chế (và vi phạm các điều khoản cấp phép)? Nếu đó là một lỗi Eclipse, thì có một lỗi nào được nộp không?
docwhat

@Doctor Tôi chưa bao giờ sử dụng mã này cho bất kỳ mã nào đặc biệt quan trọng, vì vậy tôi đã không điều tra thêm nữa ... Nếu bạn tìm thấy bất cứ điều gì xin vui lòng cho chúng tôi biết.
Nels Beckman

3
@ URL87 Nếu bạn nhấp chuột phải vào thư mục dự án, hãy chuyển đến "Đường dẫn xây dựng ...", "Định cấu hình đường dẫn xây dựng", "Thư viện" (tab), bạn sẽ thấy "Thêm thư viện" là một trong các nút ở bên phải .. Điều này cũng có tác dụng với tôi, câu trả lời tuyệt vời
Alexei Blue

8
Giải pháp tốt hơn trong các phiên bản gần đây của Eclipse không phải là xóa Thư viện hệ thống JRE, mà là chuyển đến tab "Đặt hàng và xuất khẩu" và chỉ cần di chuyển Thư viện hệ thống JRE xuống phía dưới (đây là cách xóa và thêm nó một cách hiệu quả, nhưng bạn không Không cần phải xóa và thêm để làm điều đó).
dùng1676075

1
Đây là năm 2018 và phiên bản nhật thực là 5.0. Lỗi / vấn đề này vẫn còn tồn tại. Cảm ơn rất nhiều @NelsBeckman. Câu trả lời của bạn đã giúp tôi sau 3/4 thập kỷ kể từ khi nó được đăng.
Aravamudhan

120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-l Library.html hoạt động tốt nhất với tôi.

Trên Windows: Windows -> Tùy chọn -> Java -> Trình biên dịch -> Lỗi / Cảnh báo -> API không dùng nữa và bị hạn chế -> Tham chiếu bị cấm (quy tắc truy cập): -> thay đổi thành cảnh báo

Trên Mac OS X / Linux: Eclipse -> Tùy chọn -> Java -> Trình biên dịch -> Lỗi / Cảnh báo -> API không dùng nữa và bị hạn chế -> Tham chiếu bị cấm (quy tắc truy cập): -> thay đổi thành cảnh báo


62
Điều này có thể làm việc, nhưng nó không phải là một giải pháp thích hợp. Bạn cần hiểu tại sao hạn chế truy cập tồn tại ở nơi đầu tiên. Nó cũng sẽ ẩn tất cả các trường hợp tương lai của điều này, có thể quan trọng hơn!
Adrian Mouat

1
@AdrianMouat đó là khá nhiều không liên quan. Nếu tôi muốn nó biến mất, tôi muốn nó biến mất. Nhưng chắc chắn - người ta sẽ không mã hóa các API không công khai, không.
stolsvik

3
@stolsvik - bạn đã mất tôi; bạn đang nói lý do tại sao vấn đề tồn tại là không liên quan?
Adrian Mouat

1
Tôi có vấn đề này trên MỘT phương pháp. Tôi tưởng tượng việc sử dụng một JDK thay thế (như OpenJDK là một lựa chọn tốt hơn). Điều đó nói lên một điều rằng "nó có thể rất tuyệt" một lần. KHÔNG trong mã sản xuất. Không cho một nỗ lực thiết kế đang đi. Tôi không thể nói cho bạn biết có bao nhiêu ngày con người bị lạc trong loại hack này.
sẽ

5
@AdrianMouat - có ý nghĩa. Tôi ghét làm điều gì đó như thế này trong lò phản ứng hạt nhân - Quá nhiều nhiệt trong phòng điều khiển? Vì vậy, vô hiệu hóa tất cả các cảnh báo. Làm tiêu đề lớn vào ngày hôm sau. : P
david blaine

67

Tôi đã gặp vấn đề tương tự. Tôi tìm thấy câu trả lời trong trang web: http://www.17ext.com .
Đầu tiên, xóa Thư viện hệ thống JRE. Sau đó, nhập lại Thư viện hệ thống JRE.

Tôi không biết tại sao. Dù sao nó cũng khắc phục được vấn đề của tôi, hy vọng nó có thể giúp bạn.


10
Huh, rõ ràng bạn đã trả lời câu hỏi này giống như tôi đã làm, vài tháng trước. Không chắc tại sao sau đó tôi không thấy câu trả lời của bạn ...
Nels Beckman

34

Tôi đoán là bạn đang cố gắng thay thế một lớp tiêu chuẩn đi kèm với Java 5 bằng một lớp trong thư viện mà bạn có.

Điều này không được phép theo các điều khoản của thỏa thuận cấp phép, tuy nhiên AFAIK nó không được thi hành cho đến Java 5.

Tôi đã thấy điều này với QName trước đây và tôi đã "sửa" nó bằng cách xóa lớp khỏi jar mà tôi có.

EDIT http://www.manpagez.com/man/1/java/ ghi chú cho tùy chọn "-Xboot classpath:"

"Các ứng dụng sử dụng tùy chọn này cho mục đích ghi đè một lớp trong rt.jar không nên được triển khai vì làm như vậy sẽ trái với giấy phép mã nhị phân Môi trường thời gian chạy Java 2."

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

"Hạn chế công nghệ Java. Bạn không được sửa đổi Giao diện nền tảng Java (" JPI ", được xác định là các lớp có trong gói" java "hoặc bất kỳ gói con nào của gói" java "), bằng cách tạo các lớp bổ sung trong JPI hoặc gây ra bổ sung hoặc sửa đổi các lớp trong JPI. Trong trường hợp bạn tạo một lớp bổ sung và (các) API liên quan, (i) mở rộng chức năng của nền tảng Java và (ii) được tiếp xúc với các nhà phát triển phần mềm bên thứ ba cho Mục đích phát triển phần mềm bổ sung gọi API bổ sung đó, bạn phải nhanh chóng xuất bản rộng rãi một đặc tả chính xác cho API đó để mọi nhà phát triển sử dụng miễn phí. Bạn không được tạo hoặc ủy quyền cho người được cấp phép của mình để tạo, các lớp, giao diện bổ sung,hoặc các gói con theo bất kỳ cách nào được xác định là "java", "javax", "sun" hoặc quy ước tương tự như được chỉ định bởi Sun trong bất kỳ chỉ định quy ước đặt tên nào. "


2
đó là nó. một trong các lọ trong đường dẫn có lớp QName trong đó. tìm thấy . -name "* .jar" -print -exec giải nén -t {} \; | grep "QName" đã tìm thấy nó.
sal

1
Bạn có thể cung cấp một tài liệu tham khảo về việc không được phép thay thế các lớp gửi bằng Java không? Tất cả những gì tôi tìm thấy trong thỏa thuận cấp phép là các hạn chế liên quan đến việc phân phối Java, không phải các chương trình Java, nhưng tôi đã không tìm kiếm rất lâu.
Adrian Mouat

25

Tôi cũng đã gặp phải lỗi này, nhưng dự án của tôi được xây dựng trên dòng lệnh bằng Maven và trình biên dịch tycho (đó là một tập hợp các plugin OSGi). Sau khi hàng loạt người thông qua những người có cùng một vấn đề nhưng sửa nó trong Eclipse chứ không phải trên dòng lệnh, tôi tìm thấy một thông báo trên diễn đàn nhà phát triển Tycho trả lời câu hỏi của tôi, sử dụng cấu hình pom.xmlđể bỏ qua cảnh báo của trình biên dịch về hạn chế truy cập:

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

Thông tin thêm có thể được tìm thấy trong Câu hỏi thường gặp Tycho . Điều này khiến tôi phải AGES để giải quyết, vì vậy tôi đoán rằng tôi sẽ hỗ trợ bất kỳ ai khác cố gắng khắc phục các lỗi hạn chế truy cập này từ dòng lệnh bằng cách đăng câu trả lời này.


13
  • Chuyển đến cài đặt Đường dẫn xây dựng trong thuộc tính dự án. Windows -> Preferences -> Java Compiler
  • Xóa thư viện hệ thống JRE
  • Thêm một JRE khác với "kết hợp hoàn hảo"
  • làm sạch và xây dựng dự án của bạn một lần nữa. Nó làm việc cho tôi.

13

Tôi chỉ có vấn đề này quá. Rõ ràng tôi đã đặt JRE thành 1.5 thay vì 1.6 trong đường dẫn xây dựng của mình.


1
Vấn đề tương tự ở đây. Trong trường hợp của tôi, sử dụng Maven mặc định là 1,5 nếu không xác định.
Greg Haskins

Hãy nhớ đặt cái này trong POM của bạn để nó không thay đổi khi được cập nhật. <property> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </ property>
Philip Rego

8

Ngoài giải pháp của Nels Beckman , tôi có các mẹo sau:

Trong Cấu hình đường dẫn xây dựng , tôi phải sắp xếp lại thứ tự các mục nhập của mình trong phần Đặt hàng và Xuất .

Ngoài ra, với tư cách là nhà phát triển PDE của Eclipse, tôi cần sắp xếp lại thứ tự các phụ thuộc của mình trong đó MANIFEST.MF, thêm gói có vấn đề như đầu tiên trong danh sách.

Chơi với các mặt số này, cùng với việc chạy Project> Clean ở giữa, tôi có thể giải quyết các cảnh báo này.


8

Đối với tôi điều này làm thế nào tôi giải quyết nó:

  • đi đến con đường 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 không gian làm việc (jdk1.8xx)" HOẶC JRE thay thế
  • Nhấp vào kết thúc
  • Nhấn vào 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 chứ không phải JRE C: \ Program Files \ Java \ jdk1.8.0_74

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


Của tôi đã được đặt thành 1.7 ... 79, vì vậy tôi đã hoảng loạn. Nhưng tôi chỉ cần chọn lại nó, nhấp vào Áp dụng và lỗi đã biến mất. Phù
Marvo

Ồ Điều này cũng giúp ở đây - thay đổi từ "môi trường thực thi" sang "JRE thay thế". Nếu bất cứ ai có bất kỳ lời giải thích hợp lý nào cho việc này .. (ở đây đã xảy ra sau khi thay đổi Java vòi dự án từ 1.5 (5.0 trong tệp cấu hình .sinstall) thành 1.8. Thay đổi từ lỗi sang cảnh báo trong các prefs toàn cầu (xem câu trả lời khác) đã không help: still error. Đó là về các lớp mặt trời cũ mà chúng tôi sử dụng từ gói com.sun.image.codec. *)
hyphan

6

Xin lỗi vì đã cập nhật một POST cũ. Tôi đã nhận được vấn đề báo cáo và tôi đã giải quyết nó như đã nói dưới đây.

Giả sử bạn đang sử dụng plugin maven Eclipse + m2e, nếu bạn gặp lỗi hạn chế truy cập này, nhấp chuột phải vào dự án / mô-đun mà bạn gặp lỗi -> Thuộc tính -> Đường dẫn xây dựng -> Thư viện -> Thay thế JDK / JRE đến cái được sử dụng trong không gian làm việc nhật thực.

Tôi đã làm theo các bước trên và vấn đề được giải quyết.


Đủ công bằng, nhưng về cơ bản, bạn đã sao chép cách diễn đạt câu trả lời được chấp nhận của Nels Beckman.
Steven Wolfe

5

Trong trường hợp bạn chắc chắn rằng bạn sẽ có thể truy cập vào lớp đã cho, điều này có nghĩa là bạn đã thêm một số lọ vào dự án của mình có chứa các lớp có tên giống nhau (hoặc đường dẫn) nhưng nội dung khác nhau và chúng làm lu mờ lẫn nhau (thường là một tùy chỉnh cũ build jar chứa phiên bản cũ hơn của thư viện bên thứ 3).

Ví dụ: khi bạn thêm một jar thực hiện:

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

nhưng cũng chỉ là một phiên bản cũ hơn:

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

Mọi thứ hoạt động tốt trong trình chỉnh sửa mã nhưng không thành công trong quá trình biên dịch nếu thư viện "cũ" làm lu mờ cái mới - d2 đột nhiên biến thành "mất tích hoặc không thể truy cập" ngay cả khi nó ở đó.

Giải pháp là kiểm tra thứ tự của các thư viện thời gian biên dịch và đảm bảo rằng thư viện có triển khai đúng sẽ đi trước.


4

Chuyển đến Đường dẫn xây dựng Java trong thuộc tính dự án. Xóa Thư viện hệ thống JRE hiện có Sau đó thêm lại, tức là Thêm thư viện -> JRE Lib - chọn jre ---> Kết thúc. Cuối cùng chọn thứ tự và tab xuất chọn JRE Lib và di chuyển lên trên. Đó là nó.


3

Chỉ cần thay đổi thứ tự xây dựng thư viện đường dẫn của dự án của bạn. Nhấp chuột phải vào dự án> Đường dẫn xây dựng> Cấu hình đường dẫn xây dựng> Chọn thứ tự và xuất (Tab)> Thay đổi thứ tự của các mục nhập. Tôi hy vọng việc chuyển "thư viện hệ thống JRE" xuống phía dưới sẽ hoạt động. Nó làm việc như vậy đối với tôi. Dễ dàng và đơn giản .... !!!


3

Trong trường hợp của tôi, có một sự không phù hợp giữa đường dẫn xây dựng JRE và JRE được cài đặt trên môi trường thực thi. Tôi chuyển vào Project> Properties> Trình biên dịch Java. Có một thông điệp cảnh báo ở phía dưới.

Tôi đã nhấp vào các liên kết 'JRE đã cài đặt', 'Môi trường thực thi', 'Đường dẫn xây dựng Java' và thay đổi phiên bản JDK thành 1.7 và cảnh báo biến mất.


0

Thêm một Hệ thống JRE đúng thông qua đường dẫn xây dựng là giải pháp nhưng nhật thực của bạn vẫn có thể có lỗi. Để giải quyết điều đó, hãy đi tới đường dẫn Java Build -> Đặt hàng và xuất và di chuyển thư viện hệ thống JRE của bạn lên trên cùng. Điều này đã giải quyết vấn đề của tôi.

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.