Erişim kısıtlaması: 'Uygulama' türü API değil (gerekli kitaplık rt.jar kısıtlaması)


178

İşte kod:

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);
    }
}

İşte hata:

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)

eclipse bunu söylüyor:

Erişim kısıtlaması: 'Uygulama' türü API değil (gerekli kitaplık üzerindeki kısıtlama '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar')


3
Java 7'yi kullanarak bunu çalıştırmayı deneyin.
spoko

2

Xcode kullanılmıyor (henüz)
www139

Java'ya aşina değilim, adam kesin bir yol vermiyor. Ne anlama geliyor: com / sun / xml / internal / **
www139 21

1
Hangi yoldan bahsettiğini yorumlayabilir misiniz? Teşekkür ederim! Gelecekte xCode veya netbeans'a geçeceğim. Yukarıdaki adam java 7 denemek gerektiğini söyledi?
www139

Yanıtlar:


276

Bu da bana oldu ve burada verilen cevaplar zaten tatmin edici değildi, bu yüzden kendi araştırmamı yaptım.

Arka plan: Eclipse erişim kısıtlamaları

Eclipse, Eclipse'nin genel API'nın bir parçası olmadığını düşündüğü sınıfları yanlışlıkla kullanmanızı önlemek için erişim kısıtlamaları adı verilen bir mekanizmaya sahiptir . Genellikle, Eclipse her iki açıdan da haklıdır: Genellikle genel API'nin bir parçası olmayan bir şey kullanmak istemiyoruz. Ve Eclipse genellikle genel API'nin parçası olan ve olmayan şeyler konusunda haklıdır.

Sorun

Şimdi, herkese açık API olmayan kullanmak istediğiniz durumlar olabilir sun.misc( örneğin , ne yaptığınızı bilmiyorsanız yapmamalısınız). Ve Eclipse'nin gerçekten doğru olmadığı durumlar olabilir (bana olan buydu, sadece kullanmak istedim javax.smartcardio). Bu durumda, Eclipse'de bu hatayı alırız.

Çözüm

Çözüm, erişim kısıtlamalarını değiştirmektir.

  • Java projenizin özelliklerine gidin,
    • örneğin, "Paket Gezgini" ndeki projenin içerik menüsünden "Özellikler" i seçerek.
  • "Java Derleme Yolu", "Kütüphaneler" sekmesine gidin.
  • Kütüphane girişini genişletin
  • seçmek
    • "Erişim kuralları",
    • "Düzenle ..." ve
    • "Ekle ..." a "Çözüm: Erişilebilir", karşılık gelen bir kural düzeniyle. Benim için bu " javax/smartcardio/**" idi, bunun yerine " com/apple/eawt/**" olabilir .

28
Eclipse Mars (4.5.0) var ve Java Build Path -> Libraries'de hiçbir erişim kuralı yok. FWIW Tercihler -> Java -> Derleyici -> Hatalar / Uyarılar -> Kullanım Dışı ve Kısıtlı API'da daha büyük bir çekiç var (hepsini kapatabilirsiniz).
Jonathan Ross

4
Eclipse Mars.1 Sürümü (4.5.1) var. Benim için her iki çözüm de işe yaradı. Christian'ın cevabı ve Jonathan'ın yorumu. Kütüphaneler sekmesinde, "Erişim kuralları" nın ona ait olduğunu görmek için listelenen "JAR'lar ve sınıf klasörleri" arasından birini açmanız gerekir.
Laszlo Hirdi

3
Bu benim için işe yaramıyor. Tutulma Luna. JDK 1.8, 1.7 denendi, erişim kuralları eklendi, temiz proje, hatalar geri gelmeye devam ediyor. Ayrıca @JonathanRoss önerisini denedim - önce Proje Seviyesinde. Orada, Yasak / Cesaretten Arındırılmış API'ler için Proje düzeyinde yapılandırmalar Uyarı olarak ayarlanmış olsa da, yine de hatalar aldım. Daha sonra (Jonathan'ın önerdiği gibi) çalışma alanı düzeyi ayarları için tercihleri ​​gözden geçirdim ve THERE, Yasak API'ler Hata olarak ayarlandı. Orada uyarıyı değiştirmek sorunu ortadan kaldırdı, ancak proje düzeyi ayarının geçersiz kılınması gerekiyor, bunun Eclipse'de bir hata olduğunu düşünün.
Steve Cohen

2
Benim durumumda erişim kısıtlamasını değiştirmeme izin verilmedi: Eclipse Neon, "jfxrt.jar" kavanozunda bir maven kavanoz projesi ile.
pdem

3
Çok daha basit bir alternatif var: stackoverflow.com/a/2174607/222838
mico

81

Aynı sorunu yaşıyordum. Eclipse'de java projesini ilk oluşturduğumda JRE 8'i belirttim. Projenin derleme yoluna gittiğimde ve JRE Sistem Kütüphanesi'ni düzenlediğimde Java 8 yürütme ortamı seçildi. Bir "Uyarı JRE" (hala java 8) kullanmayı seçtiğimde benim için hatayı düzeltti.


