2017-03-20 100 views
0

我一直在试图解决这个问题好几天了,但我似乎卡住了某种方式。我想开发一个OSGi包,并且我的实现需要一个外部库(具有更多的依赖关系)。情况如下:我的项目使用gradle,并且我有一个简单的代码片段进行编译,但是在运行时崩溃(我使用apache felix),给我一个抱怨未满足的依赖的异常。但是所有的库都存在于jar包中,我将它们添加到classpath中。缺少的软件包org.ethereum.facade被列在Private-Packages中。 我读了很多类似问题的问题,但没有一个提议的解决方案似乎解决了我的问题。将外部库集成到OSGI

我张贴我的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)的任何引用都会导致类似的异常。为什么?

+0

如果你需要更多的外部依赖的最好办法是建立一个目标平台包含这些依赖... – khmarbaise

+0

我不知道,你是什么目标平台是什么意思? – madsonic

回答

0

在你的清单,你导入的包org.ethereum.facade。如果还有一个导出此软件包的软件包,这只能工作。如果包是纯粹的内部的,那么你应该把它设置为私人包,而不是导入它。

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

你如何创建清单?你用这个bnd吗?如果是,那么bundle bundle classpath中的手动更改可能无法识别。

+0

清单是使用gradle osgi插件创建的,该插件使用bnd。 'org.ethereum.facade'被列在私有包中,也在导入的包中。 – madsonic

+0

嗯..私人和进口是没有意义的。如果一个包是私人的,那么它不应该被导入。 –

+0

因此,我的嵌入方法是错误的? – madsonic

1

我的解决办法是使用OSGi的运行插件gradle这个代替了原来的OSGi插件。声明我的依赖关系为SystemLibrary systemLib ("org.ethereum:ethereumj-core:1.2.0-RELEASE")解决了这些问题,并且我能够使用该库而没有例外和错误。