java - 带有 Maven bundle 插件的 OSGi 未加载库

标签 java osgi bundle apache-felix maven-bundle-plugin

我正在开发一个大型应用程序,我们在代理中使用 Mavem bundle 插件来使其变小!我在导入一些所需的库来处理 PDFbox 所需的某种图像(jpeg2000 和 jbig2)时遇到问题。

这是我的 pom(其中一部分)

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

我修复了导入包,并且不再有警告!

> [信息] --- maven-bundle-plugin:2.3.7:bundle (default-bundle) @ proxy-bundle >!--- [警告] bundle com.riticsoftware.frontend:proxy-bundle:bundle:2.0.7 :没有 >! 找不到 com.github.jai-imageio 的匹配引用。* [警告] bundle com.riticsoftware.frontend:proxy-bundle:bundle:2.0.7 :没有 >! 找不到 com.levigo.jbig2.* 的匹配引用 [警告] bundle com.riticsoftware.frontend:proxy-bundle:bundle:2.0.7 :没有 >! 找不到 org.apache.pdfbox.cos 的匹配引用。*

这是我的方法,其中 pdfBox 使用这些库,我在 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;

}

在 IntelliJ 中调试时我得到了这个!

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

最佳答案

我看错问题了!问题不在于 JPEG2000/JBIG2 依赖项,而在于 javax.imageio.spi.ServiceRegistry,它与 OSGi 中的 ServiceLoder 没有问题,并且是从 PDFBox 调用的。如下所述:OSGi java.Util.ServiceLoader

所以我必须实现这个解决方案。 OSGi Aries spi-fly

关于java - 带有 Maven bundle 插件的 OSGi 未加载库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43493106/

相关文章:

java - OSGI 服务异常行为

php - 如何在 symfony 中重命名一个包?

java - 模型未在 Hibernate 中映射用于日期 SQL 查询

java - 数组数据文件操作

dependencies - 如何管理 OSGi 构建依赖项?

java - 调用抽象类@Activate方法(apache felix)

java - Android:在多个 Activity 上传递字符串数组

ruby - bundle 安装,如何避免使用源代码库

java - 使用 google 的 Firebase UI 身份验证失败并显示消息(代码 :10 message:10)

java - 如何实现自定义对象的 Compare to 方法