j2objc не учитывает отчет о мертвом коде

Я пытаюсь заставить j2objc работать на нескольких моих модулях только для Java в проекте Gradle. Я использую плагин gradle для j2objc, но не думаю, что это источник каких-либо проблем. Модуль использует XMLUnit для обнаружения различий во входных файлах. XMLUnit включает класс org.xmlunit.builder.JaxbBuilder, который не может быть переведен из-за того, что не видит некоторые классы javax, опущенные в j2objc, предположительно, потому, что они не могут быть переведены. В любом случае мой код не использует класс JaxbBuilder, поэтому я создал отчет о мертвом коде, чтобы опустить его. Я знаю, что могу использовать proguard для создания более полного набора, но на данный момент я сосредоточен только на предотвращении попыток использования этого класса, поскольку я все еще работаю над конвейером Gradle CI для всего этого. Отчет называется dead_code.log и содержит только следующую строку:

org.xmlunit.builder.JaxbBuilder

Конфигурация плагина j2objc указана как:

j2objcConfig {
    autoConfigureDeps true
    // Xcode workspace directory
    xcodeProjectDir '../ios'

    translateArgs '--dead-code-report', './dead_code.log'
    translateArgs '--doc-comments'
    translateArgs '-v'

    finalConfigure()          // Must be last call to configuration
}

И я вижу в журнале, что аргументы мертвого кода были добавлены в командную строку, но при выполнении я тогда вижу:

Что я интерпретирую как означающее, что он пытался обработать класс JaxbBuilder. Есть ли что-то в конфигурации, чего мне не хватает?

Первым шагом преобразования j2objc является вызов компилятора Eclipse Java, поэтому ссылки на мертвый код должны быть разрешены, чтобы транслятор мог продолжить работу, даже если класс с этими ссылками позже удаляется на этапе устранения мертвого кода. Добавление файла jar для разрешения классов javax.xml.bind (например, jaxb-api.jar) устранит большинство этих ошибок.


person Jared    schedule 13.10.2015    source источник


Ответы (1)


Тем не менее, java.beans.Introspector остается проблемой, поскольку он не является частью Android API, а поддержка JRE в j2objc основана на исходных кодах Android. Поскольку этот класс и его ссылки будут удалены, вы можете попробовать указать rt.jar вашей JVM в качестве пути загрузки класса транслятора (-Xbootclasspath: флаг). Перевод обычно использует jar, который соответствует библиотеке JRE j2objc, поэтому о неподдерживаемых классах сообщается заранее. Указание rt.jar JVM в качестве пути к классу загрузки отменяет эту проверку ошибок, но позволяет разрешать неподдерживаемые классы.

Поскольку вышеизложенное звучит как много работы, другой вариант, который у вас есть, — запросить, чтобы плагин gradle для j2objc имел опцию исключения, что-то вроде:

Плагин gradle для команды j2objc отделен от j2objc, но они очень отзывчивы на разумные запросы функций, подобные этому.

