#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, и это могло бы быть полностью автоматизировано.