Pembatasan akses di kelas karena pembatasan pada perpustakaan yang diperlukan rt.jar?

824

Saya mencoba untuk mengkompilasi kode Java 1.4 yang dibuat oleh IBM WSDL2Java di Java5 tanpa membuat ulang bertopik dan melihat kesalahan ini di Eclipse .
Saya di bawah asumsi bahwa bertopik yang dihasilkan harus mengkompilasi selama runtime jarstersedia (mereka).

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

Nama kelas lengkapnya adalah javax.xml.namespace.QName

Apa sebenarnya yang terjadi di sini? Apakah ini kasus di mana saya mencoba refactor babi dari sosis? Apakah saya lebih baik menciptakan kembali bertopik?

sal
sumber
1
Saya tidak mengerti, mengapa Anda tidak hanya mengkompilasinya di tempat lain dan menjalankannya di lingkungan yang Anda targetkan (jadi saya kira) 1.4?
Tim Büthe
Lingkungan target akhirnya adalah jboss4.2 di jdk5.
sal
2
Tentang status "dilindungi": Dalam StackOverflow Tidak ada yang mengatakan "Terima kasih" atau "saya juga" sebagai upvote;)
OscarRyz
6
Lihat Jawaban Terbanyak-dipilih besar ... Abaikan 96% dari sisa halaman ini. Cari: "Nels Beckman", 1 Feb '10 jam 4:09
akan
1
Apa yang berhasil bagi saya adalah mengedit / mengubah Pustaka Sistem JRE dari lingkungan Eksekusi (atau default Workspace) ke Alternate JRE (Saya memilih versi Java yang sama). Anda juga harus memastikan (1) urutan yang benar di tab Pesanan dan Ekspor , (2) tingkat kepatuhan yang benar dalam pengaturan Java Compiler (sama dengan versi Java yang dipilih).
ADTC

Jawaban:

1884

Ada solusi lain yang juga berfungsi.

  1. Pergi ke pengaturan Membangun Jalur di properti proyek.
  2. Hapus Perpustakaan Sistem JRE
  3. Tambahkan kembali; Pilih "Tambah Perpustakaan" dan pilih Perpustakaan Sistem JRE . Defaultnya bekerja untuk saya.

Ini berfungsi karena Anda memiliki beberapa kelas dalam file jar yang berbeda. Menghapus dan menambahkan kembali lib JRE akan membuat kelas yang tepat menjadi yang pertama. Jika Anda menginginkan solusi mendasar, pastikan Anda mengecualikan file jar dengan kelas yang sama.

Bagi saya saya: javax.xml.soap.SOAPPartdalam tiga toples yang berbeda: axis-saaj-1.4.jar, saaj-api-1.3.jardanrt.jar

Nels Beckman
sumber
1
Apakah ini bug Eclipse atau apakah kami secara tidak sengaja mengatasi pembatasan (dan melanggar ketentuan lisensi)? Jika itu bug Eclipse, lalu adakah bug yang diajukan?
docwhat
@Doctor Saya tidak pernah menggunakan ini untuk kode apa pun yang sangat penting, jadi saya tidak menyelidiki lebih lanjut ... Jika Anda menemukan sesuatu, beri tahu kami.
Nels Beckman
3
@ URL87 Jika Anda mengklik kanan pada folder proyek, masuk ke "Build Path ...", "Configure Build Path", "Libraries" (tab), Anda akan melihat "Add Library" sebagai salah satu tombol di sebelah kanan .. Ini juga merupakan daya tarik bagi saya, jawaban yang luar biasa
Alexei Blue
8
Solusi yang lebih baik di bawah Eclipse versi terbaru adalah tidak menghapus JRE System Library, tetapi pergi ke tab "Order and Export" dan hanya memindahkan JRE System Library ke bawah (yang secara efektif menghapus dan menambahkannya, tetapi Anda tidak perlu dihapus dan tambahkan untuk melakukannya).
user1676075
1
Ini adalah 2018 dan versi gerhana 5.0. Bug / masalah ini masih ada. Terima kasih banyak @NelsBeckman. Jawaban Anda telah membantu saya setelah 3/4 dekade sejak diposting.
Aravamudhan
120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.html bekerja paling baik untuk saya.

