[java] IntelliJ 검사는 “심볼을 확인할 수 없음”을 제공하지만 여전히 코드를 컴파일합니다

플랫폼 : IntelliJ Community Edition 10.0.3
SDK : jdk1.6.0_21
OS : Windows 7

그래서 IntelliJ와 함께 이상한 상황에 처하게되었습니다. Maven 프로젝트를 설정하고 pom.xml 파일에서 log4j를 종속성으로 추가했습니다. IDEA 검사가 제대로 실행되고 내 장치 테스트가 모두 컴파일되어 실행됩니다.

그런 다음 다음과 같이 mvn install : install-file을 사용하여 hunnysoft의 jmime 라이브러리를 로컬 maven 저장소에 추가했습니다.

mvn install:install-file -Dfile=jmime.jar -DgroupId=jmime \
-DartifactId=jmime -Dversion=3.1.1e -Dpackaging=jar

Maven은 jar 파일을 로컬 저장소에 올바르게 설치했습니다.

그런 다음 IntelliJ의 설정 => Maven => 리포지토리 서비스로 이동하여 로컬 리포지토리를 업데이트했습니다 (IntelliJ가 리포지토리 내용을 다시 인덱싱하도록).

마지막으로 pom.xml 파일에 다음 종속성을 추가했습니다 (log4j 종속성 바로 위).

<dependency>
    <groupId>jmime</groupId>
    <artifactId>jmime</artifactId>
    <version>3.1.1e</version>
</dependency>

이제 다음과 같이 새 클래스를 만듭니다.

package com.stackoverflow.question;

import org.apache.log4j.Logger;
import com.hunnysoft.jmime.ByteString;
import com.hunnysoft.jmime.Field;
import com.hunnysoft.jmime.FieldBody;

public class StackOverflowQuestion {
    public Field create(String name, String text) {
        Logger.getLogger(getClass()).debug("create entered");
        FieldBody body = new FieldBody();
        body.setText(new ByteString(text));
        Field field = new Field();
        field.setFieldName(name);
        field.setFieldBody(body);
        return field;
    }
}

이제 이상합니다. IntelliJ의 의도 메커니즘은 maven pom 파일에서 Logger 가져 오기를 잘 인식합니다. 그러나 모든 hunnysoft 가져 오기에 대해 다음과 같이보고합니다. “기호 ‘ByteString / Field / FieldBody’를 확인할 수 없음”, BUT Build => Compile ‘StackOverflowQuestion.java’가 모든 것을 올바르게 컴파일하고이 클래스에 대해 작성한 단위 테스트가 정상적으로 실행됩니다. 의도는 create () 호출도 문제 영역으로 표시합니다.

어딘가에서 IntelliJ는 의도 하위 시스템에 대한 jmime.jar 파일을 무시합니다. log4j 의존성이 잘 작동하고 모든 것이 컴파일되고 잘 작동하기 때문에 혼란 스럽습니다. F12 ( “Go To Declaration”)는 로거 가져 오기에서 작동하지만 모든 jmime 가져 오기에서 끊어집니다.

아, 또 하나, “프로젝트”창의 “패키지”보기로 가면 “com.hunnysoft.jmime”패키지가 나타나고 “라이브러리”아래의 코드 스 니펫에서 가져온 모든 클래스를 볼 수 있습니다. . pom.xml 파일에서 위의 종속성을 제거하면이 패키지가 사라지고 컴파일이 중단됩니다.

검사의 클래스 경로가 망가진 것 같지만 Settings => Intentions | 컴파일러 영역 (그런 설정을 기대하지는 않았지만 IDEA가 이미 pom 파일과 JDK를 기반으로 올바른 클래스 경로를 알고 있어야한다고 생각합니다).

마지막 실험으로 나는 maven을 사용하지 않고 새로운 표준 J2SE 응용 프로그램 프로젝트를 만들고 jmime.jar 파일을 라이브러리 중 하나로 프로젝트에 직접 추가했습니다. 이 새 프로젝트에서 위에서 설명한 것과 정확히 동일한 문제가 발생합니다.

