0

I´m working on a big application and we use Mavem bundle plug in in our proxy to make it small! I´m having problems importing some needed library for handling some kind of images (jpeg2000 and jbig2) needed by PDFbox.

Here is my pom (part of it)

<?xml version="1.0" encoding="UTF-8"?>

  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>xxxx</groupId>
    <artifactId>xxx</artifactId>
    <version>2.0.7</version>
</parent>

<artifactId>proxy-bundle</artifactId>
<name>Front-End Proxy Bundle</name>
<version>${proxy.version}</version>
<packaging>bundle</packaging>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<profiles>
    <profile>
        <id>compile-entity-schemas</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.jvnet.jaxb2.maven2</groupId>
                    <artifactId>maven-jaxb2-plugin</artifactId>
                    <version>0.8.3</version>
                    <executions>
                        <execution>
                            <id>entity-schemas</id>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                            <configuration>
                                <extension>true</extension>
                                <schemaDirectory>src/main/resources/schema</schemaDirectory>
                                <schemaIncludes>
                                    <schemaInclude>text-form-configuration.xsd</schemaInclude>
                                </schemaIncludes>
                                <generateDirectory>src/main/java</generateDirectory>
                                <generatePackage>xxx</generatePackage>
                                <args>
                                    <arg>-no-header</arg>
                                    <arg>-extension</arg>
                                </args>
                                <plugins>
                                    <plugin>
                                        <groupId>org.jvnet.jaxb2_commons</groupId>
                                        <artifactId>jaxb2-basics</artifactId>
                                        <version>0.6.4</version>
                                    </plugin>
                                </plugins>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

<build>
    <finalName>proxy-bundle</finalName>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>invalid_image.png</exclude>
                <exclude>bfa_logo.png</exclude>
                <exclude>footer_image.png</exclude>
                <exclude>check-front-image-template.jpg</exclude>
            </excludes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
            <includes>
                <include>invalid_image.png</include>
                <include>bfa_logo.png</include>
                <include>footer_image.png</include>
                <include>check-front-image-template.jpg</include>
            </includes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.3.7</version>
            <extensions>true</extensions>
            <executions>
                <execution>
                    <goals>
                        <goal>install</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <instructions>
                    <Import-Package>
                        org.apache.pdfbox;version="[0.0,3)",
                        org.apache.pdfbox.cos.*;version="[0.0,3)",
                        com.levigo.jbig2.*;version="[0.0,3)",
                        com.github.jaiimageio.jpeg2000.*;version="[0.0,3)",
                        com.github.jaiimageio.*;version="[0.0,3)",
                        org.apache.commons.configuration;version="[0.0,2)",
                        org.apache.commons.logging;version="[0.0,2)",
                        org.apache.commons.io.*;version="[0.0,3)",
                        org.slf4j;version="[0.0,2)",
                        org.apache.commons.jcs.*;version="[0.0,3)",
                        eu.bitwalker.useragentutils.*;version="[0.0,3)",
                        *
                    </Import-Package>
                    <Bundle-Activator>com.criticalsoftware.frontend.proxy.main.ProxyBundleActivator</Bundle-Activator>
                    <Bundle-ClassPath>.,{maven-dependencies}</Bundle-ClassPath>
                </instructions>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.zeroturnaround</groupId>
            <artifactId>jrebel-maven-plugin</artifactId>
             <version>${jrebel-maven-plugin.version}</version>
            <executions>
                <execution>
                    <id>generate-rebel-xml</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>xxx</groupId>
            <artifactId>jrebel-remote-maven-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <id>generate-rebel-remote-xml</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>remote-generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.17</version>
            <configuration>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings
                only. It has no influence on the Maven build itself. -->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>
                                        org.zeroturnaround
                                    </groupId>
                                    <artifactId>jrebel-maven-plugin</artifactId>
                                    <versionRange>
                                        [1.1.0,)
                                    </versionRange>
                                    <goals>
                                        <goal>generate</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
<dependencies>
    <!-- Dev Model -->
    <dependency>
        <groupId>xxx</groupId>
        <artifactId>jcc-core-common</artifactId>
    </dependency>

    <dependency>
        <groupId>xxx</groupId>
        <artifactId>jcu-core-utils-common</artifactId>
    </dependency>

    <!-- Web Server -->
    <dependency>
        <groupId>org.simpleframework</groupId>
        <artifactId>simple</artifactId>
    </dependency>

    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
    </dependency>

    <!-- Logging -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
    </dependency>

    <!-- Apache Commons -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
    </dependency>

    <!-- Serialization -->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
    </dependency>
    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jvnet.jaxb2_commons</groupId>
        <artifactId>jaxb2-basics-runtime</artifactId>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
    </dependency>

    <!-- Image Editing -->
    <dependency>
        <groupId>com.jhlabs</groupId>
        <artifactId>filters</artifactId>
    </dependency>
    <dependency>
        <groupId>xxx</groupId>
        <artifactId>image-detector-api</artifactId>
    </dependency>

    <!-- PDF -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox-tools</artifactId>
    </dependency>
    <dependency>
        <groupId>com.levigo.jbig2</groupId>
        <artifactId>levigo-jbig2-imageio</artifactId>
    </dependency>
    <dependency>
        <groupId>com.github.jai-imageio</groupId>
        <artifactId>jai-imageio-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.github.jai-imageio</groupId>
        <artifactId>jai-imageio-jpeg2000</artifactId>
    </dependency>

    <!-- OSGi -->
    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.osgi.core</artifactId>
    </dependency>

    <!-- Others -->
    <dependency>
        <groupId>com.sun.jna</groupId>
        <artifactId>jna</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-jcs-core</artifactId>
    </dependency>
    <!-- Necessary to fix parallel build when the maven repository is empty -->
    <dependency>
        <groupId>xxxs</groupId>
        <artifactId>xxx</artifactId>
        <version>${project.version}</version>
        <scope>compile</scope>
        <type>pom</type>
    </dependency>

    <!-- UA Utils -->
    <dependency>
        <groupId>eu.bitwalker</groupId>
        <artifactId>UserAgentUtils</artifactId>
    </dependency>

    <!-- test -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

