필수 라이브러리 rt.jar에 대한 제한으로 인해 클래스에 대한 액세스 제한?


824

스텁을 다시 작성 하지 않고 Java5 에서 IBM의 WSDL2Java 에 의해 작성된 Java 1.4 코드 를 컴파일하려고 시도 중이며 Eclipse 에서이 오류가 발생했습니다 . 나는 런타임 이 사용 가능한 한 생성 된 스텁을 컴파일해야한다고 가정합니다 .
jars

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

전체 클래스 이름은 javax.xml.namespace.QName

여기서 정확히 무슨 일이 일어나고 있습니까? 내가 소시지에서 돼지를 리팩토링하려고하는 경우입니까? 스텁을 다시 작성하는 것이 더 낫습니까?


1
나는 그것을 얻지 못한다. 왜 다른 곳에서 그것을 컴파일하고 1.4 환경을 목표로 실행하지 않는가?
Tim Büthe

최종 대상 환경은 jdk5의 jboss4.2입니다.
sal

2
은 "보호"상태에 관하여 :에서 StackOverflow의 아무것도는 upvote에로 "나도" "감사합니다"또는 말한다)
OscarRyz

6
가장 투표가 많은 답변보기 ...이 페이지의 나머지 96 %는 무시하십시오. 4시 9분에서 "넬스 베크", 2월 1일 '10 : 검색
됩니다

1
나를 위해 일한 것은 JRE 시스템 라이브러리를 실행 환경 (또는 작업 공간 기본값) 에서 대체 JRE (같은 Java 버전을 선택 )편집 / 변경 하는 것이 었습니다 . 또한 (1) 주문 및 내보내기 탭의 올바른 순서 , (2) Java 컴파일러 설정의 올바른 준수 수준 (선택한 Java 버전과 동일)을 확인해야합니다.
ADTC

답변:


1884

작동하는 또 다른 솔루션이 있습니다.

  1. 프로젝트 속성에서 빌드 경로 설정으로 이동 하십시오 .
  2. JRE 시스템 라이브러리 제거
  3. 다시 추가하십시오. 선택 "라이브러리 추가" 와 선택 JRE 시스템 라이브러리를 . 기본값은 저에게 효과적이었습니다.

다른 jar 파일에 여러 클래스가 있기 때문에 작동합니다. JRE lib를 제거했다가 다시 추가하면 올바른 클래스가 먼저 작성됩니다. 기본 솔루션을 원하면 동일한 클래스의 jar 파일을 제외하십시오.

: 나를 위해 내가 가진 javax.xml.soap.SOAPPart세 가지 다른 항아리에 : axis-saaj-1.4.jar, saaj-api-1.3.jar그리고rt.jar


1
Eclipse 버그입니까, 아니면 실수로 제한 사항을 해결하고 라이센스 조건을 위반합니까? 이클립스 버그라면 버그가 제기 되었습니까?
docwhat

@Doctor 저는이 코드를 특히 중요한 코드에 사용하지 않았으므로 더 이상 조사하지 않았습니다. 무언가를 발견하면 알려주십시오.
Nels Beckman

3
@ URL87 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭하면 "빌드 경로 ...", "빌드 경로 구성", "라이브러리"(탭)로 이동하면 오른쪽에있는 버튼 중 하나로 "라이브러리 추가"가 표시됩니다. 이것은 저에게도 매력이되었습니다
Alexei Blue

8
최신 버전의 Eclipse에서 더 나은 솔루션은 JRE 시스템 라이브러리를 삭제하는 것이 아니라 "주문 및 내보내기"탭으로 이동하여 JRE 시스템 라이브러리를 맨 아래로 이동하는 것입니다 (실제로 삭제 및 추가하는 것임). 삭제하고 추가 할 필요가 없습니다).
user1676075

1
이것은 2018이며 이클립스 버전은 5.0입니다. 이 버그 / 문제는 여전히 존재합니다. @NelsBeckman에게 감사드립니다. 귀하의 답변이 게시 된 후 10 년의 3/4 년 후에 도움이되었습니다.
Aravamudhan

120

http://www.digizol.com/2008/09/eclipse-access-restriction-on-library.html이 가장 효과적이었습니다.

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

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


62
이것은 작동 할 수 있지만 올바른 해결책은 아닙니다. 먼저 액세스 제한이 존재하는 이유를 이해해야합니다. 또한 앞으로의 모든 경우를 숨길 것입니다. 더 중요 할 수도 있습니다!
Adrian Mouat

1
@AdrianMouat는 거의 관련이 없습니다. 나가고 싶다면 나가고 싶습니다. 그러나 분명히-비공개 API에 대해서는 코딩해서는 안됩니다.
stolsvik

3
@ stolsvik-당신은 나를 잃었습니다; 문제가 존재하는 이유는 무의미하다는 말입니까?
Adrian Mouat