다음은 jmime jar 파일의 MANIFEST.MF입니다.

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.5.4
Created-By: 10.0-b23 (Sun Microsystems Inc.)

Name: com/hunnysoft/jmime/
Sealed: true
Specification-Title: Hunny JMIME
Specification-Version: 3.1.1
Specification-Vendor: Hunny Software, Inc.
Implementation-Title: com.hunnysoft.jmime
Implementation-Version: 3.1.1E
Implementation-Vendor: Hunny Software, Inc.

이 jar 파일에서 이상한 점이 없습니다.

내 최선의 추측은 아마도 문제가 누락 된 종속성 문제 일 수 있다는 것입니다. 그러나 AFAIK jmime은 자체 포함되어 있어야합니다 (JarAnalyzer는 아무것도 제시하지 않지만 종속성 jar이 누락되어 있는지 확실하지 않습니다).

그래서 누구나 IDEA가 있습니까?



답변

우선 시도 File | Invalidate Caches하고 도움이되지 않으면 IDEA 시스템 디렉토리를 삭제하십시오. . 그런 다음 Maven 프로젝트를 다시 가져 와서 도움이되는지 확인하십시오.

이상한 경우 컴파일 된 클래스가 잘못된 정보를보고하고 IDEA를 혼동 할 수 있습니다. 이 jar의 클래스가 javap를 사용하여 올바른 이름을보고하는지 확인하십시오 .


답변

다음 트릭은이 문제를 해결했습니다.

  • 코드 편집기를 마우스 오른쪽 버튼으로 클릭하십시오
  • Maven을 가리키고 확장
  • 다시 가져 오기를 클릭하십시오

내 아이디어 버전은 12.0.4입니다


답변

위의 해결책 중 어느 것도 나를 위해 일하지 않았습니다. main.iml 파일을 수동으로 제거하고 갑자기 작동했습니다.


답변

Gradle 사용자의 경우 :

프로젝트를 build.gradle파일 과 동기화해야 할 수도 있습니다.

이 작업을 수행하려면 프로젝트 창에서 사용자의 Gradle을 파일을 마우스 오른쪽 단추로 클릭 할 수 있습니다, 하지만 그것은 나를 위해 무엇을 (내 버전의 버그를 의심) 할 것 같지 않았다. 대기중인 IntelliJ 작업을 시작하지 않기 때문에 이러한 상황이 발생하는지 알 수 있습니다. 대신에 Gradle Tool 창 을 연 다음 동기화 (새로 고침) 버튼을 클릭하십시오. 이것은 캐시를 무효화하고 다시 시작하지 않은 곳에서 효과적이었습니다.

내 자신의 상황 : Gradle과 함께 Scala 프로젝트를 사용하고 있었고 이것을해야했습니다.


답변

이것은 동일한 질문에 대한 또 다른 답변에서 언급되었습니다. 되었지만 여기 에서만이 해결됩니다. 모든 빌드를 IntelliJ 외부의 별도 터미널에서 수행합니다. 따라서 캐시에는 IntelliJ 앱이 읽을 수 있도록 적절한 권한이 설정되어 있어야합니다.

프로젝트의 루트 폴더에서 실행하십시오.

$ mvn -U idea:idea


답변

File-> Invalidate Caches를 수행하고 IDE를 다시 시작했을 때 한 가지 추가 단계는 프로젝트를 엽니 다. 오른쪽 상단에 자동 가져 오기를 사용할지 묻는 토스트 상자가 나타 났으며 문제가 해결되었습니다.


답변

확인해야 할 또 다른 사항 : 종속성이 중복되지 않았는지 확인하십시오. 필자의 경우이 동작을 나타내는 모듈이 다음과 같이 잘못 구성되어 있음을 발견했습니다. 다른 모듈에 대한 종속성이 있었고 다른 모듈에서 생성 된 jar에 대한 종속성이 있습니다. 이것은 모든 기호가 중복 참조 된 것을 의미하며 모호했습니다.