액세스 제한 : 'Application'유형이 API가 아님 (필수 라이브러리 rt.jar에 대한 제한)


178

코드는 다음과 같습니다.

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

여기 오류가 있습니다 :

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)

이클립스는 다음과 같이 말합니다.

액세스 제한 : 'Application'유형이 API가 아닙니다 (필수 라이브러리 '/Library/Java/JavaVirtualMachines/jdk1.8.0_11.jdk/Contents/Home/jre/lib/rt.jar'에 대한 제한)


3
Java 7을 사용하여이를 실행 해보십시오.
spoko


Xcode를 사용하지 않음 (아직)
www139

나는 자바에 익숙하지 않다. 남자는 정확한 경로를 제공하지 않는다. com / sun / xml / internal / **
www139

1
그가 말하는 경로를 해석 할 수 있습니까? 감사합니다! 앞으로 나는 xCode 또는 netbeans로 전환 할 것입니다. 위의 사람은 Java 7을 시도해야한다고 말했습니까?
www139

답변:


276

이것은 나에게도 일어 났고 여기에 주어진 대답은 이미 만족스럽지 않았기 때문에 나 자신의 연구를했습니다.

배경 : Eclipse 액세스 제한

Eclipse에는 실수로 Eclipse가 공용 API의 일부가 아니라고 생각하는 클래스를 사용하지 못하게하는 액세스 제한 이라는 메커니즘이 있습니다 . 일반적으로 Eclipse는 두 가지 측면에서 모두 옳습니다. 우리는 일반적으로 공개 API의 일부가 아닌 것을 사용하고 싶지 않습니다. 그리고 Eclipse는 일반적으로 무엇이 공개 API의 일부인지 아닌지에 대해 옳습니다.

문제

이제, 공개 비 API를 사용하려는 상황이있을 수 있습니다 sun.misc(무엇을하고 있는지 알지 못한다면 안됩니다). 그리고 Eclipse가 실제로 옳지 않은 상황이있을 수 있습니다 (저에게 일어난 일 javax.smartcardio입니다.). 이 경우 Eclipse에서이 오류가 발생합니다.

해결책

해결책은 액세스 제한을 변경하는 것입니다.

  • Java 프로젝트의 특성으로 이동하십시오.
    • 즉, "패키지 탐색기"의 프로젝트 컨텍스트 메뉴에서 "속성"을 선택합니다.
  • "자바 빌드 경로", "라이브러리"탭으로 이동하십시오.
  • 라이브러리 항목을 확장하십시오
  • 고르다
    • "액세스 규칙",
    • "편집 ..."및
    • 해당 규칙 패턴으로 "추가 ..." "해결 방법 : 액세스 가능" 저에게 " javax/smartcardio/**" 이 (가) 있었을 수도 있습니다. 대신 " com/apple/eawt/**" 일 수도 있습니다 .

28
Eclipse Mars (4.5.0)가 있으며 Java 빌드 경로-> 라이브러리에 액세스 규칙이 없습니다. FWIW 환경 설정-> Java-> 컴파일러-> 오류 / 경고-> 더 이상 사용되지 않고 제한된 API에 더 큰 망치가 있습니다 (모두 해제 할 수 있음).
Jonathan Ross

4
Eclipse Mars.1 Release (4.5.1)가 있습니다. 나에게 두 솔루션 모두 효과가있었습니다. 기독교인의 대답과 요나단의 의견. 라이브러리 탭에서 나열된 "JAR 및 클래스 폴더"중 하나를 열어 "액세스 규칙"이 속하는지 확인해야합니다.
Laszlo Hirdi

3
이것은 나를 위해 작동하지 않습니다. 이클립스 루나. JDK 1.8, 1.7을 시도하고 액세스 규칙을 추가하고 프로젝트를 정리하면 오류가 계속 발생합니다. 또한 프로젝트 레벨에서 @JonathanRoss의 제안을 시도했습니다. Forbidden / Discouraged API에 대한 프로젝트 레벨 구성이 경고로 설정되었지만 여전히 오류가 발생했습니다. 그런 다음 (Jonathan이 제안한대로) 작업 공간 수준 설정에 대한 환경 설정을 시도했지만 금지 된 API는 오류로 설정되었습니다. 경고로 변경하면 문제가 해결되었지만 프로젝트 수준 설정이 무시되었으므로 Eclipse의 버그라고 생각하십시오.
Steve Cohen

2
내 경우에는 액세스 제한을 수정할 수 없었습니다 : jar "jfxrt.jar"에 maven jar 프로젝트가있는 Eclipse Neon.
pdem


81

나는 같은 문제를 겪고 있었다. Eclipse에서 Java 프로젝트를 처음 작성할 때 JRE 8을 지정했습니다. 프로젝트의 빌드 경로로 이동하여 JRE 시스템 라이브러리를 편집 할 때 Java 8 실행 환경이 선택되었습니다. "Alernate JRE"(여전히 Java 8)를 사용하기로 선택했을 때 오류가 수정되었습니다.