1
한 가지 방법 으로이 문제가 있습니다. 대안 JDK를 사용한다고 생각합니다 (OpenJDK가 더 나은 옵션입니다). 그것은 한 번은 '차가워 질 수도 있습니다'라고 말했습니다. 프로덕션 코드에 없습니다. 지속적인 디자인 노력이 아닙니다. 이런 종류의 cr-hack에서 며칠이 지 났는지 말할 수 없습니다.
됩니다

5
@AdrianMouat-말이됩니다. 나는 원자로에서 이런 식으로 일하는 것을 싫어한다-제어실에서 너무 많은 열? 따라서 모든 경고를 비활성화하십시오. 다음날 큰 헤드 라인을 만드십시오. : P
david blaine

67

나는 같은 문제를 만났다. 웹 사이트 http://www.17ext.com 에서 답을 찾았습니다 .
먼저 JRE 시스템 라이브러리를 삭제하십시오. 그런 다음 JRE 시스템 라이브러리를 다시 가져 오십시오.

왜 그런지 모르겠습니다. 그러나 문제가 해결되면 도움이되기를 바랍니다.


10
허, 당신은 분명히 몇 달 전에 내가 한 것과 같은 방식으로이 질문에 대답했습니다. 내가 왜 당신의 대답을 보지 못했는지 모르겠습니다 ...
Nels Beckman

34

내 생각에 Java 5와 함께 제공되는 표준 클래스를 라이브러리의 클래스로 바꾸려고합니다.

라이센스 계약의 조건에 따라 허용되지 않지만 AFAIK는 Java 5까지 시행되지 않았습니다.

나는 이것을 QName으로 전에 보았고 내가 가지고있는 항아리에서 클래스를 제거하여 그것을 고쳤습니다.

"-Xbootclasspath :"옵션에 대한 http://www.manpagez.com/man/1/java/ 참고 사항 편집

"rt.jar의 클래스를 재정의하기 위해이 옵션을 사용하는 응용 프로그램은 Java 2 Runtime Environment 이진 코드 라이센스에 위배되므로 배포해서는 안됩니다."

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

"자바 기술 제한 사항. JPI 내에 추가 클래스를 작성하거나" 추가 클래스 및 관련 API를 작성하는 경우 (i) Java 플랫폼의 기능을 확장하고 (ii) 타사 소프트웨어 개발자에게 노출되는 이러한 추가 API를 호출하는 추가 소프트웨어를 개발할 목적으로 모든 개발자가 무료로 사용할 수 있도록 해당 API에 대한 정확한 사양을 신속하게 게시해야하며, 라이센스 사용자가 추가 클래스, 인터페이스,"java", "javax", "sun"또는 Sun의 명명 규칙 지정에서 지정한 것과 유사한 규칙으로 식별되는 하위 패키지


2
그게 다야. 경로의 jar 중 하나에 QName 클래스가 있습니다. 찾기 . -name "* .jar"-print -exec unzip -t {} \; grep "QName"이 발견했습니다.
sal

1
Java와 함께 제공되는 클래스를 대체 할 수없는 것에 대한 참조를 제공 할 수 있습니까? 라이센스 계약에서 찾은 모든 것은 Java 프로그램이 아닌 Java 자체 배포와 관련된 제한 사항이지만 오랫동안 찾지 않았습니다.
Adrian Mouat

25

이 오류도 발생했지만 Maven과 tycho 컴파일러 (OSGi 플러그인 세트)를 사용하여 명령 줄에서 프로젝트를 빌드했습니다 . 동일한 문제를 겪고 있지만 명령 줄이 아닌 Eclipse에서 문제를 해결하는 사람들을 통해 대량의 선별 작업을 한 후 Tycho 개발자 포럼pom.xml 에서 액세스 제한에 대한 컴파일러 경고를 무시 하도록 구성을 사용하여 내 질문에 대답 한 메시지를 발견 했습니다 .

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

자세한 내용은 Tycho FAQ를 참조하십시오 . AGES를 해결하는 데 도움이되었으므로이 답변을 게시하여 명령 줄에서 이러한 액세스 제한 오류를 해결하려는 다른 사람을 도울 것이라고 생각했습니다.


13
  • 프로젝트 속성에서 빌드 경로 설정으로 이동하십시오. Windows -> Preferences -> Java Compiler
  • JRE 시스템 라이브러리 제거
  • "완벽한 일치"를 가진 다른 JRE 추가
  • 청소하고 프로젝트를 다시 빌드하십시오. 그것은 나를 위해 일했다.

13

방금이 문제가있었습니다. 분명히 빌드 경로에서 JRE를 1.6 대신 1.5로 설정했습니다.


1
여기서도 같은 문제입니다. 필자의 경우 Maven을 사용하면 지정되지 않은 경우 기본값은 1.5입니다.
Greg Haskins

업데이트 할 때 다시 변경되지 않도록 POM에 저장하십시오. <properties> <maven.compiler.source> 1.8 </maven.compiler.source> <maven.compiler.target> 1.8 </maven.compiler.target> </ properties>
Philip Rego

8

Nels Beckman의 솔루션 외에도 다음과 같은 팁이 있습니다.

아래 구성 빌드 경로 , 나는 아래에 내 항목의 순서를 재 배열했다 주문 및 내보내기 .