I fixed the Import Package and i dont have The warnings anymore!

> [INFO] --- maven-bundle-plugin:2.3.7:bundle (default-bundle) @ proxy-bundle >!--- [WARNING] Bundle com.criticalsoftware.frontend:proxy-bundle:bundle:2.0.7 : Did >!not find matching referal for com.github.jai-imageio.* [WARNING] Bundle com.criticalsoftware.frontend:proxy-bundle:bundle:2.0.7 : Did >!not find matching referal for com.levigo.jbig2.* [WARNING] Bundle com.criticalsoftware.frontend:proxy-bundle:bundle:2.0.7 : Did >!not find matching referal for org.apache.pdfbox.cos.*

Here is my nethod where pdfBox uses those libraries and i get an exception inthe try/catch block!

private static boolean checkPDFImagesSize(PDDocument document) {
PDPageTree list = document.getPages();
PDXObject o;
for (PDPage page : list) {
    PDResources pdResources = page.getResources();
    for (COSName cosName : pdResources.getXObjectNames()) {
        try {
            o = pdResources.getXObject(cosName);
        } catch (IOException e) {
            throw ProxyRuntimeException.of(ExceptionCodes.ERROR_GENERATING_PDF_IMAGES);
        }
        if (o instanceof org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) {
            if (((PDImageXObject) o).getHeight() * ((PDImageXObject) o).getWidth() * ((PDImageXObject) o)
                    .getBitsPerComponent() * 3.0 > ALERT_IMAGE_SIZE_INSIDE_PDF) {
                return false;
            }
        }
    }
}
return true;

}

When debuging in IntelliJ i got this!

org.apache.pdfbox.filter.MissingImageReaderException: Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed

PcS
  • 38
  • 8
  • Do you get any import errors in Apache Felix Console (`/system/console/bundles`)? Are the imports you defined in the manifest satisfied? – Jens Apr 21 '17 at 15:45
  • Where can i check that!? But i don´t get any errors on compile, but in runtime, i get that exception! :( – PcS Apr 21 '17 at 17:11
  • You can check that in the Apache Felix Console that you find at `http://:/system/console/bundles`. There you can click on the bundle to see if all required classes could be imported. If not it will be shown to you. Look at the image in this question. It should look a lot like this: http://stackoverflow.com/q/43242977/190823 You probably have a very similar issue. – Jens Apr 21 '17 at 17:16
  • I cant access the console! Is there another way? :( – PcS Apr 21 '17 at 17:47
  • What is the error you get? Why can't you access the console? – Jens Apr 21 '17 at 17:48
  • i get an 404 error! – PcS Apr 21 '17 at 17:53
  • Did you use exactly the URL I posted above? You are supposed to replace the "domain" and "port" with the appropriate values! – Jens Apr 21 '17 at 17:54
  • Yes! of course i changed! :) – PcS Apr 21 '17 at 17:58
  • But how do you usually open the Apache Felix Admin? Did you try to access it through the Dispatcher? If so it might be blocked. Do you want to share the URL that you used? – Jens Apr 21 '17 at 18:02
  • I cant! :( I´m using a vm in my companies intranet! And i´m connected there! – PcS Apr 21 '17 at 18:05
  • Please try to find someone within your company that can help you access the Apache Felix Console and find out about the bundles imports. It is very hard to give you any help like this. – Jens Apr 21 '17 at 18:07
  • HI! I´ve installed the gogo console and the bundle are corectly installed and can be started! :( Still trying to figure out what is happening! 56|Active | 1|jai-imageio-jpeg2000-1.3.0 (1.3.0) 57|Active | 1|Java Advanced Imaging Image I/O Tools API core (standalone) (1.3.1) 58|Active | 1|levigo-jbig2-imageio-1.6.5 (1.6.5) 80|Installed | 1|Front-End Proxy Bundle (2.0.7.11) 81|Active | 1|Apache Felix Gogo Command (0.14.0) 82|Active | 1|Apache Felix Gogo Runtime (0.16.2) 83|Active | 1|Apache Felix Gogo Shell (0.10.0) – PcS Apr 24 '17 at 10:18

1 Answers1

1

I was looking at the wrong issue! The problem was not in the JPEG2000/JBIG2 dependencies but in the javax.imageio.spi.ServiceRegistry which has a none issue with ServiceLoder in OSGi and is called from PDFBox. As here is described: OSGi java.Util.ServiceLoader

So i had to implement this solution. OSGi Aries spi-fly

PcS
  • 38
  • 8