2
전역 수정을 선호했지만 제한된 API를 전체적으로 사용할 수있는 다른 모든 대답보다 낫습니다. (실수로 Javafx 응용 프로그램에서 sun. *을 사용하고 싶지 않습니다).
Mark Jeronimus

1
고마워, 이것은 내 프로젝트의 모든 경고를 지 웠습니다. 이클립스는 자바 FX (jfxrt.jar)에서 제공 한 모든 클래스에 대해 불평
고란 바식

2
확인 됨 ... JRE 8 u60을 JRE 8 u60으로 변경했습니다. 분명히이 재 구축은 다른 방법과 달리 문제를 해결하는 부작용이 있습니다. (이 설정을 변경하는 방법에 대한 자세한 설명은 Nikhil Mahajan의 답변을 참조하십시오 : stackoverflow.com/questions/6881622/… )
장로

감사합니다! 이 전략으로 스파크 자바 프레임 워크를 성공적으로 컴파일 할 수있었습니다.
Martin Pabst

1
이상하게도 효과가있었습니다. 하나의 JDK 만 설치되어 있습니다. 얼마나 이상해?
WesternGun

65

일식 산소에 javafx 액세스 권한을 추가하면 프로젝트> 속성> java 빌드 경로> 라이브러리>로 이동 한 다음 라이브러리를 확장하고 액세스 규칙을 두 번 클릭하십시오. 여기에서 액세스 규칙을 설정하십시오. 해상도 : 액세스 가능한 규칙 패턴 : javafx / **

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


23

( 와 관련이없는 ) 시작으로 , Application스스로 클래스를 인스턴스화하는 것은 의도 된 용도가 아닌 것 같습니다. 소스 에서 읽을 수있는 것에서 반환 된 정적 인스턴스를 사용해야합니다 getApplication().

이제 오류 이클립스 보고서를 보자. 최근에 비슷한 문제가 발생했습니다 Access restriction: The method ... is not API (restriction on required project). 문제의 메서드를 슈퍼 클래스에서 해당 메서드를 상속 한 개체의 메서드로 호출했습니다. 내가해야 할 일은 수퍼 클래스가있는 패키지를 플러그인으로 가져온 패키지에 추가하는 것입니다.

그러나 "필요한 프로젝트 / 라이브러리 제한"에 따라 오류의 원인은 다양합니다 . 위에서 설명한 문제점과 유사하게, 사용중인 유형이 라이브러리에서 내 보내지 않거나 자체적으로 내 보내지 않은 패키지에 종속 될 수 있습니다. 이 경우 누락 된 패키지를 추적하고 여기 에 제안 된대로 직접 내보내 거나 액세스 규칙을 시도 할 수 있습니다 . 다른 가능한 시나리오는 다음과 같습니다.

  • Eclipse는 공용 Java API에 포함되지 않은 사용 가능한 패키지를 사용하지 않기를 원합니다 (솔루션 1 , 2 )
  • 여러 소스에서 종속성이 충족되고 버전이 충돌하는 등 (솔루션 1 , 2 , 3 )
  • Eclipse는 JDK가 필요한 JRE를 사용하고 있습니다 (여기서 오류가 말한 것에서 해결책 이 될 수 있습니다 ) 또는 프로젝트 빌드 경로의 JRE / JDK 버전이 맞지 않습니다

이것은 실제 답변보다 제한 관련 문제의 메들리처럼 끝났습니다. 그러나 필요한 프로젝트에 대한 제한 은보고해야 할 다목적 오류이므로 완벽한 레시피는 여전히 찾을 수 있습니다.


18

내 프로젝트와 관련된 프로젝트 패싯이 잘못된 Java 버전이기 때문에이 문제가 발생했습니다.

이 문제를 해결하려면 다음을 수행하십시오.

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하십시오.
  2. '프로젝트 패싯'을 선택하고 java 버전을 1.4보다 큰 것으로 변경하십시오.
  3. [적용]을 클릭하십시오

이것은 프로젝트를 다시 빌드하고 오류가 해결되기를 바랍니다.


15

Window-> Preferences-> Java-> Installed JREs를 사용하여 JDK 1.8을 빌드하도록 애플리케이션을 변경해야했습니다 . 그러나이를 변경 한 후에도 프로젝트 탐색기에 지정된 JRE 시스템 라이브러리는 여전히 올바르지 않습니다. 이 문제를 해결하려면 "JRE 시스템 라이브러리 [wrong-jre-here]"를 마우스 오른쪽 단추로 클릭하고 실행 환경에서 "작업 공간 기본값 (yer-default-here)"으로 변경하십시오.

여기에 이미지 설명을 입력하십시오


1
감사! 안전한 내 인생 :)
KMC

13

작동했습니다 : 프로젝트 속성-> ProjectFacets-> 런타임-> jdk1.8.0_45-> 적용


