programing

"기호를 찾을 수 없음" 또는 "기호를 확인할 수 없음" 오류는 무엇을 의미합니까?

kingscode 2022. 7. 11. 23:31
반응형

"기호를 찾을 수 없음" 또는 "기호를 확인할 수 없음" 오류는 무엇을 의미합니까?

"기호를 찾을 수 없음", "기호를 확인할 수 없음" 또는 "기호를 찾을 수 없음" 오류(Java)에 대해 다음 사항을 설명하십시오.

  • 그것들은 무엇을 의미하는가?
  • 어떤 것들이 그들을 야기시킬 수 있나요?
  • 프로그래머는 그것들을 어떻게 고치나요?

이 질문은 Java에서 흔히 볼 수 있는 컴파일 오류에 대한 포괄적인 Q&A를 제공하기 위한 것입니다.

0. 두 오류 사이에 차이가 있습니까?

사실 그렇지 않아요."기호를 찾을 수 없습니다", "기호를 확인할 수 없습니다" 및 "기호를 찾을 수 없습니다"는 모두 같은 의미입니다.Java 컴파일러마다 사용하는 문구가 다릅니다.

1. "기호를 찾을 수 없습니다" 오류는 무엇을 의미합니까?

우선 컴파일1 오류입니다.Java 소스 코드에 문제가 있거나 컴파일 방법에 문제가 있음을 의미합니다.

Java 소스 코드는 다음과 같이 구성됩니다.

  • like (예: like)class,while기타 등등.
  • : Like like) : Like (좋아요)true,false,42,'X' ★★★★★★★★★★★★★★★★★」"Hi mum!".
  • 및 의 토큰: " " " " " " " " " " " like "+,=,{기타 등등.
  • like (예: like)Reader,i,toString,processEquibalancedElephants기타 등등.
  • 코멘트 및 공백

식별자에 대한 "기호를 찾을 수 없습니다" 오류입니다.코드가 컴파일되면 컴파일러는 코드 내의 모든 식별자가 무엇을 의미하는지 알아내야 합니다.

"기호를 찾을 수 없습니다" 오류는 컴파일러가 이를 수행할 수 없음을 의미합니다.당신의 코드는 컴파일러가 이해하지 못하는 무언가를 참조하고 있는 것 같습니다.

2. "기호를 찾을 수 없습니다" 오류의 원인은 무엇입니까?

첫 번째 주문으로 원인은 하나뿐입니다.컴파일러는 식별자를 정의해야 하는 모든 위치를 찾아봤지만 정의를 찾을 수 없었습니다.이는 여러 가지 원인으로 인해 발생할 수 있습니다.일반적인 것은 다음과 같습니다.

  • 일반적으로 식별자의 경우:

    • 아마도 이름의 철자가 틀렸을 것이다. StringBiulderStringBuilder 오류에 할 수 . Java는 잘못된 철자 오류나 입력 오류를 보완할 수 없습니다.
    • 아마 당신이 그 사건을 잘못 알고 있는 것 같아요. stringBuilderStringBuilder【Java】【Java】【Java】【Java】【Java】【Java】【자바】
    • 아마도 당신은 부적절하게 밑줄을 사용했을 것이다. mystring ★★★★★★★★★★★★★★★★★」my_string규칙을 이 됩니다.)
    • 아마도 당신은 "다른 곳"으로 선언된 것을 사용하려고 할 것입니다. 즉, 당신이 컴파일러에게 암묵적으로 찾도록 지시한 것과 다른 맥락에서. (다른 클래스?)다른 범위?다른 패키지?다른 코드 베이스?)
  • 변수를 참조해야 하는 식별자의 경우:

    • 변수를 선언하는 것을 잊은 것 같습니다.
    • 변수 선언을 사용하려는 시점에서 변수 선언이 범위를 벗어났을 수 있습니다(아래 예 참조).
  • 메서드 또는 필드 이름이어야 하는 식별자의 경우:

    • 부모/상위 클래스 또는 인터페이스에서 선언되지 않은 상속된 메서드 또는 필드를 참조하려고 할 수 있습니다.

    • 않는 즉, 선언되어 있지 경우예를 들어, 사용중인 타입은 「」입니다."rope".push()를 클릭합니다2.

    • 어떤 반대로 사용하려고 할 수 ."rope".length ★★★★★★★★★★★★★★★★★」someArray.length().

    • 어레이 요소가 아닌 어레이로 잘못 동작하고 있는 경우가 있습니다.

          String strings[] = ...
          if (strings.charAt(3)) { ... }
          // maybe that should be 'strings[0].charAt(3)'
      
  • 클래스 이름이어야 하는 식별자의 경우:

    • 아마 당신은 수업을 가져오는 것을 잊었을 거예요.

    • "별" 가져오기를 사용했지만 가져온 패키지에 클래스가 정의되어 있지 않습니다.

    • 거예요.new

          String s = String();  // should be 'new String()'
      
  • 유형 또는 인스턴스가 원하는 멤버(예: 메서드 또는 필드)를 가지고 있지 않은 경우:

    • 사용하려는 유형을 음영으로 표시하는 중첩 클래스 또는 일반 매개 변수를 선언했을 수 있습니다.
    • 스태틱 변수 또는 인스턴스 변수를 섀도우하고 있을 수 있습니다.
    • IDE 등의 유형을수를 들어 IDE의 완료나 자동 수정으로 인해 IDE가 제안되었을 수 .java.awt.Listjava.util.List.
    • 잘못된 버전의 API를 사용하고 있을 수 있습니다.
    • 적절한 서브클래스에 오브젝트를 던지는 것을 잊은 것 같습니다.
    • 변수의 타입을 찾고 있는 멤버와 함께 슈퍼 타입으로 선언했을 가능성이 있습니다.

