2012-04-25 25 views
6

Estoy utilizando una gran biblioteca de código abierto y necesito generar subclases personales de algunas de las clases. ¿Cuáles son las mejores estrategias? Me gustaría mantener la biblioteca original inalterada y ser fácilmente capaz de reconfigurar cuando se actualice. Es poco probable que mi código valga la pena contribuir al proyecto (aunque me complace escribir de una manera que lo permita).subclases de una biblioteca de código abierto

El problema es general pero lo ilustraré con mi ejemplo. Estoy usando Apache PDFBox que tiene una rutina para escribir en java.awt.Graphics2D. He reemplazado esto por el kit de herramientas Apache Batik que proporciona una subclase de Graphics2D (org.apache.batik.svggen.SVGGraphics2D) para que pueda capturar la representación SVG. Puedo crear una instancia

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); 
    } 

El lugar donde PDFBox utiliza los gráficos es org.apache.pdfbox.PDFReader que he editado para permitir que los nuevos gráficos:

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(); 
    } 
} 

he conseguido que funcione (que no es el problema) . Mi preocupación es que he tenido que hackear/editar y volver a compilar varias clases de PDFBox distribuidas simplemente para generar y usar la subclase. Terminé con clases como PMRPDFReader en los mismos paquetes que la biblioteca. Es muy complicado: no recuerdo de inmediato dónde hice las ediciones, etc.

Creo que debería poder utilizar la biblioteca tal como está y simplemente agregar/vincular mis subclases. Uso maven así que tal vez haya una manera de excluir las clases originales.

Respuesta

1

Así es como me gustaría hacer esto:

  • Crear un proyecto independiente que contiene los cambios en el código fuente. Verifíquelo en el código fuente/control de revisión (SVN, Git, lo que sea que esté usando). Este proyecto solo contendrá tus cambios.
  • Asegúrate de que sea un proyecto de Maven. Use el mismo número de versión que el proyecto original de código abierto, pero agregue un apéndice a la versión. Si está utilizando la versión 1.2, cree su proyecto para tener la versión 1.2-Peter-1 o algo similar. De esta forma, siempre sabrá en qué versión se basa, también puede proporcionar múltiples versiones/revisiones de sus cambios. Tampoco entrará en conflicto con las versiones oficiales. Use los mismos ID de grupo/artefacto que los oficiales.
  • Utilice el proyecto original como una dependencia propia.

Para el despliegue, a continuación, tiene dos opciones:

+0

+1 sugerencias útiles –

1

Si la biblioteca no ha proporcionado ganchos de subclase fáciles, entonces no tiene muchas opciones. Dado que tienen un espejo git, simplemente lo bifurcaría (mantén tu espejo en un lugar seguro y con una copia de seguridad, preferiblemente muy cerca de tu SCM normal). Mi estrategia habitual es adjuntar -companyName al número de versión (en Maven) para que pueda recordar que es una versión parchada. Puede ver fácilmente las ediciones que hizo, ya que estarán en su historial de revisiones.

También puede investigar el uso del plugin maven shade para alterar/reemplazar las clases, pero eso es un poco más complicado en mi humilde opinión.

+0

, gracias. Claramente esperan que la gente haga una subclase pero no he visto ganchos claros (interfaces, inyección de dependencia, etc.) –

+0

Es posible que estén bastante dispuestos a aceptar sus parches si solo son para crear los ganchos, entonces. – artbristol

+0

Cuando lo tengo trabajando ordenadamente lo mencionaré en su lista –

Cuestiones relacionadas