Pembatasan akses: Jenis 'Aplikasi' bukan API (pembatasan pada perpustakaan yang diperlukan rt.jar)

178

Ini kodenya:

package mscontroller;

import javax.swing.*;
import com.apple.eawt.Application;

public class Main {
    public static void main(String[] args)
    {
        Application app = new Application();
        app.setEnabledAboutMenu(true);

        AMEListener listener = new AMEListener();
        app.addApplicationListener(listener);
        JFrame mainFrame = new JFrame("Application Menu Example");
        mainFrame.setSize(500, 500);
        mainFrame.setVisible(true);
    }
}

ini kesalahannya:

Exception in thread "main" java.lang.Error: Unresolved compilation
problems:   Access restriction: The type 'Application' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The constructor 'Application()' is not API
(restriction on required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The type 'Application' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    Access restriction: The method
'Application.setEnabledAboutMenu(boolean)' is not API (restriction on
required library
'/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')
    AMEListener cannot be resolved to a type    AMEListener cannot be
resolved to a type

    at mscontroller.Main.main(Main.java:9)

gerhana mengatakan ini:

Pembatasan akses: Jenis 'Aplikasi' bukan API (pembatasan pada perpustakaan yang dibutuhkan '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')

www139
sumber
3
Coba jalankan ini menggunakan Java 7.
spoko
Tidak menggunakan Xcode (belum)
www139
Saya tidak terbiasa dengan java, orang itu tidak memberikan jalur yang tepat. Apa yang dia maksud dengan: com / sun / xml / internal / **
www139
1
Bisakah Anda menafsirkan jalan apa yang dia bicarakan? Terima kasih! Di masa depan saya akan beralih ke xCode atau netbeans. Pria di atas berkata untuk mencoba java 7, bukan?
www139

Jawaban:

276

Ini terjadi pada saya juga, dan jawaban yang diberikan di sini sudah tidak memuaskan, jadi saya melakukan penelitian sendiri.

Latar Belakang: Pembatasan akses Eclipse

Eclipse memiliki mekanisme yang disebut pembatasan akses untuk mencegah Anda menggunakan kelas secara tidak sengaja yang menurut Eclipse bukan bagian dari API publik. Biasanya, Eclipse benar tentang hal itu, dalam kedua pengertian: Kami biasanya tidak ingin menggunakan sesuatu yang bukan bagian dari API publik. Dan Eclipse biasanya benar tentang apa yang ada dan apa yang bukan bagian dari API publik.

Masalah

Sekarang, mungkin ada situasi, di mana Anda ingin menggunakan Non-API publik, seperti sun.misc(Anda seharusnya tidak, kecuali Anda tahu apa yang Anda lakukan). Dan mungkin ada situasi, di mana Eclipse tidak sepenuhnya benar (itulah yang terjadi pada saya, saya hanya ingin menggunakannya javax.smartcardio). Dalam hal ini, kami mendapatkan kesalahan ini di Eclipse.

Larutan

Solusinya adalah mengubah batasan akses.

  • Pergi ke properti proyek Java Anda,
    • yaitu dengan memilih "Properties" dari menu konteks proyek di "Package Explorer".
  • Pergi ke "Java Build Path", tab "Libraries".
  • Luaskan entri perpustakaan
  • Pilih
    • "Aturan akses",
    • "Edit ..." dan
    • "Tambah ..." a "Resolusi: Dapat diakses" dengan pola aturan yang sesuai. Bagi saya itu " javax/smartcardio/**", bagi Anda mungkin malah " com/apple/eawt/**".
Christian Hujer
sumber
28
Saya memiliki Eclipse Mars (4.5.0) dan tidak ada aturan akses di Java Build Path -> Libraries. FWIW ada palu yang lebih besar (Anda dapat mematikan semuanya) di Preferensi -> Java -> Compiler -> Kesalahan / Peringatan -> API yang sudah tidak digunakan lagi dan Dibatasi.
Jonathan Ross
4
Saya memiliki Eclipse Mars.1 Release (4.5.1). Bagi saya keduanya solusi berhasil. Jawaban dari Christian dan komentar dari Jonathan. Di tab Perpustakaan Anda harus membuka satu di antara "JAR dan folder kelas" yang tercantum untuk melihat "Aturan akses" miliknya.
Laszlo Hirdi
3
Ini TIDAK bekerja untuk saya. Gerhana Luna. Mencoba JDK 1.8, 1.7, menambahkan aturan akses, proyek bersih, kesalahan terus kembali. Juga mencoba saran @JonathanRoss - pertama di Level Proyek. Di sana, meskipun konfigurasi tingkat Proyek untuk API Terlarang / Tidak Disarankan diatur ke Peringatan, saya masih mendapatkan kesalahan. Saya kemudian mencoba (seperti yang disarankan Jonathan) melalui preferensi untuk pengaturan tingkat ruang kerja, dan ADA, API Terlarang diatur ke Kesalahan. Mengubah ke peringatan di sana memang membuat masalah hilang, tetapi pengaturan tingkat proyek harus ditimpa, berpikir itu adalah bug di Eclipse.
Steve Cohen
2
Saya tidak diizinkan untuk memodifikasi pembatasan akses dalam kasus saya: Eclipse Neon dengan proyek jar pada jar "jfxrt.jar".
pdem
2
Ada alternatif yang jauh lebih sederhana: menghapus dan menambahkan kembali Perpustakaan Sistem JRE, sebagaimana ditunjukkan dalam stackoverflow.com/a/2174607/222838
mico
81

Saya mengalami masalah yang sama. Ketika saya awalnya membuat proyek java di Eclipse saya menentukan JRE 8. Ketika saya pergi ke jalur pembangunan proyek dan mengedit Perpustakaan Sistem JRE, lingkungan eksekusi Java 8 dipilih. Ketika saya memilih untuk menggunakan "Alernate JRE" (masih java 8) itu memperbaiki kesalahan untuk saya.

Amber
sumber
2
Saya lebih suka perbaikan global, tetapi lebih baik daripada semua jawaban lain yang memungkinkan API terbatas secara global. (Saya tidak ingin secara tidak sengaja menggunakan matahari. * Dalam aplikasi javafx saya).
Mark Jeronimus
1
Terima kasih, ini menghapus semua peringatan di proyek saya. Eclipse mengeluh tentang semua kelas yang disediakan oleh JavaFX (jfxrt.jar)
Goran Vasic
2
Dikonfirmasi ... Saya mengubah JRE 8 u60 dengan ... JRE 8 u60. Rupanya, pembangunan kembali ini dipicu, sebagai lawan dari cara lain untuk melakukannya, memiliki efek samping memperbaiki masalah tersebut. (Untuk penjelasan lebih rinci tentang cara mengubah pengaturan ini, lihat jawaban Nikhil Mahajan di sini: stackoverflow.com/questions/6881622/… .)
penatua
Terima kasih! Dengan strategi ini saya berhasil menyusun kerangka java spark.
Martin Pabst
1
Anehnya ini berhasil. Saya hanya memiliki satu JDK diinstal. Aneh sekali.
WesternGun
65

Menambahkan izin yang dapat diakses javafx dalam gerhana oksigen, masuk ke proyek> properti> java build path> libraries> kemudian perluas perpustakaan dan klik dua kali pada> Aturan akses di sana Anda mengatur izin. Resolusi: Pola Aturan yang Dapat Diakses: javafx / **

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

vidyakumargv
sumber
23

Untuk memulainya ( dan tidak terkait ), membuat instance Applicationkelas sendiri tampaknya bukan tujuan penggunaannya. Dari apa yang dapat dibaca dari sumbernya , Anda diharapkan menggunakan instance statis yang dikembalikan oleh getApplication().

Sekarang mari kita ke laporan kesalahan Eclipse. Aku sudah berlari ke dalam masalah yang sama baru-baru ini: Access restriction: The method ... is not API (restriction on required project). Saya menyebut metode tersebut sebagai metode objek yang mewarisi metode itu dari kelas super. Yang harus saya lakukan adalah menambahkan paket super class ke dalam paket yang diimpor oleh plugin saya.

Namun, ada banyak penyebab kesalahan yang berbeda berdasarkan "pembatasan proyek / perpustakaan yang diperlukan ". Mirip dengan masalah yang dijelaskan di atas, tipe yang Anda gunakan mungkin memiliki dependensi untuk paket yang tidak diekspor oleh perpustakaan atau mungkin tidak diekspor sendiri. Dalam hal ini Anda dapat mencoba melacak paket yang hilang dan mengekspornya sendiri, seperti yang disarankan di sini , atau coba Aturan Akses. Skenario lain yang mungkin termasuk:

  • Eclipse ingin mencegah Anda menggunakan paket yang tersedia yang bukan bagian dari Java API publik (solusi 1 , 2 )
  • Dependensi dipenuhi oleh berbagai sumber, versi saling bertentangan, dll. (Solusi 1 , 2 , 3 )
  • Eclipse menggunakan JRE di mana JDK diperlukan (yang mungkin terjadi di sini, dari apa kesalahan Anda katakan; solusi ) atau versi JRE / JDK dalam jalur pembangunan proyek bukan yang benar

Ini berakhir lebih sebagai medley masalah yang terkait dengan pembatasan daripada jawaban yang sebenarnya. Tetapi karena pembatasan pada proyek yang diperlukan adalah kesalahan serbaguna untuk dilaporkan, resep yang sempurna mungkin masih dapat ditemukan.

J. Katzwinkel
sumber
18

Saya punya masalah ini karena segi proyek yang terkait dengan proyek saya adalah versi java yang salah.

Untuk memperbaikinya, saya melakukan yang berikut:

  1. Klik kanan pada proyek dan pilih Properties
  2. Pilih 'Project Facets' dan ubah versi java menjadi sesuatu yang lebih besar dari 1.4.
  3. Klik [Terapkan]

Ini akan membangun kembali proyek Anda dan mudah-mudahan kesalahan akan teratasi.

Kiriya Keat
sumber
15

Kami harus mengubah aplikasi kami agar sesuai dengan JDK 1.8 menggunakan Window-> Preferences-> Java-> Installed JREs . Namun, setelah mengubah itu, Pustaka Sistem JRE yang ditentukan dalam Project Explorer masih salah. Untuk memperbaikinya, klik kanan pada "JRE System Library [salah-jre-sini]" dan ubah dari lingkungan Eksekusi: ke "Workspace Default (yer-default-here)"

masukkan deskripsi gambar di sini

Dinsdale
sumber
1
Terima kasih! Itu menyelamatkan hidupku :)
KMC
13

