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>