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

코드는 다음과 같습니다.

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’에 대한 제한)



답변

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

배경 : Eclipse 액세스 제한

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

문제

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

해결책

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

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

답변

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


답변

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

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

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

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


답변

( 와 관련이없는 ) 시작으로 , 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 버전이 맞지 않습니다

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


답변

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

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

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

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


답변

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

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


답변

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