Сканер Spring не обнаруживает компонент

Я пытаюсь написать плагин прослушивателя событий для jira. Когда я иду по-старому (что делает последний Atlassian SDK 6.2.9) и помещаю эти 2 строки

<component key="eventListener" class="jira.plugins.listeners.MyEventListener"/>
<component-import key="eventPublisher" class="com.atlassian.event.api.EventPublisher"/>

и попробуйте упаковать плагин, я получаю предупреждение о том, что I cannot use component/component-import statement inside plugin descriptor file when Atlassian plugin key is set. Последний SDK использует Spring Scanner, который автоматически добавляется в файл pom.xml во время создания скелета и который настоятельно рекомендуется в документации. Поэтому я удаляю эти две строки из файла atlassian-plugin.xml и пытаюсь заменить их соответствующими аннотациями:

@Component
public class MyEventListener{
   @Inject
   public MyEventListener(@ComponentImport EventPublisher eventPublisher){
        eventPublisher.register(this);
   }

}

Я могу скомпилировать и упаковать его таким образом, но когда я устанавливаю его на работающий экземпляр Jira, в описании плагина написано This plugin has no modules. Я пытался изменить @Component на @Named , добавить @ExportAsService в класс, но безрезультатно. Кажется, весенний сканер не обнаруживает мой класс как компонент. Кто-нибудь смог победить эту проблему? Я написал сообществу Atlassian, но пока не получил никаких новостей.


person Mikayil Abdullayev    schedule 23.11.2016    source источник
comment
Недавно я тоже столкнулся с этим, я до сих пор не понял, как заставить модуль отображаться в списке, но я заметил, что мои @EventListener все равно вызываются. Вы пытались добавить журналирование в свои методы @EventListener и/или конструктор?   -  person Joshua Webb    schedule 04.02.2017
comment
Да, я добавил ведение журнала, и у меня ничего не регистрируется.   -  person Mikayil Abdullayev    schedule 05.02.2017
comment
Если у вас установлен ключ плагина Atlassian, вы не можете использовать теги компонентов в xml плагина atlassian. Это означает, что вы используете Spring Scanner. Старый способ заключался в том, чтобы поместить тег компонента в xml плагина atlassian и не иметь набора ключей плагина.   -  person jpllosa    schedule 12.11.2018


Ответы (1)


Настройте подключаемый модуль maven Spring Scanner для выполнения в подробном режиме и убедитесь, что ваш класс обрабатывается во время сборки с использованием шаблонов включения.

    <plugin>
        <groupId>com.atlassian.plugin</groupId>
        <artifactId>atlassian-spring-scanner-maven-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>atlassian-spring-scanner</goal>
                </goals>
                <phase>process-classes</phase>
            </execution>
        </executions>
        <configuration>
            <includeExclude>+your.package.goes.here.*</includeExclude>
            <verbose>true</verbose>
        </configuration>
    </plugin>

Если все в порядке, после сборки ваш компонент будет указан в файле target/classes/META-INF/plugin-components/component.

Если @Component определен в библиотечном модуле (как зависимость плагина хостинга), вы также можете сгенерировать метаданные компонента, используя элемент конфигурации

            <scannedDependencies>
                <dependency>
                    <groupId>your.library.group.id</groupId>
                    <artifactId>your-library</artifactId>
                </dependency>
            </scannedDependencies>

Примечание: есть разница между весенним сканером V1 и V2, убедитесь, что вы используете правильную версию. См. справку.

person pharsfalvi    schedule 21.02.2017
comment
Следует пояснить (мне это было непонятно), что <includeExclude> указывает пути, которые не должны сканироваться. документы объясняют его назначение следующим образом: этот тег вообще. Однако мне до сих пор остается неясным а) как указать более одного пути и б) что может означать знак минус напротив знака плюс в примере. - person not2savvy; 22.03.2019