0

I am trying to use an open source tool built on Batik and I am running into trouble with one of the dependencies when I try to build it. Pretty sure this is something to do with classpaths and library locations, but I can't figure out what is happening.

So the project I am working with ( SVG2EMF ) is using the FreeHep EMF Driver, which in turn uses the FreeHep GraphicsIO project. Because these three have not been playing nicely on my system ( Ubuntu 14.04 ) I've downloaded the source for all three to try and step through the problem.

Everything builds correctly and I can step through the code successfully, but the unit tests on SVG2EMF fail at the point where the EMF Driver makes a call to something from GraphicsIO- the relevant parts of the code in question is here:

import org.freehep.graphicsio.ImageGraphics2D;
import org.freehep.graphicsio.ImageConstants;
// ...snip...

public class AlphaBlend extends EMFTag implements EMFConstants 
{

// ...snip...

public void write(int tagID, EMFOutputStream emf) throws IOException 
   {
        emf.writeRECTL(bounds);
        emf.writeLONG(x);
        emf.writeLONG(y);
        emf.writeLONG(width);
        emf.writeLONG(height);
        dwROP.write(emf);
        emf.writeLONG(xSrc);
        emf.writeLONG(ySrc);
        emf.writeXFORM(transform);
        emf.writeCOLORREF(bkg);
        emf.writeDWORD(usage);
        emf.writeDWORD(size); // bmi follows this record immediately
        emf.writeDWORD(BitmapInfoHeader.size);
        emf.writeDWORD(size + BitmapInfoHeader.size); // bitmap follows bmi

        emf.pushBuffer();

        int encode;
        // plain
        encode = BI_RGB;
        ImageGraphics2D.writeImage(
            (RenderedImage) image,
            ImageConstants.RAW.toLowerCase(),
            ImageGraphics2D.getRAWProperties(bkg, "*BGRA"),
            new NoCloseOutputStream(emf));

        // emf.writeImage(image, bkg, "*BGRA", 1);
        // png
        //  encode = BI_PNG;
        // ImageGraphics2D.writeImage(image, "png", new Properties(), new
        // NoCloseOutputStream(emf));
        // jpg
        // encode = BI_JPEG;
        // ImageGraphics2D.writeImage(image, "jpg", new Properties(), new
        // NoCloseOutputStream(emf));
        int length = emf.popBuffer();

        emf.writeDWORD(length);
        emf.writeLONG(image.getWidth());
        emf.writeLONG(image.getHeight());

        BitmapInfoHeader header = new BitmapInfoHeader(image.getWidth(), image
                .getHeight(), 32, encode, length, 0, 0, 0, 0);
        bmi = new BitmapInfo(header);
        bmi.write(emf);

        emf.append();
    }

This throws a NoClassDefFoundError specifically relating to org.freehep.graphicsio.ImageGraphics2D on that writeImage call. When I step through in the debugger, a watch on ImageConstants.RAW has the value of Unknown type "org.freehep.graphicsio.ImageConstants" even though the application built quite happily with those references. Any references to ImageGraphics2D behave in exactly the same way.

The dependency in the SVG2EMF pom.xml looks like this:

<dependencies>
  <!-- some other dependencies -->
        <dependency>    
           <groupId>org.freehep</groupId>
           <artifactId>freehep-graphicsio-emf</artifactId>
           <version>2.1.1</version>
       </dependency>
</dependencies>

Dependency from the FreeHEP EMF Driver looks like this:

 <dependencies>
  <!-- necessary because transitive deps seem to go above inhertied deps -->
      <dependency>
        <groupId>org.freehep</groupId>
        <artifactId>freehep-util</artifactId>
        <version>2.0.2</version>
      </dependency>
    <dependency>
      <groupId>org.freehep</groupId>
      <artifactId>freehep-graphicsio</artifactId>
      <version>2.1.1</version>
    </dependency>
    <!-- Other dependencies -->
 </dependencies>

Can anybody shed any light on what is actually going on here or what I need to be doing in order to enable this to work?

EDIT: I think I have found where the problem is coming from- way down the StackTrace I see a "Caused by: ExceptionInInitializerError" - which appears to mark the class as inaccessible from then on. So the dependency does exist, but an exception is being thrown by the initializer which causes the JRE to mark it as unusable.

Further Edit: To solve these problems it can be useful ( although it is not mentioned anywhere on the freehep.org website ) to know that the project is now hosted on Github so you can find newer versions from there. In my case going straight to the latest version solved the problem.

glenatron
  • 11,018
  • 13
  • 64
  • 112
  • Just by a quick look at your question: Is your IDE aware of the required dependencys (e.g. in Eclipse they must occur in the projects build path) because if you run your JUnits from an IDE it will provide the IDEs classpath. – JBA Oct 23 '14 at 10:45
  • Netbeans follows the first dependency step ( from SVG2EMF to Freehep EMF driver ) presumably from the `pom.xml` configuration file - adding the dependency from the EMF driver to the library containing the Graphics2D class in the SVG2EMF project configuration does not appear to change things. – glenatron Oct 23 '14 at 11:10

0 Answers0