java - 子类化一个开源库

标签 java maven open-source subclass

我正在使用一个大型开源库,需要生成其中几个类的个人子类。什么是最好的策略?我想保持原始库不变,并且在更新时能够轻松地重新配置。我的代码不太可能值得为该项目做出贡献(尽管我很乐意以允许这样做的方式编写代码)。

这个问题是一个普遍的问题,但我会用我的例子来说明它。我正在使用 Apache PDFBox它有一个写入 java.awt.Graphics2D 的例程。我已将其替换为 Apache Batik提供 Graphics2D 子类的工具包 (org.apache.batik.svggen.SVGGraphics2D),因此我可以捕获 SVG 表示。我创建一个实例

public static org.apache.batik.svggen.SVGGraphics2D createSVG() {
    org.w3c.dom.DOMImplementation domImpl =
    org.apache.batik.dom.GenericDOMImplementation.getDOMImplementation();
        org.w3c.dom.Document document = 
            domImpl.createDocument("http://www.w3.org/2000/svg", "svg", null);
        return new org.apache.batik.svggen.SVGGraphics2D(document);
    }

PDFBox 使用图形的地方是 org.apache.pdfbox.PDFReader,我已对其进行编辑以允许使用新图形:

    protected void showPage(int pageNumber)
{
    try 
    {
        PageDrawer drawer = new PageDrawer();
        PageWrapper wrapper = new PageWrapper( this );
        PDPage page = (PDPage)pages.get(pageNumber);
        wrapper.displayPage( page );
        PDRectangle cropBox = page.findCropBox();
        Dimension drawDimension = cropBox.createDimension();
        svg = PDFPagePanel.createSVG();          // MY EDIT!!!!!!!!!
        drawer.drawPage( svg, page, drawDimension );
        writeSVG(pageNumber);
    }
    catch (IOException exception)
    {
        exception.printStackTrace();
    }
}

我已经让它工作了(这不是问题所在)。我担心的是,我不得不破解/编辑和重新编译许多分布式 PDFBox 类,只是为了生成和使用子类。我最终在与库相同的包中得到了诸如 PMRPDFReader 之类的类。它非常困惑 - 我无法立即记住我在哪里进行了编辑等。

我觉得我应该能够按原样使用库并简单地添加/链接我的子类。我使用 Maven,所以也许有一种方法可以排除原始类。

最佳答案

这是我将如何做到这一点:

  • 创建一个包含您的源代码更改的单独项目。将其 checkin 源代码/修订控制(SVN、Git,无论您使用什么)。该项目将仅包含您的更改。
  • 确保它是一个 Maven 项目。使用与原始开源项目相同的版本号,但为版本添加一个附录。如果您使用的是 1.2 版本,请创建您的项目以使用 1.2-Peter-1 或类似版本。这样,您将始终知道它基于哪个版本,您还可以提供更改的多个版本/修订版。它也不会与官方版本冲突。使用与官方 ID 相同的组/Artifact ID。
  • 将原始项目用作您自己的依赖项。

对于部署,您有两个选择:

关于java - 子类化一个开源库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10312124/

相关文章:

java - maven 发布 -> 对等端未经过身份验证

google-app-engine - 有没有办法在 AppEngine 上运行 OpenBravo?

java - 如何在 spring boot 应用程序中使用 spring-rabbit 处理 JSON 消息?

java - Spring配置到底是什么意思?

maven - 无法部署 Artifact :无法传输 Artifact com.foo.bar::jar:从/到中央 (http://):管道损坏

java - java中pom.xml文件有什么用?

open-source - Moncaì 将依赖哪些工具/堆栈?

open-source - 使用具有 "reciprocal public license 1.5"的项目意味着我必须处理我的代码吗?

java - 在 Neo4j Web 界面上看不到使用 EmbeddedJava 程序创建的节点

java - Java 许可证 header 的注释样式