Maven 3 및 JUnit 4 컴파일 문제 : org.junit 패키지가 없습니다.


80

Maven으로 간단한 Java 프로젝트를 빌드하려고합니다. 내 pom-file에서 JUnit 4.8.2를 유일한 종속성으로 선언합니다. Still Maven은 JUnit 버전 3.8.1 사용을 주장합니다. 어떻게 고치나요?

문제는 컴파일 실패로 나타납니다 : "패키지 org.junit가 존재하지 않습니다". 이것은 내 소스 코드의 import 문 때문입니다. JUnit 4. *의 올바른 패키지 이름은 org.junit. *이고 버전 3. *에서는 junit.framework. *입니다.

http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html 에서 문제의 원인에 대한 문서를 찾았다 고 생각 하지만 거기에있는 조언은 Maven 전문가를위한 것 같습니다. 나는 무엇을 해야할지 이해하지 못했다.


21
Maven 3으로 작업하지 않았지만 첫 번째 추측은 테스트 클래스가 src / main / java에 있고 POM이 junit을 테스트 종속성으로 정의한다는 것입니다 (즉, "scope"요소의 값은 "test "). 하지만 POM을보고 프로젝트의 구조를 알지 않고서는 확실히 말할 수 없습니다.
Sarah Roberts

2
Maven은 JUnit에서 자신이해야한다고 주장하지 않습니다 ... Test 클래스를 올바른 위치 src / test / java에 배치하지 않은 것 같습니다 ... 물론 pom이 매우 도움이 될 것입니다.
khmarbaise

답변:


52

방문자를 돕기위한 완전한 솔루션으로 답변을 얻으려면 :

해야 할 일은 junit 종속성을 pom.xml. 잊지 마세요<scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

1
예, junit의 버전이 중요합니다. 3.8.1에서 4.11로 업그레이드했고 문제가 해결되었습니다.
Mahsa2

3.11에서 4.11로 변경했으며 작동하기도하지만 이전 버전 junit에서는 어떻게되었는지 궁금합니다.
Tiina

45

@Dennis Roberts : 당신은 절대적으로 옳았습니다 : 제 테스트 클래스는 src / main / java에있었습니다. 또한 JUnit 용 POM에있는 "범위"요소의 값은 "테스트"였지만, 그렇게되어 있어야합니다. 문제는 Eclipse에서 테스트 클래스를 만들 때 실수로 인해 src / test / java의 src / main / java에 생성되었습니다. 이것은 "mvn eclipse : eclipse"를 실행 한 후 Eclipse의 프로젝트 탐색기보기에서 더 쉽게 볼 수있게되었습니다. 그러나 귀하의 의견은 제가 처음으로 보게 한 것입니다. 감사.


일부 파일을 테스트에서 기본으로 옮겼고 junit Assert에서 오류가 발생하기 시작했습니다. <scope> test </ scope>를 삭제하여 문제가 해결되었습니다. 감사합니다!
pMan 2012 년

하나의 테스트 파일을 메인에서 테스트로 옮겼습니다. 그런 다음 maven은 junit <scope> test </ scope>로 성공했습니다. 고마워요
eleforest

믿기지가 않네요. 저도 똑같은 문제를 겪었습니다. 그리고 Jenkins는 src / main의 내 테스트에 대해 신경 쓰지 않았기 때문에 눈치 채지 못했습니다.
Pieter De Bie 2015 년

19

내 문제는 내 문제 를 해결하는 일반 구조 폴더를 사용하도록 만든이 줄을 제거 pom.xml하는 줄 <sourceDirectory>${basedir}/src</sourceDirectory>이 내 안에있는 줄이었습니다.


1
<sourceDirectory> src << sourceDirectory>를 제거한 후 저를 위해 작동합니다. 작동
prashant thakre

12

junit에 대한 pom.xml에서 범위 태그 제거가 작동했습니다.


4
이제 junit 테스트 클래스를 prod 바이너리로 보내고 있기 때문에이 솔루션은 좋지 않습니다.
avgvstvs


4

나는 같은 문제가 있었다. 내가 한 것은-pom.xml 파일에서 junit 3.8에 대한 종속성을 삭제하고 junit 4.8에 대한 새 종속성을 추가했습니다. 그런 다음 maven을 청소하고 maven을 설치했습니다. 트릭을했습니다. 확인하기 위해 maven 설치 후 project-> properties-build path-> maven 종속성으로 이동하여 이제 junit 3.8 jar가 사라 졌음을 확인했습니다! 대신 junit 4.8 jar가 나열됩니다. 멋있는!!. 이제 내 테스트는 매력처럼 진행됩니다 ..이게 도움이 되길 ..


예,하지만 @FrVaBe의 대답은 동료가 코드 (및 pom.xml)를 가져 오면 솔루션을 다시 파악할 필요가 없도록합니다. 제대로 작동합니다.
러스 베이트먼

4

제 사건은 단순한 감독이었습니다.

POM 파일 대신 노드 <dependencies>아래에 JUnit 종속성 선언을 넣었습니다 . 올바른 방법은 다음과 같습니다.<dependencyManagement/><project/>

<project>
<!-- Other elements -->
    <dependencies>
    <!-- Other dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
<project>

4

버전을 어떻게 선언 했습니까?

<version>4.8.2</version>

여기에 설명 된이 선언의 의미에 유의 하십시오 (참고 참조) .