Pada Windows: Windows -> Preferensi -> Java -> Kompiler -> Kesalahan / Peringatan -> API yang sudah usang dan dibatasi -> Referensi terlarang (aturan akses): -> ubah ke peringatan

Pada Mac OS X / Linux: Eclipse -> Preferences -> Java -> Compiler -> Kesalahan / Peringatan -> API usang dan dibatasi -> Referensi terlarang (aturan akses): -> ubah ke peringatan

sommab
sumber
62
Ini mungkin berhasil, tetapi itu bukan solusi yang tepat. Anda harus memahami mengapa pembatasan akses ada di tempat pertama. Ini juga akan menyembunyikan semua kasus masa depan ini, yang mungkin lebih penting!
Adrian Mouat
1
@AdrianMouat yang tidak relevan. Jika saya ingin pergi, saya ingin pergi. Tapi tentu saja - seseorang tidak boleh kode terhadap API non-publik, tidak.
stolsvik
3
@stolsvik - Anda telah kehilangan saya; apakah Anda mengatakan alasan mengapa masalah itu ada tidak relevan?
Adrian Mouat
1
Saya memiliki masalah ini pada SATU metode. Saya membayangkan penggunaan JDK alternatif (seperti OpenJDK adalah pilihan yang lebih baik). Yang mengatakan untuk satu hal itu mungkin keren sekali. BUKAN dalam kode produksi. Bukan untuk upaya desain yang sedang berjalan. Saya tidak bisa memberi tahu Anda berapa banyak hari kerja yang hilang karena jenis ini.
akan
5
@AdrianMouat - masuk akal. Aku benci melakukan hal seperti ini di reaktor nuklir - Terlalu panas di ruang kontrol? Jadi, nonaktifkan semua peringatan. Buat berita utama hari berikutnya. : P
david blaine
67

Saya menemui masalah yang sama. Saya menemukan jawabannya di situs web: http://www.17ext.com .
Pertama, hapus JRE System Libraries. Kemudian, impor Pustaka Sistem JRE lagi.

Saya tidak tahu mengapa. Namun, itu bisa menyelesaikan masalah saya, semoga bisa membantu Anda.

sanwanxian
sumber
10
Huh, ternyata Anda menjawab pertanyaan ini dengan cara yang sama seperti yang saya lakukan, beberapa bulan sebelumnya. Tidak yakin mengapa saya tidak melihat jawaban Anda saat itu ...
Nels Beckman
34

Dugaan saya adalah bahwa Anda mencoba untuk mengganti kelas standar yang dikirimkan dengan Java 5 dengan satu di perpustakaan yang Anda miliki.

Ini tidak diizinkan berdasarkan ketentuan perjanjian lisensi, namun AFAIK tidak diberlakukan sampai Java 5.

Saya telah melihat ini dengan QName sebelumnya dan saya "memperbaikinya" dengan menghapus kelas dari toples yang saya miliki.

EDIT http://www.manpagez.com/man/1/java/ catatan untuk opsi "-Xbootclasspath:"

"Aplikasi yang menggunakan opsi ini untuk tujuan mengganti kelas di rt.jar tidak boleh digunakan karena hal itu akan melanggar lisensi kode biner Java 2 Runtime Environment."

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

"Pembatasan Teknologi Java. Anda tidak boleh memodifikasi Java Platform Interface (" JPI ", diidentifikasi sebagai kelas yang terkandung dalam paket" java "atau subpackages dari paket" java "), dengan membuat kelas tambahan di dalam JPI atau menyebabkan penambahan atau modifikasi kelas di JPI. Jika Anda membuat kelas tambahan dan API terkait yang (i) memperluas fungsi platform Java, dan (ii) dihadapkan pada pengembang perangkat lunak pihak ketiga untuk tujuan mengembangkan perangkat lunak tambahan yang memanggil API tambahan seperti itu, Anda harus segera menerbitkan secara luas spesifikasi yang akurat untuk API tersebut untuk digunakan secara gratis oleh semua pengembang. Anda tidak boleh membuat, atau mengotorisasi pemegang lisensi untuk membuat, kelas tambahan, antarmuka,atau subpackages yang dengan cara apa pun diidentifikasi sebagai "java", "javax", "sun" atau konvensi serupa seperti yang ditentukan oleh Sun dalam setiap penamaan konvensi penamaan. "