이 문제는 대부분의 경우 위의 조합에 있습니다.들어 Import를 "star라고 하면 Import를 "star"라고 하는 경우가 있습니다.java.io.*에 '어울리다', '어울리다', '어울리다', '어울리다', '어울리다', '어울리다', '어울리다',Files which which which which에 있는...java.niojava.io '어쩌면'이라고 File...의 클래스입니다.java.io.


다음은 변수 범위를 잘못 지정하면 "기호를 찾을 수 없습니다" 오류가 발생할 수 있음을 보여 줍니다.

List<String> strings = ...

for (int i = 0; i < strings.size(); i++) {
    if (strings.get(i).equalsIgnoreCase("fnord")) {
        break;
    }
}
if (i < strings.size()) {
    ...
}

'기호를 수 '라는하게 됩니다.i if★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.i이 선언은 의 범위 에만 있습니다.for진술과 그 본문.에 참조i if스테이트먼트는 선언을 볼 수 없습니다.i범위 밖입니다.

은 (「 」의 「 」의 「 」의 「 」의 「 」의 「 」의 「 」의 「 」의 「 」의 을 실시하는 경우가 .if내의 , 「」를 합니다.i★★★★★★★★★★★★★★★★★★★★★★★★★」


다음은 오타가 겉으로 보기에 설명할 수 없는 "기호를 찾을 수 없음" 오류로 이어지는 곤혹스러운 예입니다.

for (int i = 0; i < 100; i++); {
    System.out.println("i is " + i);
}

컴파일 합니다.printlni찾을 수 없습니다.하지만 (당신이 말하는 것을 듣고) 선언했어요!

;{Java 언어 구문에서는 해당 컨텍스트에서 세미콜론을 빈 문장으로 정의합니다.그 후 빈 문은 의 본문이 됩니다.for그러니까 그 코드는 실제로 이런 의미입니다.

for (int i = 0; i < 100; i++); 

// The previous and following are separate statements!!

{
    System.out.println("i is " + i);
}

{ ... }(block)은.for 그 의 선언 「루프」가 됩니다.i for문이 블록의 범위를 벗어납니다.


다음은 오타로 인해 발생하는 "기호를 찾을 수 없습니다" 오류의 다른 예입니다.

int tmp = ...
int res = tmp(a + b);

선언에도 , 「 」는, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」를 나타내고 있습니다.tmp tmp(...)식이 잘못되었습니다.는 '아주 좋다'라는.tmp찾을 수 없습니다.에 선언한 「」tmp는 메서드의 네임스페이스가 아니라 변수의 네임스페이스에 있습니다.

우연히 발견한 예에서 프로그래머는 실제로 연산자를 빼먹었습니다.그가 쓰려고 했던 것은 다음과 같았다.

int res = tmp * (a + b);

명령줄에서 컴파일할 경우 컴파일러가 기호를 찾을 수 없는 다른 이유가 있습니다.단순히 다른 클래스를 컴파일 또는 재컴파일하는 것을 잊었을 수 있습니다.들어 클래스 「」가 경우, 「」는 「」입니다.Foo ★★★★★★★★★★★★★★★★★」Bar서 ''는FooBarBar 뛰어가다javac Foo.java수 을 알 수 있습니다.BarFoo ★★★★★★★★★★★★★★★★★」Bar 예를 「」, 「」등입니다.javac Foo.java Bar.java ★★★★★★★★★★★★★★★★★」javac *.java자바어、 、 、 、 그래등 、 래.

또 다른 불명확한 원인도 있습니다...아래에서 다루도록 하겠습니다.

3. 이러한 오류를 수정하려면 어떻게 해야 합니까?

일반적으로 컴파일 오류의 원인을 파악하는 것부터 시작합니다.

  • 컴파일 오류 메시지가 나타내는 파일 내의 행을 확인합니다.
  • 오류 메시지가 나타내는 기호를 식별합니다.
  • 컴파일러가 심볼을 찾을 수 없다고 하는 이유를 확인합니다.상기를 참조해 주세요.

그리고 나서 당신의 코드가 무엇을 의미하는지 생각해 보세요.그런 다음 원하는 작업을 수행하기 위해 소스 코드를 수정해야 하는 사항을 파악합니다.

모든 "수정"이 올바른 것은 아닙니다.다음 사항을 고려하십시오.

for (int i = 1; i < 10; i++) {
    for (j = 1; j < 10; j++) {
        ...
    }
}

가 '기호를 수 '에 대해 '찾을 수 없다'고.j 수 은 여러 가지가 . 다음과 같은 여러 가지 방법으로 "수정"할 수 있습니다.

  • 수 요.for로로 합니다.for (int j = 1; j < 10; j++) 거예요 - 네, 맞아요.
  • 요.j 내면보다 먼저for """ " " " " " " " " "for루프 - 정확할 수 있습니다.
  • 수 요.j로로 합니다.ifor- 잘못되었을 것이다!- loop - 아 loop틀 loop loop loop loop loop loop loop!
  • 기타 등등.

요점은 올바른 해결책을 찾기 위해 코드가 무엇을 하려고 하는지 이해해야 한다는 것입니다.

4. 불분명한 원인

여기 "기호를 찾을 수 없음"이 겉으로 보기에 설명할 수 없는 몇 가지 사례가 있습니다.더 가까이서 볼 때까지요

  1. 잘못된 종속성:빌드 경로 및 프로젝트 종속성을 관리하는 IDE 또는 빌드 도구를 사용하는 경우 종속성이 잘못되었거나 잘못된 버전이 선택되는 등 종속성이 잘못되었을 수 있습니다.빌드 도구(Ant, Maven, Gradle 등)를 사용하는 경우 프로젝트의 빌드 파일을 확인합니다.IDE를 사용하는 경우 프로젝트의 빌드 경로 구성을 확인하십시오.

  2. 기호 'var'를 찾을 수 없음: 로컬 변수 유형 추론을 사용하는 소스 코드(예: a)를 컴파일하려고 합니다.var에 의해 오래된 컴파일러 또는 오래된 컴파일러가 됩니다.--sourcevar되었습니다.JDK 버전과 빌드 파일을 확인하고 IDE에서 이 문제가 발생한 경우 IDE 설정을 확인합니다.

  3. 컴파일/재컴파일하지 않습니다.새로운 Java 프로그래머가 Java 툴 체인의 구조를 이해하지 못하거나 IDE, Ant, Maven, Gradle 등의 반복 가능한 "빌드 프로세스"를 구현하지 못하는 경우가 있습니다.이 경우 프로그래머는 코드 재컴파일 등을 제대로 하지 않아 실제로 발생하는 착시 에러를 찾게 된다.

    하나의 는 ( 9 라고 하다 (Java 9+) 라고 하는 입니다.java SomeClass.java클래스를 컴파일하고 실행합니다.클래스가 컴파일(또는 재컴파일)되지 않은 다른 클래스에 의존하는 경우 두 번째 클래스를 나타내는 "Cannot resolve symbol" 오류가 발생할 수 있습니다.다른 소스 파일은 자동으로 컴파일되지 않습니다.java명령어의 새로운 "syslog and run" 모드는 여러 소스 코드 파일이 있는 프로그램을 실행하도록 설계되지 않았습니다.

  4. 이전 빌드 문제:JAR 파일에 누락된 클래스가 있는 방식으로 이전 빌드가 실패했을 수 있습니다.이러한 장애는 일반적으로 빌드 도구를 사용하는 경우 발생합니다.그러나 JAR 파일을 다른 사용자로부터 받는 경우 JAR 파일이 올바르게 구축되고 오류가 발견될 수 있습니다.이 문제가 의심될 경우tar -tvf의심스러운 JAR 파일의 내용을 나열합니다.

  5. IDE 문제:IDE가 혼동되어 IDE 내의 컴파일러가 존재하는 클래스를 찾을 수 없는 경우가 보고되었습니다.또는 그 반대의 상황입니다.

    • 이 문제는 IDE가 잘못된 JDK 버전으로 구성된 경우 발생할 수 있습니다.

    • 이 문제는 IDE의 캐시가 파일 시스템과 동기화되지 않으면 발생할 수 있습니다.그것을 수정하는 IDE 고유의 방법이 있습니다.

    • IDE 버그일 수 있습니다.예를 들어 @Joel Costigliola는 Eclipse가 Maven의 "테스트" 트리를 올바르게 처리하지 못한 시나리오를 기술했습니다.이 답변참조하십시오.(이 특정 버그는 오래 전에 수정되었습니다.)

  6. Android 문제:Android용으로 프로그래밍할 때 다음과 같은 "기호를 찾을 수 없습니다" 오류가 발생할 때R에 주의해 주세요.R심볼은 다음과 같이 정의됩니다.context.xml파일을 확인해 주세요.context.xml파일이 올바르고 올바른 위치에 있으며, 해당 파일이 올바른 위치에 있는 경우R클래스 파일이 생성/컴파일되었습니다.Java 기호는 대소문자를 구분하므로 대응하는 XML ID도 대소문자를 구분합니다.

    Android의 다른 심볼 오류는 이전에 언급한 이유로 인해 발생할 수 있습니다. 예를 들어, 누락 또는 잘못된 종속성, 잘못된 패키지 이름, 특정 API 버전에 존재하지 않는 메서드 또는 필드, 철자/타자 오류 등이 있습니다.

  7. 시스템 클래스 숨기기:컴파일러가 다음과 같이 불평하는 경우를 본 적이 있습니다.substring다음과 같은 미지의 기호입니다.

    String s = ...
    String s1 = s.substring(1);
    

    알고보니 프로그래머는 그들만의 버전을 만들었다.String그리고 그 수업의 그의 버전에는substring방법들.난 사람들이 이런걸 하는걸 봤어System,Scanner기타 클래스도 있습니다.

    레슨: 일반적인 라이브러리 클래스와 같은 이름으로 자신의 클래스를 정의하지 마십시오.

    이 문제는 정규화된 이름을 사용하여 해결할 수도 있습니다.예를 들어 위의 예에서 프로그래머는 다음과 같이 쓸 수 있습니다.

    java.lang.String s = ...
    java.lang.String s1 = s.substring(1);
    
  8. 호모그래프:소스 파일에 UTF-8 인코딩을 사용하는 경우, 동일해 보이지만 실제로는 다른 식별자를 사용할 수 있습니다.이는 동형문자가 포함되어 있기 때문입니다.상세한 것에 대하여는, 이 페이지를 참조해 주세요.

    소스 파일 인코딩으로 ASCII 또는 Latin-1로 제한하고 Java를 사용하면 이를 방지할 수 있습니다.\uxxxx다른 캐릭터를 위해 탈출합니다.


1 - 런타임 예외 또는 오류 메시지에 이 오류가 표시되는 경우 컴파일 오류가 있는 코드를 실행하도록 IDE를 설정했거나 응용 프로그램에서 코드를 생성 및 컴파일하고 있습니다.실행 시.
2 - 토목의 3가지 기본 원칙: 물은 오르막으로 흐르지 않고, 널빤지는 옆면이 더 튼튼하며, 로프는 밀 수 없습니다.

이 에러는, 다음의 정보를 잊어버린 경우에도 표시됩니다.new:

String s = String();

String s = new String();

그 이유는 이 콜이 없는 콜이기 때문입니다.new키워드는, 라고 하는 (로컬) 메서드를 검색하려고 합니다.String인수 없음 - 이 메서드시그니처는 정의되어 있지 않을 수 있습니다.

'변수가 범위를 벗어났습니다'의 한 가지 예가 더 있습니다.

그런 질문들을 몇 번 봤기 때문에, 어떤 것이 불법인지, 기분이 좋아도 한 가지 예를 더 들어 보겠습니다.

다음 코드를 고려하십시오.

if(somethingIsTrue()) {
  String message = "Everything is fine";
} else {
  String message = "We have an error";
}
System.out.println(message);

잘못된 코드입니다.왜냐하면 두 변수 모두message각각의 스코프 밖에서 볼 수 있습니다(주변 브래킷).{}이 경우는,

다음과 같이 말할 수 있습니다.「하지만, 이름이 붙은 변수는 어느 쪽이든 정의됩니다.메시지는 다음 순서로 정의됩니다.if".

하지만 네가 틀렸을 거야.

Java에는 없습니다.free()또는delete따라서 변수 범위를 추적하여 변수를 더 이상 사용하지 않는 시점을 찾아야 합니다(이러한 원인 변수에 대한 참조도 함께).

네가 좋은 일을 했다고 생각한다면 그건 특히 나빠.다음과 같은 코드를 "최적화"한 후 다음과 같은 오류가 발생하였습니다.

if(somethingIsTrue()) {
  String message = "Everything is fine";
  System.out.println(message);
} else {
  String message = "We have an error";
  System.out.println(message);
}

"아, 중복된 코드가 있습니다.공통선을 뽑읍시다."-> 바로 여기에 있습니다.

이러한 종류의 스코프 트러블에 대처하는 가장 일반적인 방법은 else-values를 Outside 스코프 내의 변수명에 미리 할당하고 다음 경우에 재할당하는 것입니다.

String message = "We have an error";
if(somethingIsTrue()) {
  message = "Everything is fine";
} 
System.out.println(message);

Eclipse에서 이 오류를 얻는 방법 중 하나는 다음과 같습니다.

  1. 클래스의 정의Asrc/test/java.
  2. 다른 클래스 정의Bsrc/main/java클래스 사용A.

결과 : 이클립스는 코드를 컴파일하지만 maven은 "Cannot find symbol"을 표시합니다.

근본 원인 : Eclipse는 메인 트리와 테스트 트리의 조합 빌드 경로를 사용하고 있습니다.안타깝게도 Maven이 필요로 하는 Eclipse 프로젝트의 다른 부분에 대해 다른 빌드 경로를 사용할 수 없습니다.

해결책:

  1. 의존관계를 그렇게 정의하지 마세요.즉, 이 실수를 하지 마세요.
  2. 이 오류를 조기에 발견할 수 있도록 Maven을 사용하여 정기적으로 코드 베이스를 구축하십시오.이를 위한 한 가지 방법은 CI 서버를 사용하는 것입니다.

해결된

IntelliJ 사용방법

[빌드(Build)]-> [리빌드(Rebuild Project)]를 선택하면 해결됩니다

"찾을 수 없음"은 적절한 변수, 메서드, 클래스 등을 찾을 수 없는 컴파일러를 의미합니다.만약 당신이 그 에러 마사지를 받았다면, 우선 당신은 에러 마사지를 받는 코드 라인을 찾고 싶을 것이다.그런 다음 변수, 메서드 또는 클래스를 사용하기 전에 정의하지 않은 변수를 찾을 수 있습니다.확인 후 변수, 메서드 또는 클래스를 나중에 요구용으로 사용할 수 있습니다.다음 예를 생각해 보겠습니다.

데모 클래스를 만들고 이름을 인쇄합니다.

class demo{ 
      public static void main(String a[]){
             System.out.print(name);
      }
}

이제 결과를 보세요..

enter image description here

이 에러는, 「변수명을 찾을 수 없습니다」라고 표시됩니다.'name' 변수의 값을 정의하고 초기화하면 해당 오류를 없앨 수 있습니다.사실 이렇게 해서

class demo{ 
      public static void main(String a[]){

             String name="smith";

             System.out.print(name);
      }
}

이제 새로운 출력을 보세요...

enter image description here

OK 에러를 정상적으로 해결했습니다.동시에 "cannot find method" 또는 "cannot find class" something을 얻을 수 있는 경우 처음에 클래스 또는 메서드를 정의하고 그것을 사용한 후 사용합니다.

IDE가 문제없다고 하는 동안 다른 곳에서 빌드에서 이 오류가 발생할 경우 두 곳에서 동일한 Java 버전을 사용하고 있는지 확인하십시오.

예를 들어 Java 7과 Java 8은 API가 다르기 때문에 오래된 Java 버전에서 존재하지 않는 API를 호출하면 이 오류가 발생합니다.

이클립스 Java 빌드 경로가 7, 8에 매핑되어 Project pom.xml Maven 속성에서 java.version이 7.8보다 높은 Java 버전(9,10,11 등)으로 언급되어 있는 경우 pom.xml 파일에서 업데이트해야 합니다.

이클립스에서는 Java가 Java 버전 11에 매핑되어 있으면 pom.xml에서는 Java 버전 8에 매핑되어 있습니다.Eclipse IDE 도움말 -> 새 소프트웨어 설치 -> 아래 단계를 수행하여 Eclipse 지원을 Java 11로 업데이트합니다.

다음 링크 http://download.eclipse.org/eclipse/updates/4.9-P-buildsWork With 에 붙여넣습니다.

또는

추가(팝업창이 열립니다) ->

Name:Java 11 지원Location: http://download.eclipse.org/eclipse/updates/4.9-P-builds

그런 다음 다음과 같이 pom.xml 파일의 Maven 속성에서 Java 버전을 업데이트합니다.

<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>

마지막으로 '프로젝트 Debug as -> 메이븐 클린, 메이븐 빌드 순서'를 오른쪽 클릭합니다.

저도 이 에러가 발생하고 있었습니다.(구글을 검색하여 이 페이지로 이동했습니다)

문제:다른 프로젝트 B에서 정의된 클래스에서 프로젝트 A의 클래스에 정의된 정적 메서드를 호출하고 있었습니다.다음 오류가 발생했습니다.

error: cannot find symbol

솔루션:우선 메서드가 정의되어 있는 프로젝트를 빌드하고 메서드가 호출되어 있는 프로젝트를 빌드함으로써 이 문제를 해결했습니다.

위에서 언급한 것처럼 다양한 시나리오가 있을 수 있습니다.이 문제를 해결하는 데 도움이 된 몇 가지 것들이 있습니다.

  1. IntelliJ를 사용하는 경우

    File -> 'Invalidate Caches/Restart'

또는

  1. 참조되고 있는 클래스가 다른 프로젝트에 있고, 그 의존성이 프로젝트의 Gradle 빌드 파일에 추가되지 않았습니다.그래서 나는 다음을 사용하여 의존관계를 추가했다.

    compile project(':anotherProject')

효과가 있었어. HTH!

maven 컴파일을 사용하여 코드를 컴파일하고 maven 테스트를 사용하여 정상적으로 실행되도록 했습니다.코드 내에서 변경 후 컴파일하지 않고 실행하면 이 오류가 발생합니다.

솔루션:다시 컴파일하여 테스트를 실행합니다.나한텐 이런 식이었어.

제 경우 - 아래 작업을 수행해야 했습니다.

  1. ★★context.xmlsrc/java/packageresource IDE
  2. target디렉토리로 이동합니다.

힌트를 얻으려면 오류를 발생시키는 클래스 이름과 행 번호를 자세히 확인하십시오. 예: Compilation failure [ERROR] \applications\xxxxxx.java: [44,30] error: cannot find symbol.

다른 한 가지 원인은 jdk7 vs 8과 같은 Java 버전에서는 지원되지 않는 방법입니다.%J 체크AVA_HOME%

Gradle 다중 프로젝트 빌드로 설정된 Java 프로젝트에서 오류가 발생했습니다.서브프로젝트 중 하나에 Gradle Java Library 플러그인이 없는 것으로 나타났습니다.이로 인해 하위 프로젝트의 클래스 파일이 빌드의 다른 프로젝트에 표시되지 않았습니다.

의 Java에 한 후build.gradle하다

plugins {
    ...
    id 'java-library'
}

Re: 4.4: Stephen C의 뛰어난 답변 중 이전 빌드 문제:

어플리케이션.osgi 어플리케이션을 할 때 발생했습니다.
는 자바 프로젝트를 .A 관계였다B · ★★★★★B에러가 발생했습니다.

Compilation failure: org.company.projectA.bar.xyz does not exist

하지만 일식에서는 컴파일 문제가 전혀 없었습니다.

★★
가 들여다봤을 때A.jar , 에 대한 수업이 .org.company.projectA.foo.abc, 없음org.company.projectA.bar.xyz.

중'에 .A/pom.xml는 관련 패키지를 내보내기 위한 엔트리입니다.

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    ...
    <configuration>
        <instructions>
            ....
            <Export-Package>org.company.projectA.foo.*</Export-Package>
        </instructions>
    </configuration>
</plugin>

★★★★★★
다음과 같이 누락된 패키지를 추가합니다.

<Export-Package>org.company.projectA.foo.*,org.company.projectA.bar.*</Export-Package>

모든 것을 재구축할 수 있습니다.

, 이제 ㅇㅇ, ㅇㅇ.A.jar모든 예상 클래스와 컴파일된 내용이 포함되어 있습니다.

프로젝트를 컴파일 할 때도 같은 문제가 있었습니다.Java 컴파일러 버전을 확인했습니다.Java 1.8에서 동작하고 있었는데 실수로 Java 17로 설정해 버젼 1.8로 되돌리고 나서 문제가 해결되었습니다.

enter image description here

이 오류는 이렇게 해결했는데...안드로이드의 광기.패키지명을 Adapter로 하고, 어댑터명을 A가 아닌 a로 리팩터하여 에러를 해결했습니다.

언급URL : https://stackoverflow.com/questions/25706216/what-does-a-cannot-find-symbol-or-cannot-resolve-symbol-error-mean

반응형