0

我试图让 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
}

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

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:

我解释为它试图处理JaxbBuilder课程。配置中有我遗漏的东西吗?

4

1 回答 1

2

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

不过,java.beans.Introspector 仍然是一个问题,因为它不是 Android API 的一部分,而且 j2objc 的 JRE 支持基于 Android 源。由于此类及其引用将被删除,您可以尝试将 JVM 的 rt.jar 指定为翻译器的引导类路径(-Xbootclasspath: 标志)。翻译通常使用与 j2objc 的 JRE 库匹配的 jar,因此会提前报告不支持的类。将 JVM rt.jar 指定为引导类路径会破坏此错误检查,但允许解析不受支持的类。

由于上述听起来工作量很大,您可以选择的另一个选项是要求 j2objc 的 gradle 插件有一个排除选项,例如:

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

j2objc 团队的 gradle 插件与 j2objc 是分开的,但它们对此类合理的功能请求非常敏感。

于 2015-10-13T17:47:30.930 回答