java - 使用 gcj 编译的 java 和 XStream。 (异常 : Cannot create XmlPullParser)

标签 java xstream xmlpullparser compiled gcj

我正在增强一个客户,这是一个更大项目的一部分。由于缺乏速度,我被迫切换到 CNI,因此我不得不使用 GNU-gcj 编译器 (gnu 4.6.3) 生成 native 代码。

编译和链接工作正常(感谢 -findirect-dispatch 标志)并且我在执行输出时没有任何问题。 但是当客户端和服务端通信的时候,客户端马上就断开了。原因:

[XStreamClient Reader] WARN - Client disconnected (Exception: com.thoughtworks.xstream.io.StreamException: Cannot create XmlPullParser)

(此异常仅出现在客户端的 gcj 编译版本中。当我使用 java 解释器运行代码时 - 一切正常(但太慢^^)) --> 具有挑战性的部分是我无法检索发生此异常的源代码,因为它位于客户端使用的预编译(Java 类文件)库中。 (而且我无法联系到那个图书馆的作者)

我猜图书馆调用了 XppReader然后尝试创建 XmlPullParser 类并失败。

我绑定(bind)到 XStream(版本 1.4.3)库(和其他所需的 *.jars),方法是解压它们并编译创建的 *.class 文件,然后链接目标文件。这似乎也适用于所有其他图书馆。 (我的操作系统=Ubuntu)

我已经做了什么来克服这个问题: 我用谷歌搜索了 XStream/XmlPullParser 和 gcj,并用不同版本替换了“xmlpull”和“kxml2”文件。 但没有任何效果。 你们中有人知道可能的解决方案吗?

编辑:

我发现XmlPullParser创建失败的原因是XmlPullParserFactory.newInstance函数找不到/services/org.xmlpull.v1.XmlPullParserFactory文件所在的META-INF目录。 这是因为我只编译和链接了 *.jar 的 *.class 文件。 因此,一旦我找到将 META-INF 目录链接到可执行文件的方法,该函数就可以找到并访问它,问题就应该解决了。 你们中有人知道这样做的方法吗?

最佳答案

我认为 xmlpull 需要一个可以使用 xpp3 作为其实现的实现。 请将以下代码添加到您的 pom.xml 中,如果需要,将这些 jar 文件添加到需要它们的软件中。

<dependency>
    <groupId>xmlpull</groupId>
    <artifactId>xmlpull</artifactId>
    <version>1.1.3.1</version>
</dependency>
<dependency>
    <groupId>xpp3</groupId>
    <artifactId>xpp3</artifactId>
    <version>1.1.3.3</version>
</dependency>

关于java - 使用 gcj 编译的 java 和 XStream。 (异常 : Cannot create XmlPullParser),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12998222/

相关文章:

java - PDFormX对象处理

java - 使用 xstream 自定义 java 集合的序列化

java - 如何使用 XStream(部分)反序列化有错误的 xml

android - 从 Android 网络服务器下载 XML 文件

android - 使用 xmlpullparser 解析类似 html 的文档?

java - c :forEach loop using direct index versus attributes var and varStatus?

java - 如果代码中有特定子字符串,则删除完整的数组列表元素

java - 使用 xstream 将 XML 文件转为 ArrayList java 错误

android - 如何为 AttributeSet 正确编写 XML?

java - Swagger UI 显示,但我得到一个 "ERROR"指示器