在OSGI包中使用AWS加密库时出错

时间:2017-02-27 03:49:01

标签: maven encryption amazon-dynamodb karaf karaf-maven-plugin

我正在尝试在我的karaf OSGI服务中使用AWS加密“DirectKmsMaterialProvider”,但它正在抛出classnotfound异常:

引起:java.lang.ClassNotFoundException:com_amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException找不到wrap_file__Users_rioortizr_.m2_repository_com_amazonaws_aws-dynamodb-encryption-java_1.11.0_aws-dynamodb-encryption-java-1.11.0.jar [2404]     在org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574)     在org.apache.felix.framework.BundleWiringImpl.access $ 400(BundleWiringImpl.java:79)     在org.apache.felix.framework.BundleWiringImpl $ BundleClassLoader.loadClass(BundleWiringImpl.java:2018)     在java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.8.0_51]     ......还有45个

我已经在pom.xml和features.xml

中添加了我的依赖项

在我的pom ......

 <dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-dynamodb</artifactId>
    <version>1.11.0</version>
 </dependency>
 <dependency>
     <groupId>com.amazonaws</groupId>
     <artifactId>aws-dynamodb-encryption-java</artifactId>
     <version>1.11.0</version>
</dependency>

在features.xml中......

<bundle>wrap:mvn:com.amazonaws/aws-dynamodb-encryption-java/1.11.0</bundle>
<bundle>wrap:mvn:com.amazonaws/aws-java-sdk-dynamodb/1.11.0</bundle>

我在这里遗漏了什么吗?

由于

此致 力

2 个答案:

答案 0 :(得分:0)

似乎aws-dynamodb-encryption-java包在他的清单文件导入时没有com.amazonaws.services.dynamodbv2.datamodeling包,这经常发生在wrap中。

要解决这个问题,您可以像servicemix一样操作依赖关系,这样做可以手动控制和修复导入导出。例如:https://github.com/apache/servicemix-bundles

答案 1 :(得分:0)

不是OSGi捆绑的JAR作为OSGI项目的依赖关系可能是背后真正的痛苦。在花了很多时间试图解决通过Karaf的wrap deployer部署的JAR引起的类路径问题之后,我将其默认设置为将非OSGi依赖项嵌入到我自己的bundle中。查看有关不同选项的bundle plugin documentation。举一个简单的例子,看一下这个SO thread的接受答案。

虽然嵌入依赖项解决了很多问题,但它带来了一些令人头痛的问题。一个是您正在膨胀自己的捆绑包,并且您无法在多个捆绑包之间共享这些依赖关系。另一个原因是常规JAR通常带有大量的包导入,这些导入在运行时或仅在某些使用场景中不需要,并且也不是由它们的传递Maven依赖项提供的。为了控制捆绑包的大小,您需要清除所有这些依赖关系并禁止将这些包添加到您自己的捆绑包的MANIFEST中。在引用的示例中,我可以排除9个包。在我的“嵌入最重”的包中,这个列表包含大约70个包(用于嵌入Titan图库及其依赖项)。