시스템 끊었다 :(
Saikat

12

Eclipse 최상위 메뉴 표시 줄에서 :

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

9

Spring Tool Suite를 사용하여 이와 동일한 문제가 발생하는 경우 :

Spring Tool Suite의 기본 IDE는 사실 Eclipse입니다. 방금 일부 com.sun.net클래스 를 사용하려고 시도 하면서이 오류가 발생했습니다 . 이러한 오류를 제거하고 STS의 Eclipse Luna SR1 (4.4.2) 플랫폼에서 오류가 발생하지 않도록하려면 다음을 수행하십시오.

  • 프로젝트> 속성으로 이동
  • Java 컴파일러 표제를 펼치십시오
  • 오류 / 경고를 클릭하십시오
  • 더 이상 사용되지 않고 제한된 API 확장
  • "금지 된 참조 (액세스 규칙)"옆에있는 "무시"를 선택하십시오.
  • "감지 된 참조 (액세스 규칙)"옆에있는 "무시"를 선택하십시오.

잘가요


6

같은 문제가 있었다. 해결 방법은 다음과 같습니다. 패키지 탐색기로 이동하십시오. JRE 시스템 라이브러리를 마우스 오른쪽 단추로 클릭하고 특성으로 이동하십시오. 프로젝트 빌드 경로에 대한 클래스 경로 컨테이너> JRE 선택에서 세 번째 옵션 (작업 공간 기본 JRE)을 선택하십시오.

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


1
고마워 ... C Hujer가 제안한 답변을 사용하여 실제로 jfxrt.jar 파일에 대해 "162 규칙 (수정 불가능)"이 있음을 발견했습니다!
마이크 설치류

5

다음 설정으로 이동하십시오.

창-> 환경 설정-> Java 컴파일러 오류 / 경고-더 이상 사용되지 않고 제한된 API 금지 참조 (액세스 규칙)

Warning또는로 설정하십시오 Ignore.


5

IBM RAD (Rational Application Developer)를 사용하며 동일한 문제가있었습니다.

에러 메시지:

액세스 제한 : 'JAXWSProperties'유형이 API가 아닙니다 (필수 라이브러리 'C : \ IBM \ RAD95 \ jdk \ jre \ lib \ rt.jar'에 대한 제한 사항)

해결책:

java 빌드 경로로 이동하여 라이브러리 탭에서 JRE 시스템 라이브러리를 제거하십시오. 그런 다음 다시 라이브러리 추가-> JRE 시스템 라이브러리


4

Eclipse Mars.2 릴리스 (4.5.2)에서 :
Project Explorer -> Context menu -> Properties -> JavaBuildPath -> Libraries
JRE ...를 선택하고 편집 : 작업 공간 JRE로 전환 (jdk1.8.0_77)을 누르십시오.

나를 위해 작동합니다.


3

JRE 8.112 이클립스가 중요하지만 확실하지는 않지만 내가 한 일은 다음과 같습니다.

  1. 내 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭
  2. 속성으로 내려 가서 클릭
  3. 자바 빌드 경로 폴더를 클릭
  4. 한 번 안으로, 나는 주문 및 수출했다
  5. JRE 시스템 라이브러리를 확인했습니다. [jre1.8.0_112]
  6. 그런 다음 다른 JRE 시스템 라이브러리 위로 옮겼습니다 (문제가되는지 확실하지 않음)
  7. 그런 다음 확인을 눌렀습니다.

이것은 내 문제를 해결했습니다.


2

나는 단순히 일식 시장에 e (fx) clipse를 추가합니다. 쉽고 간단한


1

나는 이클립스 네온 3을 사용하고 있습니다. 나는 javafx.application.Application을 사용하고 싶기 때문에 위의 Christian Hujer의 대답을 따라 작동했습니다. 몇 가지 팁 : 액세스 규칙은 import 문과 매우 유사합니다. 나를 위해 추가 한 액세스 규칙은 "javafx / application / **"입니다. import 문의 점을 슬래시로 바꾸면됩니다. 희망이 도움이됩니다.


1

나는 조금 다른 문제가 있었다. 프로젝트-속성-라이브러리-JRE 라이브러리에서 잘못된 JRE lib 버전이 있습니다. 실제 Access restriction...경고를 제거하고 설정하면 모든 경고가 사라집니다.


1

이전 질문 인 경우 Eclipse에서 Src 폴더 및 속성 (Alt + Enter)을 마우스 오른쪽 버튼으로 클릭 Ignore optional compile problems하고 오류가 제거 되었는지 확인하십시오 .

여기에 이미지 설명을 입력하십시오


0

누군가 maven을 실행하는 동안 CI 도구에서만이 문제가 발생하면 트릭은 실행 환경을 명시 적으로 정의하는 것이 었습니다 MANIFEST.MF.

필자의 경우 OSGi 번들 매니페스트 파일에 다음 줄을 삽입하여이 작업을 수행했습니다.

Bundle-RequiredExecutionEnvironment: JavaSE-1.8
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.