j2objcConfig {
    ...
    translateArgs '-v'
    exclude 'org.xmlunit.builder.JaxbBuilder'
    ...

благодарю вас. На данный момент я попытался указать путь к классам загрузки, и это сработало. Ошибочный импорт разрешился, но оскорбительный класс был переведен. Я предполагаю, что если бы код попытался использовать его, ничего бы не вышло, но я смог, по крайней мере, экспортировать код, который мне был нужен. Временное решение, которое позволяет мне двигаться вперед. Я также запрошу вариант плагина, который вы предложили.

person tball    schedule 13.10.2015
comment
Джаред, не могли бы вы написать запрос на странице проблем с плагинами: github.com/ j2objc-contrib/j2objc-gradle/issues - person Jared; 13.10.2015
comment
INEST: анализ jar:file:/Users/jenkins/.gradle/caches/modules-2/files-2.1/org.xmlunit/xmlunit-core/2.0.0-SNAPSHOT/b11b5e5d8e9f223af2fbaa93982d17b55899498/xmlunit-core-2.0.0-SNAPSHOT -sources.jar!org/xmunit/builder/JaxbBuilder.java ошибка: org/xmunit/builder/JaxbBuilder.java:19: ошибка импорта javax.xml.bind не может быть разрешена: org/xmunit/builder/JaxbBuilder.java: 20: Ошибка импорта javax.xml.bind не может быть разрешена: org/xmunit/builder/JaxbBuilder.java:21: Ошибка импорта javax.xml.bind не может быть разрешена: org/xmunit/builder/JaxbBuilder.java:22: Ошибка импорта javax.xml.bind не может быть разрешена: org/xmunit/builder/JaxbBuilder.java:23: ошибка импорта javax.xml.bind не может быть разрешена: org/xmunit/builder/JaxbBuilder.java:24: импорт Ошибка javax.xml.bind не может быть разрешена: org/xmunit/builder/JaxbBuilder.java:25: Ошибка импорта javax.xml.bind не может быть разрешена: org/xmunit/builder/JaxbBuilder.java:26: Ошибка импорта javax. xml.bind не может быть устранена ошибка: org/xmunit/builder/JaxbBuilder.java:27: ошибка импорта javax.xml.bind не может быть разрешена: org/xmunit/builder/JaxbBuilder.java:31: ошибка импорта java.beans.Introspector не может быть разрешена: org/ xmunit/builder/JaxbBuilder.java:43: Marshaller не может быть преобразован в ошибку типа: org/xmunit/builder/JaxbBuilder.java:56: Marshaller не может быть преобразован в ошибку типа: org/xmunit/builder/JaxbBuilder.java: 57: Marshaller не может быть преобразован в ошибку типа: org/xmunit/builder/JaxbBuilder.java:82: Marshaller не может быть преобразован в ошибку типа: org/xmunit/builder/JaxbBuilder.java:83: метод createDefaultMarshaller() из тип JaxbBuilder относится к отсутствующему типу. Ошибка JAXBException: org/xmunit/builder/JaxbBuilder.java:87: JAXBSource не может быть преобразована в ошибку типа: org/xmunit/builder/JaxbBuilder.java:87: JAXBSource не может быть преобразована в ошибка типа: org/xmunit/builder/JaxbBuilder.java:87: Marshaller не может быть преобразован в ошибку типа: org/xmunit/build er/JaxbBuilder.java:92: JAXBException не может быть разрешено как ошибка типа: org/xmunit/builder/JaxbBuilder.java:93: DataBindingException не может быть разрешено как ошибка типа: org/xmunit/builder/JaxbBuilder.java:99: JAXBElement не может быть разрешен как ошибка типа: org/xmunit/builder/JaxbBuilder.java:103: XmlRootElement не может быть разрешен как ошибка типа: org/xmunit/builder/JaxbBuilder.java:103: Несоответствие привязки: универсальный метод getAnnotation( Class) типа AnnotatedElement неприменим для аргументов (Class). Выведенный тип XmlRootElement не является допустимой заменой для ошибки ограниченного параметра: org/xmunit/builder/JaxbBuilder.java:103: XmlRootElement не может быть преобразован в ошибку типа: org/xmunit/builder/JaxbBuilder.java:106: метод createJAXBElement(Object) из типа JaxbBuilder ссылается на ошибку JAXBElement отсутствующего типа: org/xmunit/builder/JaxbBuilder.java:108: Метод createInferredJAXBElement(Object) из типа JaxbBuilder ссылается на ошибку JAXBElement отсутствующего типа: org/xmunit/ builder/JaxbBuilder.java:117: JAXBException не может быть разрешено как ошибка типа: org/xmunit/builder/JaxbBuilder.java:117: PropertyException не может быть преобразовано как ошибка типа: org/xmunit/builder/JaxbBuilder.java:118: JAXBContext не может быть разрешен как ошибка типа: org/xmunit/builder/JaxbBuilder.java:119: JAXBElement не может быть разрешен как ошибка типа: org/xmunit/builder/JaxbBuilder.java:120: JAXBContext не может быть разрешен как ошибка: org/ xmlunit/строитель/JaxbBuilder.java:1 20: JAXBElement не может быть разрешен как ошибка типа: org/xmunit/builder/JaxbBuilder.java:120: JAXBElement не может быть разрешен как ошибка типа: org/xmunit/builder/JaxbBuilder.java:123: JAXBContext не может быть разрешен как ошибка: org/xmunit/builder/JaxbBuilder.java:125: Marshaller не может быть преобразован в ошибку типа: org/xmunit/builder/JaxbBuilder.java:126: Marshaller не может быть преобразован в ошибку типа: org/xmunit/builder/JaxbBuilder. java:126: Marshaller не может быть разрешен как ошибка переменной: org/xmunit/builder/JaxbBuilder.java:130: JAXBElement не может быть разрешен как ошибка типа: org/xmunit/builder/JaxbBuilder.java:133: JAXBElement не может быть разрешен к ошибке типа: org/xmunit/builder/JaxbBuilder.java:136: JAXBElement не может быть разрешен к ошибке типа: org/xmunit/builder/JaxbBuilder.java:137: JAXBElement не может быть разрешен к ошибке типа: org/xmunit /builder/JaxbBuilder.java:137: метод createJaxbElementFromObjectFactory(T) из типа, на который ссылается JaxbBuilder ошибка JAXBElement отсутствующего типа: org/xmunit/builder/JaxbBuilder.java:139: метод createInferredJAXBElement(T) из типа JaxbBuilder ссылается на ошибку JAXBElement отсутствующего типа: org/xmunit/builder/JaxbBuilder.java:146: JAXBElement не может быть разрешена как ошибка типа: org/xmunit/builder/JaxbBuilder.java:156: JAXBElement не может быть разрешена как ошибка типа: org/xmunit/builder/JaxbBuilder.java:161: JAXBElement не может быть разрешена как ошибка типа: org /xmunit/builder/JaxbBuilder.java:174: Introspector не может быть разрешен - person brunobowden; 14.10.2015