Регистрация осей Apache - ClassCastException при использовании его внутри плагина Jira
Мой плагин Jira 5.0 не работает со следующим исключением:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
Caused by: java.lang.ExceptionInInitializerError
at org.apache.axis.description.OperationDesc.<clinit>(OperationDesc.java:65)
at com.xyz.germander.AddTestTrackLinkDialogAction.doConfirm(AddTestTrackLinkDialogAction.java:23)
... 148 more
Caused by: java.lang.ClassCastException: org.apache.commons.logging.impl.SLF4JLogFactory cannot be cast to org.apache.commons.logging.LogFactory
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33)
... 150 more
Для справки, это метод, генерирующий исключение ClassCastException:
private static final org.apache.commons.logging.LogFactory getLogFactory() {
return (org.apache.commons.logging.LogFactory)
AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
return DiscoverSingleton.find(org.apache.commons.logging.LogFactory.class,
org.apache.commons.logging.LogFactory.FACTORY_PROPERTIES,
org.apache.commons.logging.LogFactory.FACTORY_DEFAULT);
}
});
}
... для дальнейшей ссылки org.apache.commons.logging.LogFactory.FACTORY_DEFAULT - это "org.apache.commons.logging.impl.LogFactoryImpl", а FACTORY_PROPERTIES - это имя файла свойств для поиска, который в моем банке org.apache.commons.logging есть "commons-logging.properties".
Я попытался создать файл commons-logging.properties в директории ресурсов плагина; этот файл содержит это:
priority=1
org.apache.commons.logging.Log=org.apache.commons.logging.impl.LogFactoryImpl
... но, похоже, это игнорируется, поскольку getLogFactory() все еще получает SLF4JLogFactory и не может его привести. Так это выглядит так:
- Этот файл commons-logging.properties должен быть где-то еще
- Мне нужно установить класс ведения журнала, чтобы быть чем-то другим
- В противном случае проект неправильно настроен, возможно, на уровне Jira, или, возможно, на плагине, или, возможно, Maven или... Я даже не знаю,
Я довольно озадачен и буду признателен за любые рекомендации
Здесь есть похожий вопрос, за исключением того, что плакат получает такое же исключение в getLogFactory из инициализации org.apache.axis.attachments.AttachmentsImpl вместо org.apache.axis.description.OperationDesc. (Также плагин Confluence, а не Jira.) Никто там не ответил.
2 ответа
Открытия: Atlassian разветвил библиотеку оси, и Jira теперь использует axis-1.3-atlassian-1, а не последнюю ось-1.4 от Apache; axis-1.3-atlassian-1 использует версию регистрации общего использования 1.0.4, а не 1.1.1, как axis-1.4.
Изменение зависимости плагина от оси-1.4 до оси-1.3-atlassian-1 решило проблему. Я подозреваю, что SLF4JLogFactory мог привести к org.apache.commons.logging.LogFactory в 1.0.4, но не 1.1.1, но я не проверял это.
Если в Jira, обязательно укажите область зависимости как "предоставленную", иначе вы столкнетесь с проблемами из-за того, что материал загружается дважды. Вот фрагмент кода:
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.3-atlassian-1</version>
<scope>provided</scope>
</dependency>
Включая только результаты axis-1.3-atlassian-1
java.lang.ClassNotFoundException: org.apache.axis.transport.http.AdminServlet
Из-за моего приложения нужен AdminServlet, который включен в библиотеку оси приложения. Наконец, когда я включил оба, это прекрасно работает со мной.
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.3-atlassian-1</version>
<scope>provided</scope>
</dependency>