如何修改类文件?

时间:2011-09-20 18:33:16

标签: java

我正在eclipse中处理这个项目,我已经为PDFBOX添加了这个maven依赖项

Maven dependency

    <dependency>
      <groupId>org.apache.pdfbox</groupId>
      <artifactId>pdfbox</artifactId>
      <version>1.6.0</version>
    </dependency>

我在某些pdf文件中收到错误:

Parsing Error, Skipping Object
java.io.IOException: expected='endstream' actual='' org.apache.pdfbox.io.PushBackInputStream@1b8d77fe
    at org.apache.pdfbox.pdfparser.BaseParser.parseCOSStream(BaseParser.java:439)
    at org.apache.pdfbox.pdfparser.PDFParser.parseObject(PDFParser.java:552)
    at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:184)
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1088)
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1053)
    at org.apache.tika.parser.pdf.PDFParser.parse(PDFParser.java:74)
    at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:197)
    at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:197)
    at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:135)
    at org.apache.tika.Tika.parseToString(Tika.java:357)
    at edu.uci.ics.crawler4j.crawler.BinaryParser.parse(BinaryParser.java:37)
    at edu.uci.ics.crawler4j.crawler.WebCrawler.handleBinary(WebCrawler.java:223)
    at edu.uci.ics.crawler4j.crawler.WebCrawler.processPage(WebCrawler.java:460)
    at edu.uci.ics.crawler4j.crawler.WebCrawler.run(WebCrawler.java:129)
    at java.lang.Thread.run(Thread.java:662)

所以当我google它时,我发现BaseParser.java文件中有一些错误,所以他们只为这个java文件提供了补丁(https://issues.apache.org/jira/browse/PDFBOX-195)。所以我的问题是如何修改这个仅限java文件..我可以在eclipse中看到BaseParser.class文件,因为我已经附加了PDFBOX-Issue的源文档。任何建议将不胜感激。

3 个答案:

答案 0 :(得分:0)

你可以:

  • 创建子类手册(并在可能的情况下使用它)
  • 下载源代码,修复它,重新编译,最后在jar中覆盖它
  • 以编程方式创建子类(使用cglib或asm)
  • 只下载BasicParser,模拟所有依赖(只需用need方法创建空类文件),重新编译并放入jar(或者./ext ./endorsed dir in jvm,如果你愿意的话)

答案 1 :(得分:0)

通常,不直接修改类文件,他们下载源代码,然后使用javac重建类文件。是的,可以修改类文件而不做这样的事情;但是,补丁文件通常不是二进制补丁文件,它们通常是源代码补丁文件。

Stefanglase已经提到您正在使用的版本应该应用补丁,但最近的更改很可能会重新引入该问题。你可能想要在深入研究之前验证你没有解决错误的问题。

在您真正想要修改二进制文件的极少数情况下,可以使用十六进制编辑器或简称为hexeditor打开它。基本上,这允许您将文件中的任何字节设置为任何值,这意味着您必须非常了解文件的内部格式,允许/禁止的内容以及如何进行实际实现预期行为的允许更改。简而言之,您将手动完成编译器的工作。

可以这样做,但这种任务通常需要大量的知识,而且很少有人拥有这些知识,因此学习知识并成功实施变革的成本可能远高于重建可用的补丁来源。即使是在已经存在的一般原理和技术知识的情况下成功实施变更的成本,也无法确定地说,而不是使用补丁源重建整个库的成本。

祝你好运。

答案 2 :(得分:0)

鉴于BaseParser.java是一个Apache文件,绝对没有理由不下载源代码,进行更改并重新编译它。我以前用Apache代码做过这个。这是非常直接的,只花了我几分钟。请记住将修复程序提交给Apache,以便将其包含在发行版中。