Есть ли простой способ добавить jar в верный путь к тестовому классу плагина

#java #maven-3 #maven-surefire-plugin

#java #maven-3 #maven-верный плагин

Вопрос:

существует это свойство additionalClasspathElements, но, к сожалению, оно не обрабатывает каталоги с jar

с этой проблемой действительно сложно справиться… единственный способ, который приходит мне в голову, — это создать mojo, который подготавливает classpath, но я не знаю, что последует

создание списка из 175 jar в моем определении pom выглядело бы забавно.Это будет 525 строк в additionalClasspathElements

Мне нужно загрузить огромный проект, который не использует maven. Объявить их было бы практически невозможно из-за совместимости версий 175 библиотек. Имхо, загрузка их непосредственно из classpath проекта — единственный способ

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

1. Можете ли вы использовать * для захвата всех jar?

2. На самом деле это не работает, я пытаюсь его отладить, удаленный отладчик eclipse подключается к нему, но он не останавливается на точке останова в AbstractSurefireMojo … Также нет способа увидеть путь к классу в eclipse (при запуске в консоли), а инструмент linux $ ps показывает 2 процесса maven, но у них нет результирующего пути к классу … плагин surefire действительно слишком сложный

3. Боже, этот верный плагин абсолютно не поддается исправлению… загрузка классов / многопоточный ад

4. Приятно, ошибка открыта в течение трех лет. Живой проект.

Ответ №1:

Прежде всего, используйте подстановочные знаки для создания classpath :

 <additionalClasspathElements>
    <additionalClasspathElement>
        /path/to/lib/*.jar
    </additionalClasspathElement>
</additionalClasspathElements>
  

Вы должны использовать эти свойства :

 <useManifestOnlyJar>false</useManifestOnlyJar>  
<useSystemClassLoader>false</useSystemClassLoader>
  

Потому что, взгляните на ForkConfiguration.java :

 if ( useManifestOnlyJar )
{
    File jarFile;
    try
    {
        jarFile = createJar( classPath );
    }
    catch ( IOException e )
    {
        throw new SurefireBooterForkException( "Error creating archive file", e );
    }

    cli.createArg().setValue( "-jar" );

    cli.createArg().setValue( jarFile.getAbsolutePath() );
}
else
{
    cli.addEnvironment( "CLASSPATH", StringUtils.join( classPath.iterator(), File.pathSeparator ) );

    final String forkedBooter = ForkedBooter.class.getName();

    cli.createArg().setValue( shadefire ? new Relocator().relocate( forkedBooter ) : forkedBooter );
}
  

Вы хотите, чтобы classpath был объединен и добавлен в CLI, а не в JAR только для манифеста…

Это должно работать для простых зависимостей. Но если вы хотите загрузить что-то большое, что-то, что использует classloader, я бы порекомендовал, что делает bmargulies. Потому что вы бы боролись с этим изо всех сил, имхо 🙂 Смотрите здесь, почему.

Для вдохновения я написал установщик зависимостей, который устанавливает jar в локальный репозиторий maven и генерирует определение pom со всеми этими зависимостями, чтобы вы могли использовать его как зависимость (которая помещает все его зависимости в зависимости от classpath — transitive)… Лучший способ, имхо. Это довольно общий моджо, его необязательно использовать в Liferay. Вам просто нужно немного поиграть с этим.

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

1. Подтверждено, что работает с surefire 2.18.1, но не с 2.14.1.

Ответ №2:

Напишите сценарий оболочки, который повторяет все эти jar, вызывая mvn install:install-file со сфабрикованным groupId, artifactId и version.

Заставьте сценарий оболочки выписать XML для <dependency/> элементов Maven для всех из них с <scope>test</scope> помощью.

Вставьте полученный двоичный объект XML в POM.

Отойдите.

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

1. Я ежедневно вношу свой вклад в программное обеспечение, процесс сборки / развертывания программного обеспечения, который в любом случае чрезмерно сложен, станет еще более сложным, если установить зависимости после каждой сборки… просто для запуска теста… Я выясню, как отладить верный плагин и отправить исправление для additionalClasspathElement, чтобы принимать подстановочные знаки

2. Это может показаться простым способом, но на самом деле это неправильно, имхо. Я сделал это год назад с помощью Ant-скрипта. Установка фиктивных артефактов без метаданных только потому, что плагин surefire имеет этот недостаток

3. Смотрите, surefire является частью maven . Неразумно ожидать, что в нем будут всевозможные ошибки, которые помогут использовать варианты, отличные от maven. Вы могли бы написать сценарий моей процедуры в ant, и это могло бы быть полностью автоматизировано.