2
Genel bir düzeltmeyi tercih ettim, ancak küresel olarak kısıtlanmış API'yı etkinleştiren diğer tüm cevaplardan daha iyi. (Yanlışlıkla güneşi kullanmak istemiyorum. * Javafx uygulamamda).
Mark Jeronimus

1
Teşekkürler, bu projemdeki tüm uyarıları temizledi. Eclipse, JavaFX (jfxrt.jar) tarafından sağlanan tüm sınıflar hakkında şikayet ediyordu
Goran Vasic

2
Onaylandı ... JRE 8 u60'ı ... JRE 8 u60 ile değiştirdim. Görünüşe göre, bu yeniden yapılanmanın, başka herhangi bir yolun aksine, sorunu düzeltmenin yan etkisi vardır. (Bu ayarın nasıl değiştirileceği hakkında daha ayrıntılı bir açıklama için, Nikhil Mahajan'ın cevabına buradan bakın: stackoverflow.com/questions/6881622/… .)
yaşlı ihtiyar

Teşekkür ederim! Bu strateji ile kıvılcım java çerçevesini başarılı bir şekilde derleyebildim.
Martin Pabst

1
Tuhaf bir şekilde bu işe yaradı. Yalnızca bir JDK yükledim. Ne kadar tuhaf.
WesternGun

65

Tutulma oksijenine javafx erişilebilir izni eklemek proje> özellikler> java oluşturma yolu> kütüphaneler> 'e gidin ve ardından kütüphaneleri genişletin ve> Erişim kurallarına çift tıklayın.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin


23

Başlangıç ​​olarak ( ve ilgisiz ), Applicationsınıfı kendiniz başlatmak onun amaçlanan kullanımı gibi görünmüyor. Kaynağından ne okuyabileceğinize göre, döndürülen statik örneği kullanmanız beklenir getApplication().

Şimdi Eclipse raporlarında hatayı alalım. Geçenlerde benzer bir sorun koştum ettik: Access restriction: The method ... is not API (restriction on required project). Söz konusu yöntemi, bu yöntemi bir süper sınıftan devralmış olan bir nesnenin yöntemi olarak adlandırdım. Tek yapmam gereken, süper sınıfın bulunduğu paketi eklentim tarafından içe aktarılan paketlere eklemekti.

Bununla birlikte, "gerekli proje / kütüphane kısıtlaması" na dayalı hataların birçok farklı nedeni vardır . Yukarıda açıklanan soruna benzer şekilde, kullandığınız tür kitaplık tarafından dışa aktarılmayan veya kendisinin dışa aktarılmayan paketlere bağımlı olabilir. Bu durumda, burada önerildiği gibi eksik paketleri bulup kendim dışa aktarabilir veya Erişim Kuralları'nı deneyebilirsiniz. Diğer olası senaryolar şunları içerir:

  • Eclipse, herkese açık Java API'sının bir parçası olmayan kullanılabilir paketleri kullanmamanızı istiyor (çözüm 1 , 2 )
  • Bağımlılıklar birden fazla kaynak tarafından karşılanır, sürümler çakışır vb. (Çözüm 1 , 2 , 3 )
  • Eclipse, bir JDK'nın gerekli olduğu bir JRE kullanıyor (bu durumda, hatalarınızın söylediklerinden; çözüm ) veya proje oluşturma yolundaki JRE / JDK sürümü doğru değil

Bu, gerçek bir cevaptan ziyade kısıtlama ile ilgili sorunların bir karması gibi sonuçlandı. Ancak , gerekli projelerde kısıtlama bildirilecek kadar çok yönlü bir hata olduğundan, mükemmel tarif muhtemelen hala bulunacaktır.


18

Bu sorunla karşılaştım, çünkü projemle ilişkili proje yönü yanlış java sürümü idi.

Bunu düzeltmek için aşağıdakileri yaptım:

  1. Projeye sağ tıklayın ve Özellikler'i seçin
  2. 'Proje Yönleri'ni seçin ve java sürümünü 1.4'ten daha büyük bir değere değiştirin.
  3. [Uygula] 'ya tıklayın

Bu projenizi yeniden inşa edecek ve umarım hata çözülecektir.


15

Pencere-> Tercihler-> Java-> Yüklü JRE'leri kullanarak JDK 1.8'e karşı oluşturmak için uygulamamızı değiştirmek zorunda kaldık . Ancak, bunu değiştirdikten sonra, Proje Gezgini'nde belirtilen JRE Sistem Kütüphanesi hala yanlıştı. Bunu düzeltmek için, "JRE Sistem Kütüphanesi [yanlış-jre-here]" öğesine sağ tıklayın ve Yürütme ortamından değiştirin: "Çalışma Alanı Varsayılanı (yer-default-here)"

