Spring Boot useTestClasspath вызывает исключение CannotLoadBeanClassException и ClassNotFoundException

#spring-boot #maven-plugin

#весенняя загрузка #maven-плагин

Вопрос:

У меня есть проект maven с тестовым классом, расположенным в src/test/java/MyDevClass котором, который предназначен только для целей разработки / тестирования. Я хотел бы использовать его при запуске spring-boot-maven-plugin с помощью командной строки mvn spring-boot:run .

Итак, мой pom.xml содержит:

 <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!-- TODO: Will create a maven profile and have useTestClasspath only for development/testing -->
                <useTestClasspath>true</useTestClasspath>
            </configuration>
        </plugin>
    </plugins>
</build>
  

Но я получаю следующую ошибку:

 org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [MyDevClass]
Caused by: java.lang.ClassNotFoundException: MyDevClass
  

Достаточно интригующе, у меня есть другой проект, использующий tomcat7-maven-plugin, и он работает нормально:

         <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.0</version>
            <configuration>
                <useTestClasspath>true</useTestClasspath>
            </configuration>
        </plugin>
  

Чего мне не хватает?

Комментарии:

1. Я не понимаю. Почему вы хотите, чтобы он был зарегистрирован в производственном контексте, когда это тестовый класс? Не имеет смысла.

2. Не связанные, но не помещайте свое приложение в пакет по умолчанию .

3. Привет @luboskrnac. Правильно, я не хочу, чтобы это было в производстве. Для этого я создам профиль maven.

4. Привет, Стефан Николл, никаких проблем. Я оставил пакет по умолчанию для простоты.

Ответ №1:

Плагин Spring-boot maven не включает тестовые источники (и ресурсы) текущего модуля в classpath, даже если useTestClasspath для него установлено значение true.

Я запустил разветвленное выполнение с подробным протоколированием ( -X флаг для Maven), и плагин указал разветвленный путь к классу JVM. Тестовые классы не были включены.

Если вы посмотрите на исходные коды плагина (версия 1.5.3 на момент написания), флаг useTestClasspath используется только в addDependencies методе.

Я вижу два варианта в качестве обходных путей

  1. Добавьте target/test-classes каталог в путь к запускаемому классу:

     <directories>
      <directory>${project.build.testOutputDirectory}</directory>
    </directories>
      

    Для более старой версии плагина используйте:

     <folders>
      <folder>${project.build.testOutputDirectory}</folder>
    </folders>
      

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

  2. Создайте другой модуль Maven с тестовыми классами и ресурсами и добавьте его в качестве <scope>test</scope> зависимости.

Комментарии:

1. В итоге я делаю что-то похожее на ваше предложение # 2