또한 Eclipse PDE 개발자 MANIFEST.MF로서 문제의 패키지를 목록에서 맨 처음에 추가하여의 종속성 순서를 다시 정렬해야했습니다 .

이 다이얼을 사용하여 프로젝트> 정리 를 실행 하면서 이러한 경고를 해결할 수있었습니다.


8

나를 위해 이것을 해결하는 방법 :

  • 현재 프로젝트 의 빌드 경로 로 이동

라이브러리에서

  • " JRE 시스템 라이브러리 [jdk1.8xxx]"를 선택하십시오.
  • 편집을 클릭하십시오
  • "작업 공간 기본 JRE (jdk1.8xx)" 또는 대체 JRE를 선택하십시오.
  • 완료를 클릭하십시오
  • 확인을 클릭하십시오

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

참고 : Eclipse / 환경 설정 (프로젝트 아님) / Java / Installed JRE에서 jdk가 JRE C : \ Program Files \ Java \ jdk1.8.0_74가 아닌 JDK 폴더를 가리키는 지 확인하십시오.

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


광산은 이미 1.7 ... 79로 설정되어있어 당황했습니다. 그러나 간단히 다시 선택하고 적용을 클릭하면 오류가 사라졌습니다. 아휴.
Marvo

와. "실행 환경"에서 "대체 JRE"로 변경하는 것도 여기에서 도움이되었습니다. 누군가 이것에 대한 논리적 설명이있는 경우 (여기에서 프로젝트 수도꼭지 Java를 1.5 (.settings 구성 파일의 5.0)에서 1.8로 변경 한 후 발생했습니다.) 전역 환경 설정에서 오류에서 경고로 변경 (다른 답변 참조) help : still errors. com.sun.image.codec. *에서 사용하는 오래된 태양 클래스에 대한 내용
hyphan

6

이전 POST를 업데이트하여 죄송합니다. 보고 된 문제가 발생하여 아래에 설명 된대로 해결했습니다.

Eclipse + m2e maven 플러그인을 사용한다고 가정 할 때이 액세스 제한 오류가 발생하면 오류가있는 프로젝트 / 모듈을 마우스 오른쪽 단추로 클릭하십시오.-> 특성-> 빌드 경로-> 라이브러리-> JDK 교체 / 이클립스 작업 공간에서 사용되는 JRE.

위의 단계를 따라 문제가 해결되었습니다.


충분하지만, 기본적으로 Nels Beckman이 받아 들인 대답의 문구를 복제했습니다.
Steven Wolfe

5

주어진 클래스에 액세스 할 수 있어야하는 경우, 동일한 이름 (또는 경로)을 가지고 있지만 내용이 다른 클래스를 포함하는 여러 항아리를 프로젝트에 추가했으며 서로 그림자가 있습니다 (일반적으로 오래된 사용자 정의) 빌드 jar에는 타사 라이브러리의 이전 버전이 내장되어 있습니다).

예를 들어 jar 구현을 추가 할 때 :

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

또한 이전 버전 만 구현합니다.

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

"오래된"라이브러리가 새 라이브러리를 어둡게하면 코드 편집기에서 모든 것이 제대로 작동하지만 컴파일하는 동안 실패합니다.

해결책은 컴파일 타임 라이브러리의 순서를 확인하고 올바르게 구현 된 라이브러리가 먼저 진행되는지 확인하는 것입니다.


4

프로젝트 특성에서 Java 빌드 경로로 이동하십시오. 기존 JRE 시스템 라이브러리를 제거한 다음 다시 추가하십시오. 즉 라이브러리 추가-> JRE Lib--jre ---> 마침을 선택하십시오. 마지막으로 주문 및 내보내기 탭을 선택하고 JRE Lib을 선택한 다음 맨 위로 이동하십시오. 그게 다야.


3

프로젝트의 빌드 경로 라이브러리 순서를 변경하십시오. 프로젝트> 빌드 경로> 빌드 경로 구성> 주문 선택 및 내보내기 (탭)> 항목 순서 변경을 마우스 오른쪽 버튼으로 클릭하십시오. "JRE 시스템 라이브러리"를 맨 아래로 옮기면 좋을 것입니다. 그것은 나를 위해 그렇게 일했습니다. 쉽고 간단한 .... !!!


3

필자의 경우 빌드 환경 JRE와 실행 환경의 설치된 JRE가 일치하지 않습니다. 프로젝트> 속성> Java 컴파일러로 옮겼습니다. 하단에 경고 메시지가있었습니다.

'Installed JRE', 'Execution environment', 'Java build path'링크를 클릭하고 JDK 버전을 1.7로 변경하고 경고가 사라졌습니다.


0

빌드 경로를 통해 올바른 JRE 시스템을 추가하는 것이 해결책이지만 일식에 여전히 오류가있을 수 있습니다. 이를 해결하려면 Java 빌드 경로-> 주문 및 내보내기로 이동하여 JRE 시스템 라이브러리를 맨 위로 이동하십시오. 이것은 내 문제를 해결했습니다.

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