2017-04-19 49 views
0

我正在開發一個大型應用程序,我們在代理中使用了Mavem bundle插件,以使它變得更小!導入一些需要的庫來處理PDFbox所需的某些圖像(jpeg2000和jbig2)時遇到問題。帶有Maven bundle插件的OSGi不加載庫

這裏是我的聚甲醛(一部分)

<?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> 

我固定的導入包和我沒有這些警告了!

> [INFO] --- maven-bundle-plugin:2.3.7:bundle(default-bundle)@ proxy-bundle>!--- [警告] Bundle com.criticalsoftware.frontend:proxy-bundle:bundle:2.0.7:Did>!找不到與com.github.jai-imageio相匹配的參考資料。* [警告] Bundle com.criticalsoftware.frontend:proxy-bundle:bundle: 2.0.7:是否>找不到與com.levigo.jbig2相匹配的referal * [警告] Bundle com.criticalsoftware.frontend:proxy-bundle:bundle:2.0.7:>沒有找到與org匹配的referal。 apache.pdfbox.cos。*

這是我的方法,其中pdfBox使用這些庫我在try/catch塊中得到一個異常!

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; 

}

當的IntelliJ調試運行我得到這個!

org.apache.pdfbox.filter.MissingImageReaderException:無法讀取JPEG2000圖像:Java高級圖像(JAI)圖像I/O工具未安裝

+0

在Apache Felix Console('/ system/console/bundles')中是否有任何導入錯誤?您在清單中定義的進口是否滿意? – Jens

+0

我在哪裏可以檢查!?但是我不會在編譯時遇到任何錯誤,但是在運行時,我得到了這個異常! :( – PcS

+0

你可以在http:// /system/console/bundles找到的Apache Felix控制檯中檢查,你可以點擊這個包來查看是否可以導入所有需要的類。不是它會顯示給你,看看這個問題中的圖像,它應該看起來很像這樣:http://stackoverflow.com/q/43242977/190823你可能有一個非常類似的問題 – Jens

回答

1

我一直在尋找在錯誤的問題!問題不在於JPEG2000/JBIG2依賴關係,而在於javax.imageio.spi.ServiceRegistry,它與OSGi中的ServiceLoder沒有任何問題,並且是從PDFBox中調用的。如下所述:OSGi java.Util.ServiceLoader

所以我不得不實施這個解決方案。 OSGi Aries spi-fly