Junit 용 3.8.2와 같은 "일반"버전을 선언 할 때 내부적으로는 "무엇이든 허용하지만 3.8.2 선호"로 표시됩니다. 이는 충돌이 감지되면 Maven이 충돌 알고리즘을 사용하여 최상의 버전을 선택할 수 있음을 의미합니다. [3.8.2]를 지정하면 3.8.2 만 사용되며 다른 것은 사용되지 않습니다.

4.8.2 버전을 강제로 사용하려면

<version>[4.8.2]</version>

프로젝트에 다른 종속성이 없으므로 문제를 일으키는 충돌이 있어서는 안됩니다. 저장소에서이 버전을 얻을 수 있다면 첫 번째 선언이 작동합니다. 부모 pom에서 종속성을 상속합니까?


1
적어도 그 버전 <version>[4.8.2,)</version>을 강제하는 것이 낫지 않을까요 ?
Joachim Sauer

3
@Joachim Sauer 현재 버전 범위를 사용하면 SNAPSHOT 버전 ( 링크 ) 도 해결 됩니다. 이것이 좋은 개념인지 논의되는 것은 매우 논란의 여지가 있습니다. SNAPSHOT 버전을 받아도 괜찮으 시다면 귀하의 제안은 상당히 유용합니다.
FrVaBe 2011

3

내 파일을 올바른 위치에 <scope>test</scope>두었고 JUnit 종속성 항목을 제거 하면 문제가 해결되었습니다 (JUnit 4.12를 사용하고 있습니다). test범위를 사용하면 컴파일 단계에서 종속성이 무시 되었다고 생각합니다 . 이제 전화를 걸어도 모든 것이 작동합니다 mvn test.


3

종속성을 주입하는 부모 프로젝트의 자식 "테스트 유틸리티"(JUnit에 기능, 규칙 및 어설 션 추가)에서 유사한 문제가 발생했습니다. org.junit.rules 패키지에 따른 클래스는 src / main / java에있었습니다.

그래서 테스트 범위없이 junit에 대한 종속성을 추가했고 문제가 해결되었습니다.

test-util 프로젝트의 pom.xml :

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

상위 프로젝트의 pom.xml :

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>

1

Eclipse가 내 코드를 잘 컴파일하는 비슷한 문제가 있었지만 JUnit이 내 종속성 목록에 있고 테스트가 / src / test / java /에 있다는 사실에도 불구하고 매번 테스트를 컴파일 할 때 Maven이 실패했습니다.

제 경우에는 종속성 목록에 잘못된 버전의 JUnit이 있습니다. JUnit4 테스트 (주석 포함)를 작성했지만 JUnit 3.8.x를 종속성으로 사용했습니다. 버전 3.8.x와 JUnit 4 사이에서 패키지 이름을 junit.framework에서 org.junit로 변경했기 때문에 Maven은 여전히 ​​JUnit jar를 사용하여 컴파일을 중단합니다.

Eclipse가 왜 성공적으로 컴파일되었는지는 아직 확실하지 않습니다. 클래스 경로 어딘가에 JUnit4의 자체 사본이 있어야합니다. 이 대체 솔루션이 사람들에게 유용하기를 바랍니다. 위의 Arthur의 링크를 따라이 솔루션에 도달했습니다.


1

나는 또한이 문제에 직면했다-소스에서 객체를 가져 오려고 시도했지만 테스트 코드에서는 작동하지만 src 코드에서는 작동하지 않았습니다. 추가 테스트를 위해 테스트에서 코드 블록을 복사하여 src 코드에 넣은 다음 즉시 JUnit 행을 제거하여 테스트가 객체를 어떻게 가져 오는지 확인했습니다. 그러면 갑자기 내 코드가 컴파일되지 않습니다.
문제는 내가 코드를 놓았을 때 Eclipse가 모든 클래스를 유용하게 해결했기 때문에 적절하지 않은 src 코드에서 JUnit 호출이 발생했다는 것입니다. 미사용 수입품에 대한 경고를 맨 위에 봤어야했는데보기를 간과했습니다.
src 파일에서 사용하지 않는 JUnit 가져 오기를 제거하면 모두 아름답게 작동했습니다.


1

저도 아래와 같은 문제가있었습니다.

여기에 이미지 설명 입력

문제를 해결하기 위해 아래 줄이 dependencies앱 수준 build.gradle의 섹션에 추가됩니다 .

compile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.5'

Gradle 빌드는 다음 경고를보고했습니다.

Warning:Conflict with dependency 'com.android.support:support-annotations'. 
Resolved versions for app (25.1.0) and test app (23.1.1) differ. 
See http://g.co/androidstudio/app-test-app-conflict for details.

이 경고를 해결하기 위해 다음 섹션이 앱 수준 build.gradle에 추가됩니다.

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-annotations:23.1.1'
    }
}

0

src / main / java Utils에 코드가있는 경우이 오류에 대한 한 가지 해결책을 찾으십시오.

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>

0

junit 버전을 변경하면이 문제가 해결되었습니다. 내 경우에는 버전 3.8.1이 작동하지 않은 것 같습니다. 4.12로 변경시 수정 된 문제


-1

기본적으로 maven은 각각 java 및 테스트 클래스에 대해 이러한 폴더를 찾습니다-src / main / java 및 src / test / java

소스에서 테스트 클래스로 src를 지정하고 pom.xml의 junit 종속성 범위가 test로 언급되면 maven에서 org.unit을 찾을 수 없습니다.

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