Как настроить Apache Commons Logger

Кто-нибудь знает, как настроить Apache Commons Logger? Кажется, у людей это заработало, но я с треском проваливаюсь.

Моя текущая настройка довольно проста:

build.gradle:

compile('commons-logging:commons-logging:1.2')
j2objcTranslation 'commons-logging:commons-logging:1.2'

Инициализация регистратора:

private static Log logger = LogFactory.getLog(ApiService.class);

также есть довольно простой файл logging.properties, могу прикрепить, если нужно.

После перевода и запуска на эмуляторе iOS возникает следующее исключение:

2016-09-21 19:39:35.960 temple8-ios[32544:598370] Fucking logger
2016-09-21 19:39:36.048 temple8-ios[32544:598370] *** Terminating app due to uncaught exception     'OrgApacheCommonsLoggingLogConfigurationException', reason:  'java.lang.ClassNotFoundException:  org.apache.commons.logging.impl.LogFactoryImpl (Caused by  java.lang.ClassNotFoundException:  org.apache.commons.logging.impl.LogFactoryImpl)'
 *** First throw call stack:
(
    0   CoreFoundation                      0x000000010e471d85     __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010d40cdeb objc_exception_throw + 48
    2   temple8-ios                         0x000000010c056a27 OrgApacheCommonsLoggingLogFactory_newFactoryWithNSString_withJavaLangClassLoader_withJavaLangClassLoader_ + 327
    3   temple8-ios                         0x000000010c059d06 OrgApacheCommonsLoggingLogFactory_getFactory + 3030
    4   temple8-ios                         0x000000010c056026 OrgApacheCommonsLoggingLogFactory_getLogWithIOSClass_ + 70

Изменить 1

@tball предоставил несколько замечательных деталей в своем ответе, но это привело к новой проблеме. Я добавил статическую ссылку на LogFactoryImpl и включил java.util.logging.IOSLogHandler в проект. При попытке перевести этот класс компилятор выдает следующую ошибку:

/java/util/logging/IOSLogHandler.m:58:17: error: method definition for 'IOS_LOG_MANAGER_DEFAULTS' not found [-Werror,-Wincomplete-implementation]
 @implementation JavaUtilLoggingIOSLogHandler
                ^
java/util/logging/IOSLogHandler.h:34:1: note: method    'IOS_LOG_MANAGER_DEFAULTS' declared here
+ (NSString *)IOS_LOG_MANAGER_DEFAULTS;
^
1 error generated.

Я использую последнюю версию IOSLogHandler из репозиторий j2objC github и разместил сгенерированный IOSLogHandler.m в суть.

Большое спасибо за помощь!


person LambergaR    schedule 21.09.2016    source источник
comment
IOSLogHandler обеспечивает поддержку java.util.logging, а не apache-commons-logging. Все, что вам нужно для apache-commons-logging, — это ссылка на класс LogFactoryImpl, поэтому отмените все шаги, которые вы сделали, чтобы добавить IOSLogHandler в свой проект.   -  person tball    schedule 26.09.2016


Ответы (1)


Компоновщик не включает org.apache.commons.logging.impl.LogFactoryImpl, потому что он загружается динамически, и поэтому не было ссылок на него, которые требовали разрешения во время компоновки. Я не знаю, как это исправить в Gradle, но есть два общих решения:

  1. Связать с флагом -ObjC, который приводит к тому, что ВСЕ классы Objective C во всех статических библиотеках будут связаны с приложением. Однако это может повлечь за собой множество ненужных классов, поэтому проверьте размер двоичного файла до и после приложения, чтобы убедиться, что это приемлемо.

  2. В классе, который уже связан с вашим приложением, добавьте ссылку на org.apache.commons.logging.impl.LogFactoryImpl. Это может быть так же просто, как:

    @SuppressWarnings("unused") private static final Класс loggingImplClass = LogFactoryImpl.class;

person tball    schedule 21.09.2016
comment
Тим, еще раз спасибо за ответ. Я обновил вопрос с некоторыми дополнительными вопросами, надеюсь, вы найдете время, чтобы взглянуть! - person LambergaR; 22.09.2016