Maven3およびJUnit4のコンパイルの問題:パッケージorg.junitが存在しません


80

Mavenを使用して単純なJavaプロジェクトを構築しようとしています。私のpomファイルでは、JUnit4.8.2を唯一の依存関係として宣言しています。それでも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
私はMaven3を使用していませんが、最初の推測では、テストクラスはsrc / main / javaにあり、POMはjunitをテスト依存関係として定義しています(つまり、「scope」要素の値は「test」です。 ")。しかし、あなたのPOMを見て、プロジェクトの構造を知らなければ、はっきりとは言えません。
サラロバーツ

2
MavenはJUnitに、あなたである必要があると主張していません...テストクラスを正しい場所src / test / javaに配置しなかったようです...そしてもちろん、pomは非常に役立ちます。
khmarbaise 2011年

回答:


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 2016

これを3.11から4.11に変更し、それも機能しますが、以前のバージョンのjunitではどうなるのでしょうか。
ティイナ2016年

45

@Dennis Roberts:あなたは絶対に正しかった:私のテストクラスはsrc / main / javaにありました。また、JUnitのPOMの「scope」要素の値は「test」でしたが、それが想定されている方法です。問題は、Eclipseでテストクラスを作成するときにだらしなく、src / test / javaではなくsrc / main / javaに作成されることでした。これは、「mvn eclipse:eclipse」を実行した後、Eclipseのプロジェクトエクスプローラービューで見やすくなりましたが、あなたのコメントが私が最初に見た理由でした。ありがとう。


いくつかのファイルをテストからメインに移動しましたが、junitAssertがエラーをスローし始めました。<scope> test </ scope>を削除すると、問題が解決しました。ありがとうございます。
pMan 2012年

1つのテストファイルをメインからテストに移動しました。次に、junit <scope> test </ scope>を使用してMavenコンパイルが成功します。
どうも

信じられないほど、私はまったく同じ問題を抱えていました。そして、Jenkinsはsrc / mainでの私のテストを気にしなかったので、私も気づきませんでした。
Pieter De Bie 2015

19

私の問題は私の内部の行でしたpom.xml私はこの行を<sourceDirectory>${basedir}/src</sourceDirectory>削除する行を持っていましたmavenに私の問題を解決する通常の構造フォルダを使用させました


1
<sourceDirectory> src << sourceDirectory>を削除した後、私のために機能しています
prashant thakre 2015年



4

私も同じ問題を抱えていました。私がしたのは-pom.xmlファイルからjunit3.8の依存関係を削除し、junit4.8の新しい依存関係を追加しただけです。次に、MavenのクリーンアップとMavenのインストールを行いました。それはトリックをしました。確認するために、mavenのインストール後、project-> properties-build path-> mavenの依存関係に移動し、junit 3.8 jarがなくなったことを確認しました!代わりにjunit 4.8jarがリストされています。涼しい!!。今、私のテストは魅力のように実行されます。これが何らかの形で役立つことを願っています。


はい。ただし、@ FrVaBeの回答により、同僚がコード(およびpom.xml)を取得したときに、ソリューションをもう一度理解する必要がなくなります。正しく動作します。
ラスベイトマン

4

私の場合は単純な見落としでした。

JUnit依存関係宣言を、POMファイルではなくノードの<dependencies>下に配置しました。正しい方法は次のとおりです。<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>を強制する方が良いのではないでしょうか?
ヨアヒムザウアー

3
@Joachim Sauerバージョン範囲を使用すると、現在SNAPSHOTバージョンも解決されます(リンク)。これが適切な概念であるかどうかについては、非常に議論の余地があります。SNAPSHOTバージョンを取得してもかまわない場合は、提案は非常に役立ちます。
frVaBe 2011

3

ファイルを正しい場所に配置<scope>test</scope>し、JUnit依存関係エントリから削除するだけで問題が解決しました(JUnit 4.12を使用しています)。testスコープでは、依存関係はコンパイル段階で無視されていたと思います。これで、電話をかけてもすべてが機能していますmvn test


3

依存性を注入する親プロジェクトの子である「test-utils」プロジェクト(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テスト(アノテーション付き)を作成しましたが、依存関係としてJUnit3.8.xを使用しました。JUnitのバージョン3.8.xと4の間で、パッケージ名がjunit.frameworkからorg.junitに変更されたため、MavenはJUnitjarを使用したコンパイルを中断します。

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にコードがある場合は、このエラーの1つの解決策を見つけてください

<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クラスとtestクラス(src / main / javaとsrc / test / java)を探します。

ソースの下のテストクラスでsrcが指定され、pom.xmlのjunit依存関係のスコープがテストとして言及されている場合、org.unitはmavenによって検出されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.