resim açıklamasını buraya girin


1
Teşekkürler! Hayatım güvende :)
KMC

13

Çalıştı: Proje Özellikleri -> ProjectFacets -> Çalışma Zamanları -> jdk1.8.0_45 -> Uygula


sistem telefonu kapattı :(
Saikat

12

Eclipse üst menü çubuğunda:

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

9

Aynı sorunu Spring Tool Suite kullanarak da yaşıyorsanız:

Spring Tool Suite'in altında yatan IDE aslında Eclipse. Bu hatayı şimdi bazı com.sun.netsınıfları kullanmaya çalışırken aldım . Bu hataları gidermek ve STS'nin Eclipse Luna SR1 (4.4.2) platformunda ortaya çıkmasını önlemek için:

  • Proje> Özellikler'e gidin
  • Java Derleyici başlığını genişletin
  • Hatalar / Uyarılar'ı tıklayın
  • Kullanımdan kaldırılmış ve kısıtlanmış API'yı genişletin
  • "Yasak referans (erişim kuralları)" yanında "yoksay" ı seçin
  • "Vazgeçilen referans (erişim kuralları)" yanında "yoksay" ı seçin

Gitmek güzel.


6

Aynı sorun vardı. Bunu şu şekilde çözdüm: Package Explorer'a gidin. JRE Sistem Kütüphanesi'ne sağ tıklayın ve Özellikler'e gidin. Sınıfyolu Kapsayıcısında> Proje oluşturma yolu için JRE'yi seçin, üçüncü seçeneği (Çalışma Alanı varsayılan JRE) seçin.

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


1
Teşekkürler ... C Hujer tarafından önerilen cevabı kullanarak Aslında jfxrt.jar dosyası için "162 kural (değiştirilemez)" bulundu!
mike kemirgen

5

Aşağıdaki ayara gidin:

Pencere -> Tercihler -> Java-Derleyici-Hatalar / Uyarılar-Kullanımdan kaldırılmış ve kısıtlanmış API-Yasak referans (erişim kuralları)

WarningVeya olarak ayarlayın Ignore.


5

IBM Rational Application Developer (RAD) kullanıyoruz ve aynı sorunu yaşadık.

Hata mesajı:

Erişim kısıtlaması: 'JAXWSProperties' türü API değil (gerekli 'C: \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar kitaplığında kısıtlama)

Çözüm:

java oluşturma yoluna gidin ve Kütüphane sekmesi altında JRE Sistem Kütüphanesi'ni kaldırın. Sonra tekrar Kütüphane Ekle -> JRE Sistem Kütüphanesi


4

Eclipse Mars.2 Sürümünde (4.5.2):
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
JRE ... 'yi seçin ve Düzenle'ye basın: JRE Çalışma Alanına Geç (jdk1.8.0_77)

Benim için çalışıyor.


3

Tutulması JRE 8.112 var, bu önemli olup olmadığından emin değilim ama ne yaptım:

  1. Projeler klasörüne sağ tıklayın
  2. mülklere indi ve tıkladı
  3. Java yapı yolu klasörünü tıkladı
  4. içeride bir kez, sipariş ve ihracattaydım
  5. JRE Sistem Kütüphanesini kontrol ettim [jre1.8.0_112]
  6. daha sonra buradaki diğer bir JRE sistem kütüphanesinin üstüne taşındı (bunun önemli olup olmadığından emin değilim)
  7. sonra Tamam'a bastı

Bu benim sorunumu çözdü.


2

Sadece tutulma pazarında sadece e (fx) klibi ekliyorum. Kolay ve basit


1

Tutulma neon 3 kullanıyorum. Sadece javafx.application.Application kullanmak istedim, bu yüzden yukarıdaki Christian Hujer'ın cevabını takip ettim ve işe yaradı. Bazı ipuçları: erişim kuralları içe aktarma ifadesine çok benzer. Benim için eklediğim erişim kuralları "javafx / application / **" idi. İçe aktarma deyimindeki noktayı eğik çizgi ile değiştirin ve kural budur. Umarım yardımcı olur.


1

Biraz farklı bir sorunum vardı. Proje - Özellikler - Kütüphaneler - JRE kütüphanesinde yanlış JRE lib sürümüne sahiptim. Gerçek olanı kaldırın ve ayarlayın ve sesli Access restriction...uyarı - tüm uyarılar uzakta.


1

Eski soru bile, Eclipse benim için sadece Src klasörü ve özellikleri (Alt + Enter) sağ tıklayın Ignore optional compile problemsve hatayı kontrol için kaldırıldı.

resim açıklamasını buraya girin


0

Birisi maven'i çalıştırırken sadece CI aracınızda bu sorunu yaşıyorsa, benim için hile, yürütme ortamını açıkça tanımlamaktı MANIFEST.MF.

Benim durumumda, OSGi paket manifest dosyama aşağıdaki satırı ekleyerek bunu yaptım:

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.