Berhasil: Properti Proyek -> ProjectFacets -> Runtimes -> jdk1.8.0_45 -> Terapkan

Kamila O
sumber
sistem menutup telepon :(
Saikat
12

Di bilah menu Eclipse teratas:

Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> 
Deprecated and restricted API -> Forbidden reference (access rules): -> change to warning
Phil Long
sumber
9

Jika Anda mengalami masalah yang sama menggunakan Spring Tool Suite:

IDE yang mendasari Spring Tool Suite sebenarnya adalah Eclipse. Saya mendapatkan kesalahan ini sekarang mencoba menggunakan beberapa com.sun.netkelas. Untuk menghapus kesalahan ini dan mencegahnya muncul di platform Eclipse Luna SR1 (4.4.2) dari STS:

  • Arahkan ke Project> Properties
  • Perluas judul Java Compiler
  • Klik pada Kesalahan / Peringatan
  • Perluas API yang sudah usang dan terbatas
  • Di sebelah "Referensi terlarang (aturan akses)" pilih "abaikan"
  • Di sebelah "Referensi yang tidak disarankan (aturan akses)" pilih "abaikan"

Anda baik untuk pergi.

Penutupan
sumber
6

Punya masalah yang sama. Inilah cara saya menyelesaikannya: Buka Package Explorer. Klik kanan pada JRE System Library dan pergi ke Properties. Di Classpath Container> Pilih JRE untuk jalur pembangunan proyek, pilih opsi ketiga (WorkREace default JRE).

Sumber: https://thenewboston.com/forum/topic.php?id=3917

Nishant_Singh
sumber
1
Terima kasih ... menggunakan jawaban yang diajukan oleh C Hujer Saya benar-benar menemukan ada "162 aturan (tidak dapat dimodifikasi)" untuk file jfxrt.jar!
mike rodent
5

Buka pengaturan berikut:

Window -> Preferences -> Java-Compiler-Errors / Warnings-Deprecated dan dibatasi API-Forbidden reference (aturan akses)

Atur ke Warningatau Ignore.

cxj
sumber
5

Kami menggunakan IBM Rational Application Developer (RAD) dan memiliki masalah yang sama.

Pesan eror:

Pembatasan akses: Jenis 'JAXWSProperties' bukan API (pembatasan pada pustaka yang diperlukan 'C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar')

Larutan:

pergi ke java build path dan di bawah tab Library, hapus JRE System Library. Kemudian lagi Tambahkan Perpustakaan -> JRE System Library

Jonas_Hess
sumber
4

Dalam Eclipse Mars.2 Rilis (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
pilih JRE ... dan tekan Edit: Beralih ke JRE Workspace (jdk1.8.0_77)

Bekerja untukku.

Sven
sumber
3

Saya mengalami eclipse JRE 8.112, tidak yakin apakah itu penting tetapi yang saya lakukan adalah ini:

  1. Klik kanan pada folder proyek saya
  2. pergi ke properti dan mengklik
  3. klik pada folder java build path
  4. Begitu masuk, saya sudah memesan dan mengekspor
  5. Saya memeriksa Perpustakaan Sistem JRE [jre1.8.0_112]
  6. kemudian memindahkannya di atas satu pustaka sistem JRE lain di sana (tidak yakin apakah ini penting)
  7. lalu tekan ok

Ini menyelesaikan masalah saya.

quasar-light
sumber
2

Saya cukup menambahkan e (fx) clipse di pasar gerhana. Mudah dan sederhana

jessie
sumber
1

Saya menggunakan neon gerhana 3. Saya hanya ingin menggunakan javafx.application.Application, jadi saya mengikuti jawaban Christian Hujer di atas dan berhasil. Hanya beberapa tips: aturan akses sangat mirip dengan pernyataan impor. Bagi saya, aturan akses yang saya tambahkan adalah "javafx / application / **". Cukup ganti titik dalam pernyataan impor dengan garis miring dan itulah aturannya. Semoga itu bisa membantu.

Tony S
sumber
1

Saya punya masalah yang sedikit berbeda. Dalam Project - Properties - Libraries - JRE library, saya memiliki versi lib JRE yang salah. Hapus dan atur yang sebenarnya, dan voila - semua Access restriction...peringatan tidak ada.

Gangnus
sumber
1

Bahkan jika itu pertanyaan lama, bagi saya di Eclipse saya klik kanan pada folder Src dan properti (Alt + Enter) dan centang untuk Ignore optional compile problemsmenghapus kesalahan.

masukkan deskripsi gambar di sini

MrSimpleMind
sumber
0

Jika seseorang mengalami masalah ini hanya di alat CI Anda saat menjalankan maven, apa triknya bagi saya adalah menentukan secara eksplisit lingkungan eksekusi di komputer Anda MANIFEST.MF.

Dalam kasus saya, saya melakukan ini dengan memasukkan baris berikut dalam file manifes bundel OSGi saya:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Fernando Paz
sumber