我遇到了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中时?
三江源
答案 0 :(得分: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>
其他一些系统已经在使用它,也许捆绑包也上传了。例如,ServiceMix已经将很多JAR重新打包为bundle,也许你可以找到它。在我检查中央的工件是否捆绑后,我用http://grepcode.com/检查。
当没有找到捆绑版本时,它可能是棘手的部分。一些工件易于osgify,因为那里没有类加载器魔法或反射,在这种情况下maven-shade插件可以用来重新打包作为OSGi包的依赖。 (在karaf你驾驶室使用包裹功能)
如果引导中的魔法非常不同而且可以呈现奇怪的问题,可以使用Dynamic-Import,Embed-Dependency,Required-Bunle和其他不太OSGi的方法。
我不推荐传递依赖嵌入。而不是确定需要哪些进口以及哪些是可选的。例如,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?