我试图让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
类。配置中是否存在我遗漏的内容?
答案 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分开,但他们对这样的合理功能请求非常敏感。