j2objc не соблюдает отчет о мертвом коде
Я пытаюсь заставить j2objc работать на нескольких моих java-модулях только в проекте gradle. Я использую плагин Gradle для j2objc, но я не верю, что это является источником каких-либо проблем. Модуль использует XMLUnit для обнаружения различий во входных файлах. XMLUnit включает в себя класс org.xmlunit.builder.JaxbBuilder
который не переводится из-за отсутствия некоторых javax-классов, которые отсутствуют в j2objc, предположительно потому, что они не переводят. В любом случае мой код не использует JaxbBuilder
класс, поэтому я создал отчет мертвого кода, чтобы опустить его. Я знаю, что могу использовать proguard для генерации более полного набора, но сейчас я сосредоточен только на предотвращении попыток этого класса, поскольку я все еще работаю над конвейером CI Gradle для всего этого. Отчет называется 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
}
И я вижу в журнале, что аргументы мертвого кода были добавлены в командную строку, но при выполнении я вижу:
INEST: файл для разбора:file:/Users/jenkins/.gradle/caches/modules-2/files-2.1/org.xmlunit/xmlunit-core/2.0.0-SNAPSHOT/b11b5e5d8e9f223af2fbaa93982d17b55899498/x-2H0-SNore-core -sources.jar!org/xmlunit/builder/JaxbBuilder.java ошибка: org/xmlunit/builder/JaxbBuilder.java:19: ошибка импорта javax.xml.bind не может быть устранена: org/xmlunit/builder/JaxbBuilder.java:20: ошибка импорта javax.xml.bind не может быть устранена: org/xmlunit/builder/JaxbBuilder.java:21: ошибка импорта javax.xml.bind не может быть устранена: org/xmlunit/builder/JaxbBuilder.java:22: Ошибка импорта javax.xml.bind не может быть исправлена: org/xmlunit/builder/JaxbBuilder.java:23: ошибка импорта javax.xml.bind не может быть исправлена: org/xmlunit/builder/JaxbBuilder.java:24: импорт javax.xml.bind не может быть решена ошибка: org/xmlunit/builder/JaxbBuilder.java:25: импорт javax.xml.bind не может быть решен ошибка: org/xmlunit/builder/JaxbBuilder.java:26: импорт javax. Ошибка xml.bind не может быть устранена: org/xmlunit/builder/JaxbBuilder.java:27: ошибка импорта javax.xml.bind не может быть исправлена: org/xmlunit/builder/JaxbBuilder.java:31: ошибка импорта java.beans.Introspector не может быть исправлена: org/xmlunit/builder/JaxbBuilder.java:43: Маршаллер не может быть разрешен с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:56: Маршаллер не может быть разрешен с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:57: Маршаллер не может быть решен с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:82: Маршаллер не может быть решен с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:83: метод createDefaultMarshaller() из типа, который ссылается JaxbBuilder к отсутствующему типу ошибка JAXBException: org/xmlunit/builder/JaxbBuilder.java:87: JAXBSource не может быть преобразован в ошибку типа: org/xmlunit/builder/JaxbBuilder.java:87: JAXBSource не может быть преобразован в ошибку типа: org /xmlunit/builder/JaxbBuilder.java:87: не удается разрешить маршаллера ошибку типа: org/xmlunit/builder/JaxbBuilder.java:92: JAXBException невозможно разрешить до ошибки типа: org/xmlunit/builder/JaxbBuilder.java:93: невозможно исключить исключение DataBindingException с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:99: JAXBElement не может быть преобразовано в ошибку типа: org/xmlunit/builder/JaxbBuilder.java:103: XmlRootElement не может быть разрешен до ошибки типа: org / xmlunit / builder / JaxbBuilder.java: 103: несоответствие границ: универсальный метод getAnnotation(класс) типа AnnotatedElement не применим для аргументы (класс). Предполагаемый тип XmlRootElement не является допустимой заменой ошибки ограниченного параметра: org/xmlunit/builder/JaxbBuilder.java:103: XmlRootElement не может быть преобразован в ошибку типа: org/xmlunit/builder/JaxbBuilder.java:106: метод createJAXBElement(Object) из типа JaxbBuilder ссылается на ошибку отсутствующего типа JAXBElement: org/xmlunit/builder/JaxbBuilder.java:108: метод createInferredJAXBElement(Object) из типа JaxbBuilder ссылается на отсутствующий тип ошибки JAXBL / xml / xgle builder/JaxbBuilder.java:117: JAXBException не может быть преобразовано в ошибку типа: org/xmlunit/builder/JaxbBuilder.java:117: PropertyException не может быть преобразовано в ошибку типа: org/xmlunit/builder/JaxbBuilder.java:118: JAXBContext не может быть разрешен с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:119: JAXBElement не может быть разрешен с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:120: JAXBContext не может быть разрешен с ошибкой: org/xmlunit/builder/JaxbBuilder.java:120: JAXBElement может не может быть разрешено до ошибки типа: org/xmlunit/builder/JaxbBuilder.java:120: JAXBElement не может быть разрешено до ошибки типа: org/xmlunit/builder/JaxbBuilder.java:123: JAXBContext не может быть разрешено ошибка: org/xmlunit/builder/JaxbBuilder.java:125: Маршаллер не может быть разрешен с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:126: Маршаллер не может быть разрешен с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:126: Marshaller не может быть преобразован в переменную ошибку: org/xmlunit/builder/JaxbBuilder.java:130: JAXBElement не может быть преобразован в ошибку типа: org/xmlunit/builder/JaxbBuilder.java:133: JAXBElement не может быть преобразован в тип ошибка: org/xmlunit/builder/JaxbBuilder.java:136: JAXBElement не может быть преобразован в ошибку типа: org/xmlunit/builder/JaxbBuilder.java:137: JAXBElement не может быть преобразован в ошибку типа: org / xmlunit / builder / JaxbBuilder.java:137: метод createJaxbElementFromObjectFactory(T) из типа JaxbBuilder ссылается на отсутствующий тип ошибки JAXBElement: org/xmlunit/builder/JaxbBuilder.java:139: метод createInferredJAXBElement(T) из типа JaxbBuilder ссылается на отсутствующий тип. Ошибка JAXBElement: org/xmlunit/builder/JaxbBuilder.java:146: ошибка типа JAXBved не может быть разрешена: ошибка типа JAXBElement org/xmlunit/builder/JaxbBuilder.java:156: JAXBElement не может быть разрешен с ошибкой типа: org/xmlunit/builder/JaxbBuilder.java:161: JAXBElement не может быть разрешен с ошибкой типа: org / xmlunit / builder / Jaxb Java:174: Introspector не может быть решен
Что я понимаю, чтобы попытаться обработать JaxbBuilder
учебный класс. Есть ли что-то в конфигурации, что мне не хватает?
1 ответ
Первым шагом трансляции j2objc является вызов Java-компилятора Eclipse, поэтому для продолжения работы преобразователя необходимо разрешить ссылки на мертвый код, даже если класс с этими ссылками впоследствии будет удален на этапе удаления мертвого кода. Добавление файла jar для разрешения классов javax.xml.bind (например, jaxb-api.jar) устранит большинство этих ошибок.
Однако проблема java.beans.Introspector остается проблемой, поскольку она не является частью API Android, а поддержка JRE в j2objc основана на источниках Android. Поскольку этот класс и его ссылки будут удалены, вы можете попробовать указать rt.jar вашей JVM в качестве загрузочного пути транслятора (-Xbootclasspath: flag). Трансляция обычно использует jar, который соответствует библиотеке JRE j2objc, поэтому о неподдерживаемых классах сообщают рано. Указание JVM rt.jar в качестве загрузочного пути отменяет эту проверку ошибок, но позволяет разрешать неподдерживаемые классы.
Поскольку вышеприведенное звучит как большая работа, у вас есть еще один вариант - запросить, чтобы плагин gradle для j2objc имел опцию exclude, что-то вроде:
j2objcConfig {
...
translateArgs '-v'
exclude 'org.xmlunit.builder.JaxbBuilder'
...
Плагин gradle для команды j2objc отделен от j2objc, но они очень чутко реагируют на разумные запросы функций, подобные этому.