j2objc不尊重死代码报告

时间:2015-10-13 16:06:53

标签: java gradle proguard j2objc

我试图让j2objc在gradle项目中运行我的一些仅Java模块。我正在使用j2objc的gradle插件,但我不相信这是任何问题的根源。该模块使用XMLUnit来检测输入文件中的差异。 XMLUnit包含一个类org.xmlunit.builder.JaxbBuilder,它由于没有看到j2objc中省略的一些javax类而导致转换失败,可能是因为它们无法转换。在任何情况下,我的代码都不使用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
}

我可以在日志中看到死代码参数已添加到命令行,但在执行中我看到:

  

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-快照sources.jar!组织/ XMLUnit测试/建设者/ 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:Marshaller无法解析为某种类型   错误:org / xmlunit / builder / JaxbBuilder.java:56:Marshaller无法解析为某种类型   错误:org / xmlunit / builder / JaxbBuilder.java:57:Marshaller无法解析为某种类型   错误:org / xmlunit / builder / JaxbBuilder.java:82:Marshaller无法解析为某种类型   错误:org / xmlunit / builder / JaxbBuilder.java:83:JaxbBuilder类型的方法createDefaultMarshaller()引用缺少的类型JAXBException   错误:org / xmlunit / builder / JaxbBuilder.java:87:JAXBSource无法解析为某个类型   错误:org / xmlunit / builder / JaxbBuilder.java:87:JAXBSource无法解析为某个类型   错误:org / xmlunit / builder / JaxbBuilder.java:87:Marshaller无法解析为某个类型   错误: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:绑定不匹配:类型为AnnotatedElement的泛型方法getAnnotation(Class)不适用于参数(Class)。推断类型XmlRootElement不是有界参数的有效替代   错误:org / xmlunit / builder / JaxbBuilder.java:103:XmlRootElement无法解析为某个类型   错误:org / xmlunit / builder / JaxbBuilder.java:106:来自JaxbBuilder类型的方法createJAXBElement(Object)引用缺少的类型JAXBElement   错误:org / xmlunit / builder / JaxbBuilder.java:108:来自JaxbBuilder类型的方法createInferredJAXBElement(Object)引用缺少的类型JAXBElement   错误:org / xmlunit / 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:Marshaller无法解析为某个类型   错误:org / xmlunit / builder / JaxbBuilder.java:126:Marshaller无法解析为某种类型   错误: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:来自JaxbBuilder类型的方法createJaxbElementFromObjectFactory(T)引用缺少的类型JAXBElement   错误:org / xmlunit / builder / JaxbBuilder.java:139:来自JaxbBuilder类型的方法createInferredJAXBElement(T)引用缺少的类型JAXBElement   错误:org / xmlunit / builder / JaxbBuilder.java:146:JAXBElement无法解析为某个类型   错误:org / xmlunit / builder / JaxbBuilder.java:156:JAXBElement无法解析为某个类型   错误:org / xmlunit / builder / JaxbBuilder.java:161:JAXBElement无法解析为某个类型   错误:org / xmlunit / builder / JaxbBuilder.java:174:无法解析Introspector

我认为它意味着它试图处理JaxbBuilder类。配置中是否存在我遗漏的内容?

1 个答案:

答案 0 :(得分:2)

j2objc的第一个翻译步骤是调用Eclipse Java编译器,因此需要解析死代码引用以便翻译器继续,即使具有这些引用的类稍后被死代码消除步骤删除。添加jar文件来解析javax.xml.bind类(如jaxb-api.jar)将清除大部分错误。

但是,java.beans.Introspector仍然存在问题,因为它不是Android API的一部分,j2objc的JRE支持基于Android源。由于此类及其引用将被删除,因此您可以尝试将JVM的rt.jar指定为转换程序的bootclasspath(-Xbootclasspath:flag)。翻译通常使用与j2objc的JRE库匹配的jar,因此会提前报告不支持的类。将JVM rt.jar指定为bootclasspath会使此错误检查失败,但允许解析不支持的类。

由于上述内容听起来很多,所以另一个选择是请求j2objc的gradle插件有一个排除选项,如:

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

j2objc团队的gradle插件与j2objc分开,但他们对这样的合理功能请求非常敏感。