找到要包含在pom依赖项中的正确捆绑包的过程是什么?

时间:2017-01-29 17:22:33

标签: maven osgi bundle

我遇到了karaf中未解决的错误的问题。

<Embed-Dependency>!org.osgi.core,*,</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>

所以几乎所有东西都被放入bundle-classpath。但是,当我部署到karaf时,我发现一些软件包丢失并且未解决。 我没有提到任何依赖关系&#34;提供&#34;

一些未解决的软件包是:

javax.wsdl.extensions

org.relaxng.datatype

如何确定要在我的pom中包含哪些maven依赖来解决这个问题?

另外,为什么这些仍然显示为未解决的,当我将包括传递作为指令的所有内容嵌入到maven中时?

三江源

2 个答案:

答案 0 :(得分:1)

默认情况下这是一个复杂的问题。

  1. JDK中是否包含缺少的包?因为如果它可能你必须为容器配置中定义缺少包的OSGi容器定义:

    org.osgi.framework.system.packages = \
        javax.accessibility,\
        javax.activity,\
        javax.crypto,\
        javax.crypto.interfaces,\
        …
        javax.wsdl.extensions,\
        org.xml.sax.helpers
    

    或者它可以定义为系统扩展束,它是一个特殊的片段束。 (使用maven bundle插件的示例)

        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <forceCreation>true</forceCreation>
                <archive>
                    <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
                    <manifestEntries>
                        <Export-Package>com.sun.image.codec.jpeg</Export-Package>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <executions>
                <execution>
                    <id>bundle-manifest</id>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>manifest</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <instructions>
                    <Fragment-Host>system.bundle; extension:=framework</Fragment-Host>
                </instructions>
            </configuration>
        </plugin>    
    
  2. 其他一些系统已经在使用它,也许捆绑包也上传了。例如,ServiceMix已经将很多JAR重新打包为bundle,也许你可以找到它。在我检查中央的工件是否捆绑后,我用http://grepcode.com/检查。

  3. 当没有找到捆绑版本时,它可能是棘手的部分。一些工件易于osgify,因为那里没有类加载器魔法或反射,在这种情况下maven-shade插件可以用来重新打包作为OSGi包的依赖。 (在karaf你驾驶室使用包裹功能)

  4. 如果引导中的魔法非常不同而且可以呈现奇怪的问题,可以使用Dynamic-Import,Embed-Dependency,Required-Bunle和其他不太OSGi的方法。

  5. 我不推荐传递依赖嵌入。而不是确定需要哪些进口以及哪些是可选的。例如,JUnit测试包含在JAR中,但它不是必需的,但是当您使用传递嵌入时,他将包含整个JUnit。例如,包的maven包插件的make指令的Instrad:

    Import-Package: org.junit.*;resolution:=optional```
    

    Import-Pacage: !org.junit*
    

    因此,如您所见,提出了许多可能的解决方案,并且没有针对该问题的最终解决方案,因此存在很多因素。

答案 1 :(得分:0)

逐一尝试这些:
1.确保包含这些包的jar以karaf部署并处于活动状态。 2.未解决的软件包在Import-Package下添加到pom中。

参考:How to handle Import-Package entries which come from jars on the Bundle-Classpath?