web-dev-qa-db-ja.com

Mavenコンパイルの結果:シンボルが見つかりません-同じアプリに座っているクラスの場合

そんな不可解な問題に出会って久しぶりです。同じアプリケーションの別のパッケージにある別のクラスを参照するクラスがあります。つまり、別のjarアーカイブファイルではありません。

含まれているクラスは、learnintouch-rest/src/test/Java/com/thalasoft/learnintouch/rest/acceptance/AbstractControllerTest.Javaです。

含まれているクラスは/home/stephane/dev/Java/projects/learnintouch-rest/src/test/Java/com/thalasoft/learnintouch/rest/config/WebTestConfiguration.Javaです。

Eclipseでは、エディターに問題やコンパイルエラーはありません。

しかし、Mavenビルドを実行するとコンパイルエラーが発生します。

mvn clean test-compile -Pacceptance

[ERROR] Failed to execute goal org.Apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-testCompile) on project learnintouch-rest: Compilation failure: Compilation failure:
[ERROR] /home/stephane/dev/Java/projects/learnintouch-rest/src/test/Java/com/thalasoft/learnintouch/rest/acceptance/AbstractControllerTest.Java:[16,46] cannot find symbol
[ERROR] symbol:   class WebTestConfiguration
[ERROR] location: package com.thalasoft.learnintouch.rest.config
[ERROR] /home/stephane/dev/Java/projects/learnintouch-rest/src/test/Java/com/thalasoft/learnintouch/rest/acceptance/AbstractControllerTest.Java:[21,116] cannot find symbol
[ERROR] symbol: class WebTestConfiguration

以下は、包含クラスのコードです。

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@WebAppConfiguration
@ContextConfiguration(classes = {
    ApplicationConfiguration.class,
    WebSecurityConfig.class,
    WebConfiguration.class,
    WebTestConfiguration.class
})
public abstract class AbstractControllerTest {

この抽象テストクラスは、Mavenコマンドの実行時に-Pacceptanceプロファイルを明示的にアクティブ化することを要求する受け入れテストディレクトリの下にあります。

デフォルトのプロファイルはこの受け入れテストを実行せず、一部の統合テストのみを実行します。

注意すべきことの1つは、この抽象クラスは統合テストで使用される1つの抽象クラスのように見えることです。

統合テストの包含クラスは次のとおりです。

import com.thalasoft.learnintouch.rest.config.WebTestConfiguration;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {ApplicationConfiguration.class},
        WebSecurityConfig.class,
        WebConfiguration.class,
        WebTestConfiguration.class
        })
@Transactional

public abstract class AbstractControllerTest {

ご覧のとおり、他のものとよく似ています。

pom.xmlファイルのコンテンツも提供できます。

<profiles>
    <profile>
        <id>rest</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <test.source.dir>src/test/Java/com/thalasoft/learnintouch/rest</test.source.dir>
        </properties>
    </profile>
    <profile>
        <id>acceptance</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <properties>
            <test.source.dir>src/test/Java/com/thalasoft/learnintouch/rest/acceptance</test.source.dir>
        </properties>
    </profile>
</profiles>

これについて何か手掛かりがあれば、大歓迎です。

10
Stephane

Mavenを使用すると、テストはプロジェクトのすべてのソースコード(src/main/Java)とすべてのテストソースコード(デフォルトはsrc/test/Java)にアクセスできます。

ここで、プロファイルrestはテストソースディレクトリをsrc/test/Java/com/thalasoft/learnintouch/restと定義しているため、テストコードはsrc/main内のすべてにアクセスできます。/Javaおよびsrc/test/Java/com/thalasoft/learnintouch/restのすべて

プロファイルacceptanceは、テストソースディレクトリをsrc/test/Java/com/thalasoft/learnintouch/rest/acceptanceと定義しているため、テストコードはsrc/mainのすべてにアクセスできます。/Javaおよびsrc/test/Java/com/thalasoft/learnintouch/rest/acceptanceのすべて。上記のパッケージに含まれているため、WebTestConfigurationにはアクセスできません

異なるプロファイルで特定のテストを実行するには、テストの実行を担当するsurefireプラグインを構成することをお勧めします。良い例がここにあります: https://weblogs.Java.net/blog/carcassi/archive/2011/04/21/running-integration-tests-and-unit-tests-separately-maven =

8
Melou

問題の説明:

以下の構造で私のプロジェクトに同様の問題がありました。

project
-pom.xml

-common-module  
--src, pom.xml, etc

-web-module  
--src, pom.xml, etc (but dependent on 'common')

mvn installはcommon-moduleでは問題なく動作しますが、Java common-module(cannot find symbol)。 JDK 8 + Maven 3.2.5を使用していましたが、pomコンパイラではレバーが7に設定されています。

MYソリューション:

JDK 7Maven 3.1.1をインストールしてmvn install。ビンゴ..!すべてが正常に機能し、成功しました。

私はどこにでも私の問題の解決策を見つけることができなかったので、関連しているのでここに私の修正を投稿しましたが。 (それは誰かを助けることができるかもしれません)

1
vijay