Как убедиться, что плагин Maven является потокобезопасным
У меня есть несколько плагинов maven, которые были разработаны в моей команде, и эти плагины не помечены как @threadSafe. Я выполнил около 50 заданий и не вижу в этом несоответствия, но я хотел бы знать, есть ли способ проверить это программно.
И что нужно искать, что сделает плагин небезопасным для многопоточности
1 ответ
На основании https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3 моджо считается до тех пор, пока нет изменяемого состояния, которое является общим для разных экземпляров моджо - например, статическая ссылка на объект с изменяемым содержимым.
При сборке одного модуля создается экземпляр моджо, и его метод вызывается один раз в одном потоке.
OTOH, если собираются два модуля, и ни один из них не зависит от другого, создаются отдельные экземпляры моджо (по одному для каждого модуля), и ихexecute()
методы могут вызываться одновременно в разных потоках - если-T
используется флаг cli и соответствующие моджо.
По ссылке выше перечислены некоторые конкретные вещи, которые следует проверить:
- Убедитесь, что все статические поля/переменные в плагине/коде плагина не подвержены проблемам с потоками.
- Возможно, вам захочется обратить особое внимание на статические переменные-члены подклассов
java.text.Format
(NumberFormat
,DateFormat
и т. д.), большинство из которых не являются потокобезопасными и не могут использоваться совместно как статические переменные. - Проверьте любое сплетение
components.xml
; если определенные компоненты являются одиночными, они должны быть потокобезопасными. - Проверьте наличие известных испорченных библиотек.
- Проверьте потокобезопасность любых других сторонних библиотек. Этот последний пункт может оказаться немного сложным, но запросы в списках рассылки могут вам помочь.
Теоретически две разные сборки модуля все равно могут вступить в гонку, например, записывая в один и тот же файл. Кажется, это не то, чтоthreadSafe
Тег аннотации касается... возможно, потому, что на практике подавляющее большинство сборок модулей записывают файлы только внутри своих собственных каталогов модулей.