【问题标题】:Integrating external library into OSGI将外部库集成到 OSGI
【发布时间】:2017-03-20 10:30:58
【问题描述】:

我已经尝试解决这个问题好几天了,但我似乎不知何故被卡住了。我想开发一个 OSGi 包,我的实现需要一个外部库(它有更多的依赖项)。情况如下:我的项目正在使用 gradle,我得到了一个简单的代码 sn-p 来编译,但是当捆绑包启动时它在运行时崩溃(我正在使用 apache felix),给我一个抱怨未满足的依赖项的异常。但是所有库都存在于 jar 包中,我将它们添加到类路径中。缺少的包 org.ethereum.facade 列在 Private-Packages 中。 我阅读了很多类似问题的问题,但提出的解决方案似乎都没有解决我的问题。

我正在发布我的 gradle.build 文件

// ETHEREUM NODE
configurations.create('embed')
repositories {
  mavenLocal()
    mavenCentral()
    maven {
        url "http://dl.bintray.com/ethereum/maven"
     }
}
dependencies {
 // This will compile the openMuc Framework and place the result into the build classpath:
 compile project(':openmuc-core-api')
// This will place the etherum libraries into the classpath
    compile ("org.ethereum:ethereumj-core:latest.release")
    embed ("org.ethereum:ethereumj-core:latest.release")
}
jar {
    manifest {
        name = 'OpenMUC App - EthereumNode'
         instruction 'Bundle-ClassPath', 'lib/ethereumj-core-1.4.2-RELEASE.jar,.'
}
 into('lib') {
    from configurations.embed
  }
}

生成的罐子:

[MANIFEST openmuc-app-ethereumNode-0.16.0.jar]
Bnd-LastModified                         1490003658351                           
Bundle-ClassPath                         lib/ethereumj-core-1.4.2-RELEASE.jar,.  
Bundle-ManifestVersion                   2                                       
Bundle-Name                              OpenMUC App - EthereumNode              
Bundle-SymbolicName                      org.openmuc.framework.openmuc-app-ethereumNode
Bundle-Version                           0.16.0                                  
Created-By                               1.8.0_25 (Oracle Corporation)           
Export-Package                           org.openmuc.framework.app.ethereumNode;version="0.16.0";uses:="javax.xml.bind,org.osgi.service.component"
Import-Package                           javax.xml.bind,org.osgi.service.component;version="[1.2,2)",org.slf4j;version="[1.7,2)",org.ethereum.facade
Manifest-Version                         1.0                                     
Private-Package                          genesis,org.ethereum,org.ethereum.cli,org.ethereum.config,org.ethereum.config.blockchain,org.ethereum.config.net,org.ethereum.core,org.ethereum.core.genesis,org.ethereum.crypto,org.ethereum.crypto.cryptohash,org.ethereum.crypto.jce,org.ethereum.datasource,org.ethereum.datasource.inmem,org.ethereum.datasource.leveldb,org.ethereum.datasource.mapdb,org.ethereum.db,org.ethereum.db.index,org.ethereum.facade,org.ethereum.json,org.ethereum.jsonrpc,org.ethereum.listener,org.ethereum.manager,org.ethereum.mine,org.ethereum.net,org.ethereum.net.client,org.ethereum.net.dht,org.ethereum.net.eth,org.ethereum.net.eth.handler,org.ethereum.net.eth.message,org.ethereum.net.message,org.ethereum.net.p2p,org.ethereum.net.rlpx,org.ethereum.net.rlpx.discover,org.ethereum.net.rlpx.discover.table,org.ethereum.net.server,org.ethereum.net.shh,org.ethereum.net.submit,org.ethereum.net.swarm,org.ethereum.net.swarm.bzz,org.ethereum.samples,org.ethereum.solidity,org.ethereum.solidity.compiler,org.ethereum.sync,org.ethereum.trie,org.ethereum.util,org.ethereum.util.blockchain,org.ethereum.validator,org.ethereum.vm,org.ethereum.vm.program,org.ethereum.vm.program.invoke,org.ethereum.vm.program.listener,org.ethereum.vm.trace,lib
Require-Capability                       osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
Service-Component                        OSGI-INF/org.openmuc.framework.app.ethereumNode.EthereumNode.xml
Tool                                     Bnd-3.0.0.201509101326                  

[IMPEXP]
Import-Package
  javax.xml.bind                         
  org.ethereum.facade                    
  org.osgi.service.component             {version=[1.2,2)}
  org.slf4j                              {version=[1.7,2)}
Export-Package
  org.openmuc.framework.app.ethereumNode {version=0.16.0}

[USES]
org.openmuc.framework.app.ethereumNode   java.lang
                                         javax.xml.bind
                                         org.ethereum.facade
                                         org.osgi.service.component
                                         org.slf4j

[USEDBY]
java.lang                                org.openmuc.framework.app.ethereumNode
javax.xml.bind                           org.openmuc.framework.app.ethereumNode
org.ethereum.facade                      org.openmuc.framework.app.ethereumNode
org.osgi.service.component               org.openmuc.framework.app.ethereumNode
org.slf4j                                org.openmuc.framework.app.ethereumNode

[COMPONENTS]
OSGI-INF/org.openmuc.framework.app.ethereumNode.EthereumNode.xml
<?xml version="1.0" encoding="UTF-8"?>
<component name="org.openmuc.framework.app.ethereumNode.EthereumNode">
  <implementation class="org.openmuc.framework.app.ethereumNode.EthereumNode"/>
</component>