Peter Lawrey
sumber
2
itu dia. salah satu stoples di jalan memiliki kelas QName di dalamnya. Temukan . -nama "* .jar" -print -exec unzip -t {} \; | grep "QName" menemukannya.
sal
1
Bisakah Anda memberikan referensi tentang tidak diizinkan untuk mengganti kelas yang dikirimkan dengan Java? Yang saya temukan dalam perjanjian lisensi adalah pembatasan terkait dengan mendistribusikan Java itu sendiri, bukan program Java, tetapi saya tidak mencari terlalu lama.
Adrian Mouat
25

Saya telah mendapatkan kesalahan ini juga, tetapi proyek saya dibangun pada baris perintah menggunakan Maven dan tycho compiler (ini adalah satu set plugin OSGi). Setelah massa menyaring orang-orang yang memiliki masalah yang sama tetapi memperbaikinya di Eclipse daripada di baris perintah, saya menemukan pesan di forum pengembang Tycho yang menjawab pertanyaan saya, menggunakan konfigurasi pom.xmluntuk mengabaikan peringatan kompiler tentang pembatasan akses:

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

Informasi lebih lanjut dapat ditemukan di Tycho FAQ . Ini membuat saya AGES untuk bekerja, jadi saya pikir saya akan membantu orang lain yang mencoba untuk memperbaiki kesalahan pembatasan akses ini dari baris perintah dengan memposting jawaban ini.

Dawngerpony
sumber
13
  • Pergi ke pengaturan Membangun Jalur di properti proyek. Windows -> Preferences -> Java Compiler
  • Hapus Perpustakaan Sistem JRE
  • Tambahkan JRE lain dengan "pasangan yang sempurna"
  • bersihkan dan bangun proyek Anda lagi. Ini berhasil untuk saya.
Mayur
sumber
13

Saya hanya punya masalah ini juga. Rupanya saya telah menetapkan JRE ke 1,5 bukannya 1,6 di jalur build saya.

Dorus
sumber
1
Masalah yang sama di sini. Dalam kasus saya, menggunakan Maven yang standarnya menjadi 1,5 jika tidak ditentukan.
Greg Haskins
Ingatlah untuk meletakkan ini di POM Anda sehingga tidak berubah kembali saat diperbarui. <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </properties>
Philip Rego
8

Selain solusi Nels Beckman , saya punya tips berikut:

Di bawah Configure Build Path , saya harus mengatur ulang urutan entri saya di bawah Order dan Ekspor .

Selain itu, sebagai pengembang Eclipse PDE, saya perlu mengatur ulang urutan dependensi saya di saya MANIFEST.MF, menambahkan paket yang bermasalah sebagai yang pertama dalam daftar.

Bermain dengan tombol-tombol ini, bersama dengan menjalankan Project> Clean di antaranya, saya dapat menyelesaikan peringatan ini.

modulitos
sumber
8

bagi saya ini bagaimana saya menyelesaikannya:

  • pergi ke jalur pembangunan proyek saat ini

di bawah Perpustakaan

  • pilih " JRE System Library [jdk1.8xxx]"
  • klik edit
  • dan pilih "JRE default Workspace (jdk1.8xx)" ATAU Alternatif JRE
  • Klik selesai
  • Klik OK

masukkan deskripsi gambar di sini

Catatan: pastikan bahwa di Eclipse / Preferences (BUKAN proyek) / Java / Install JRE, bahwa jdk menunjuk ke folder JDK bukan JRE C: \ Program Files \ Java \ jdk1.8.0_74

masukkan deskripsi gambar di sini

