Maven компилирует: не может найти символ - для класса, сидящего в том же приложении

Это время, когда я встретил такую ​​загадочную проблему. У меня есть класс, который ссылается на другой, сидящий в другом пакете в том же приложении, то есть НЕ в другом файле архива jar.

Класс включения learnintouch-отдых/SRC/тест/Java/COM/thalasoft/learnintouch/отдых/прием/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 {

Этот абстрактный тестовый класс находится в каталоге приемочного теста, который требует явной активации профиля -Pacceptance при запуске команды Maven.

Профиль по умолчанию не запускает этот приемочный тест, но только некоторый интеграционный тест.

Следует отметить, что этот абстрактный класс выглядит как один абстрактный класс, используемый в тесте интеграции.

Вот включительный класс теста интеграции:

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>

Если у вас есть какие-либо подсказки по этому вопросу, мы будем очень благодарны.

Ответ 1

С maven ваши тесты могут получить доступ ко всему исходному коду вашего проекта (src/main/java) и ко всему исходному исходному коду (по умолчанию это src/test/java).

Здесь ваш профиль определяет исходный каталог для тестирования как src/test/java/com/thalasoft/learnintouch/rest Таким образом, ваш тестовый код может получить доступ ко всем в src/main/java и обо всем в src/test/java/com/thalasoft/learnintouch/rest

Ваш профиль определяет исходный каталог для тестирования как src/test/java/com/thalasoft/learnintouch/rest/accept Таким образом, ваш тестовый код может получить доступ ко всему в src/main/java и все в src/test/java/com/thalasoft/learnintouch/rest/accept. WebTestConfiguration недоступен, так как он находится в пакете выше.

Для запуска конкретных тестов с разными профилями я рекомендую настроить плагин surefire, отвечающий за запуск тестов. Хороший пример можно найти здесь: https://weblogs.java.net/blog/carcassi/archive/2011/04/21/running-integration-tests-and-unit-tests-separately-maven

Ответ 2

Описание проблемы:

У меня была аналогичная проблема с моим проектом с ниже структуры.

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.

Мое решение:

Я установил JDK 7 и Maven 3.1.1 и сделал mvn install. Бинго!.. Каждый из них отлично работает и строит успешный.

Я не мог найти решение для своей проблемы где угодно, поэтому, если вы разместите мое исправление здесь, поскольку оно связано. (может быть, это может помочь кому-то)

Ответ 3

попробуйте добавить ниже строку в pom.xml, которую я чувствую, что она отсутствует

 <profile>
      <id>acceptance</id>
      <activation>
        <activeByDefault>false</activeByDefault>
      </activation>
      <properties>
      <test.source.dir>src/test/java/com/thalasoft/learnintouch/rest/config</test.source.dir>
      </properties>
    </profile>