[LIST]
META-INF
  MANIFEST.MF extra='\uFFFD\uFFFD\u0000\u0000'
OSGI-INF
  org.openmuc.framework.app.ethereumNode.EthereumNode.xml
lib
  aopalliance-1.0.jar
  commons-codec-1.10.jar
  commons-collections4-4.0.jar
  commons-lang3-3.4.jar
  commons-logging-1.2.jar
  config-1.2.1.jar
  core-1.53.0.0.jar
  ethereumj-core-1.4.2-RELEASE.jar
  guava-16.0.1.jar
  jackson-annotations-2.5.0.jar
  jackson-core-2.5.1.jar
  jackson-core-asl-1.9.13.jar
  jackson-databind-2.5.1.jar
  jackson-mapper-asl-1.9.13.jar
  java-util-1.8.0.jar
  javassist-3.15.0-GA.jar
  json-io-2.4.1.jar
  json-simple-1.1.1.jar
  jsr305-3.0.0.jar
  leveldb-0.7.jar
  leveldb-api-0.7.jar
  leveldbjni-all-1.18.3.jar
  logback-classic-1.1.7.jar
  logback-core-1.1.7.jar
  mapdb-2.0-beta12.jar
  netty-all-4.0.30.Final.jar
  prov-1.53.0.0.jar
  slf4j-api-1.7.20.jar
  solcJ-all-0.4.8.jar
  spring-aop-4.2.0.RELEASE.jar
  spring-beans-4.2.0.RELEASE.jar
  spring-context-4.2.0.RELEASE.jar
  spring-core-4.2.0.RELEASE.jar
  spring-expression-4.2.0.RELEASE.jar
  spring-jdbc-4.2.0.RELEASE.jar
  spring-orm-4.2.0.RELEASE.jar
  spring-tx-4.2.0.RELEASE.jar
org
org/openmuc
org/openmuc/framework
org/openmuc/framework/app
org/openmuc/framework/app/ethereumNode
  EthereumNode.class

加载包时遇到的异常:

ERROR: Bundle org.openmuc.framework.openmuc-app-ethereumNode [3] Error starting file:/Volumes/UserData/Documents/FH/MasterThesis_MatthiasPosch/java/openmuc/framework/bundle/openmuc-app-ethereumNode-0.16.0.jar (org.osgi.framework.BundleException: Unable to resolve org.openmuc.framework.openmuc-app-ethereumNode [3](R 3.0): missing requirement [org.openmuc.framework.openmuc-app-ethereumNode [3](R 3.0)] osgi.wiring.package; (osgi.wiring.package=org.ethereum.facade) Unresolved requirements: [[org.openmuc.framework.openmuc-app-ethereumNode [3](R 3.0)] osgi.wiring.package; (osgi.wiring.package=org.ethereum.facade)])
org.osgi.framework.BundleException: Unable to resolve org.openmuc.framework.openmuc-app-ethereumNode [3](R 3.0): missing requirement [org.openmuc.framework.openmuc-app-ethereumNode [3](R 3.0)] osgi.wiring.package; (osgi.wiring.package=org.ethereum.facade) Unresolved requirements: [[org.openmuc.framework.openmuc-app-ethereumNode [3](R 3.0)] osgi.wiring.package; (osgi.wiring.package=org.ethereum.facade)]
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4112)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2118)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1372)
    at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
    at java.lang.Thread.run(Thread.java:745)

所以似乎所有库都在 lib 文件夹中,但捆绑包仍然不起作用。我尝试使用代码,但是对包含的库(例如 spring)的任何引用都会导致类似的异常。为什么?

【问题讨论】:

  • 如果您需要更多外部依赖项,最好的方法是创建一个包含这些依赖项的目标平台...
  • 我不确定,你说的目标平台是什么意思?

标签: java maven gradle osgi ethereum


【解决方案1】:

我的解决方案是使用 osgi-run 插件代替原来的 osgi 插件。将我的依赖项声明为 SystemLibrary systemLib ("org.ethereum:ethereumj-core:1.2.0-RELEASE") 解决了问题,并且我能够使用该库而不会出现异常和错误。

【讨论】:

    【解决方案2】:

    在您的清单中,您导入包org.ethereum.facade。这只有在还有一个包导出这个包的情况下才有效。如果包是纯内部包,那么你应该将它设置为私有包而不是导入它。

    如果可能从外部需要该包,请确保您的包中有一个导入和导出。如果您没有手动配置导入,那么由于某种原因,构建似乎认为您需要它,并且它不在您的包中本地存在。

    如何创建清单?您为此使用 bnd 吗?如果是,那么它可能无法识别捆绑类路径中的手动更改。

    【讨论】:

    • 清单是使用 gradle osgi-plugin 创建的,它使用 bnd。 org.ethereum.facade 列在私有包和导入包中。
    • 嗯..私有和导入没有意义。如果一个包是私有的,那么它不应该被导入。
    • 难道我使用嵌入的方法是错误的?
    • 可能。我不知道如何在 cradle 中做到这一点,但在 maven 中嵌入是作为 maven-bundle-plugin 的参数完成的。也许在 gradle OSGi 插件中有类似的东西。
    • 我找到了一种解决方法,但它仍然无法正常工作。我查找了 gradle 将创建的 Import-Package 语句,复制了该语句并删除了 org.ethereum.facade 引用。 instruction 'Import-Package','javax.xml.bind,org.osgi.service.component;version="[1.2,2)",org.slf4j;version="[1.7,2)"'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2023-03-10
    • 2018-06-24
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多