usertest
sumber
Milik saya sudah diatur ke 1,7 ... 79, jadi saya panik. Tapi saya cukup memilihnya lagi, klik Apply, dan kesalahan itu hilang. Wah.
Marvo
Wow. Ini membantu di sini juga - berubah dari "lingkungan eksekusi" menjadi "JRE alternatif". Jika ada yang punya penjelasan logis untuk ini .. (ini terjadi setelah mengubah proyek-faucet Java dari 1,5 (5.0 dalam file konfigurasi .settings) menjadi 1.8. Mengubah dari kesalahan ke peringatan di global prefs (lihat jawaban lain) tidak help: masih error. Ini tentang kelas-kelas lama yang kita gunakan dari paket com.sun.image.codec. *)
hyphan
6

Maaf karena memperbarui POST lama. Saya mendapat masalah yang dilaporkan dan saya menyelesaikannya seperti yang dikatakan di bawah ini.

Dengan asumsi Anda menggunakan plugin Eclipse + m2e maven, jika Anda mendapatkan kesalahan pembatasan akses ini, klik kanan pada proyek / modul di mana Anda memiliki kesalahan -> Properties -> Build Path -> Library -> Ganti JDK / JRE ke salah satu yang digunakan di ruang kerja gerhana.

Saya mengikuti langkah-langkah di atas dan masalah teratasi.

Arun B Chandrasekaran
sumber
Cukup adil, tetapi pada dasarnya Anda meniru kata-kata dari jawaban yang diterima oleh Nels Beckman.
Steven Wolfe
5

Dalam hal ini Anda yakin bahwa Anda harus dapat mengakses kelas yang diberikan, daripada ini berarti Anda menambahkan beberapa botol ke proyek Anda yang berisi kelas dengan nama yang identik (atau jalur) tetapi konten yang berbeda dan mereka saling menaungi satu sama lain (biasanya sebuah kebiasaan lama build jar berisi perpustakaan perpustakaan pihak ke-3 versi lama).

Misalnya saat Anda menambahkan stoples yang menerapkan:

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

tetapi juga versi yang lebih lama hanya menerapkan:

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

Semuanya berfungsi dengan baik di editor kode tetapi gagal selama kompilasi jika pustaka "lama" menaungi yang baru - d2 tiba-tiba berubah "hilang atau tidak dapat diakses" bahkan ketika ada.

Solusinya adalah dengan memeriksa urutan pustaka waktu kompilasi dan memastikan bahwa pustaka dengan implementasi yang benar berjalan lebih dulu.

Pak Napik
sumber
4

Pergi ke Java Build Path di properti proyek. Hapus JRE System Library yang ada Kemudian Tambah lagi yaitu Tambah Library -> JRE Lib - pilih jre ---> Finish. Terakhir pilih pesanan dan ekspor tab pilih JRE Lib dan pindah ke atas. Itu dia.

Vijay Bhatt
sumber
3

Cukup ubah urutan pustaka jalur bangun proyek Anda. Klik kanan pada proyek> Build Path> Configure Build Path> Pilih Order and Export (Tab)> Ubah urutan entri. Saya harap memindahkan "pustaka Sistem JRE" ke bawah akan berfungsi. Itu berhasil bagi saya. Mudah dan sederhana .... !!!

Samitha Chathuranga
sumber
3

Dalam kasus saya ada ketidakcocokan antara JRE jalur pembangunan dan JRE diinstal pada lingkungan eksekusi. Saya pindah ke Project> Properties> Java compiler. Ada pesan peringatan di bagian bawah.

Saya mengklik tautan 'Installed JRE', 'Execution environment', 'Java build path' dan mengubah versi JDK menjadi 1.7 dan peringatan itu hilang.

Soumyajit Swain
sumber
0

Menambahkan Sistem JRE yang tepat melalui build path adalah solusinya tetapi gerhana Anda mungkin masih memiliki kesalahan. Untuk mengatasinya, buka Java Build path -> Order and Export dan pindahkan perpustakaan sistem JRE Anda di atas. Ini telah memecahkan masalah saya.

Abhishek Soni
sumber