2016-01-06 18 views
1

我有各種自制的項目,有第三方庫依賴項。 我捆綁他們爲OSGI容器,但無法解決我的項目中的深層依賴項。 現在我正在尋找karaf文件夾,我可以放置我的庫,使捆綁可以直接訪問它們,而不是安裝它們。我可以將第三方罐放在karaf(任何特定文件夾)中以解決傳遞性依賴關係嗎?

更多我使用的也是maven。

編輯: 以下的「功能」的解決方案後,我能夠產生明顯的方含傳遞依賴,但現在問題是,它也看起來非常普通的java文件:例如:下面是相當大的依賴列表:

bsh -- Cannot be resolved 
com.fasterxml.jackson.annotation -- Cannot be resolved 
com.fasterxml.jackson.core -- Cannot be resolved 
com.fasterxml.jackson.databind -- Cannot be resolved 
com.fasterxml.jackson.databind.annotation -- Cannot be resolved 
com.fasterxml.jackson.databind.module -- Cannot be resolved 
com.gargoylesoftware.htmlunit -- Cannot be resolved 
com.gargoylesoftware.htmlunit.util -- Cannot be resolved 
com.google.protobuf -- Cannot be resolved 
com.ibm.uvm.tools -- Cannot be resolved 
com.ibm.websphere.uow -- Cannot be resolved 
com.ibm.wsspi.uow -- Cannot be resolved 
com.jamonapi -- Cannot be resolved 
com.jamonapi.utils -- Cannot be resolved 
com.jayway.jsonpath -- Cannot be resolved 
com.jcraft.jzlib -- Cannot be resolved 
com.mysema.query.types -- Cannot be resolved 
com.sun.javadoc -- Cannot be resolved and overwritten by Boot Delegation 
com.sun.jdmk.comm -- Cannot be resolved and overwritten by Boot Delegation 
com.sun.net.httpserver -- Cannot be resolved and overwritten by Boot Delegation 
com.sun.tools.javadoc -- Cannot be resolved and overwritten by Boot Delegation 
com.sun.xml.fastinfoset.sax -- Cannot be resolved and overwritten by Boot Delegation 
com.sun.xml.fastinfoset.stax -- Cannot be resolved and overwritten by Boot Delegation 
com.typesafe.config -- Cannot be resolved 
groovy.lang -- Cannot be resolved 
groovy.xml -- Cannot be resolved 
javassist -- Cannot be resolved 
javax.activation from org.apache.felix.framework (0) 
javax.annotation from org.apache.felix.framework (0) 
javax.crypto from org.apache.felix.framework (0) 
javax.crypto.spec from org.apache.felix.framework (0) 
javax.ejb -- Cannot be resolved 
javax.el -- Cannot be resolved 
javax.enterprise.concurrent -- Cannot be resolved 
javax.enterprise.context -- Cannot be resolved 
javax.enterprise.context.spi -- Cannot be resolved 
javax.enterprise.event -- Cannot be resolved 
javax.enterprise.inject -- Cannot be resolved 
javax.enterprise.inject.spi -- Cannot be resolved 
javax.enterprise.util -- Cannot be resolved 

回答

4

要回答你的問題:你可以在你的所有依賴包下降到$ KARAF_HOME/deploy文件夾和Karaf將部署它們。

但是,這不是很方便,因爲它是一個手動過程,不受Maven驅動。相反看看卡拉夫的概念feature repositories。您可以使用Karaf maven plugin爲您的軟件包及其(傳遞)依賴項創建功能存儲庫。如果您需要將應用程序作爲單個工件發佈,則可以使用相同的插件來創建KAR歸檔文件,該歸檔文件是包含特性存儲庫和自包含的部署單元中所需的依賴項的zip文件。

要開始把模板feature.xml文件到src/main/feature

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<features xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.3.0 http://karaf.apache.org/xmlns/features/v1.3.0" 
     name="My feature"> 
    <feature name="${project.artifactId}" version="${project.version}" description="Describe feature here"> 
     <!-- Add "self" to the list of dependencies --> 
     <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle> 
    </feature> 
</features> 

然後設置插件基於Maven的依賴來填充特徵模板:

<plugin> 
    <groupId>org.apache.karaf.tooling</groupId> 
    <artifactId>karaf-maven-plugin</artifactId> 
    <configuration> 
     <includeTransitiveDependency>true</includeTransitiveDependency> 
    </configuration> 
    <executions> 
     <execution> 
      <id>generate-features-descriptor</id> 
      <goals> 
       <goal>features-generate-descriptor</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

建設項目將在您的本地maven倉庫中與您的捆綁jar一起創建一個額外的maven工件:xxx-features.xml 您可以使本地Karaf知道您的特性存儲庫與feature:repo-add comman d。然後使用feature:install命令添加您的功能。這將啓動你的包及其所有聲明的(可傳遞的)Maven依賴關係。

編輯:

當您在留言提到,在某些(所有?)你的依賴是普通JAR文件,而不是OSGi包,可能是你最好embedding那些非OSGi的依賴到你自己的包帶maven-bundle-plugin。這可能是相當乏味的。大多數非OSGi JAR都具有在運行時根本不使用的包導入,或者未在特定使用情況下使用。爲了避免將你的OSGi依賴列表炸到你的可傳遞的maven依賴列表之外,你必須阻止那些「繼承的」包被添加到你自己包的MANIFEST中的包導入列表中。例如,我有一個使用httl模板庫的包,它依賴於Javassist。 OSGi捆綁也沒有。因此,我嵌入了兩個並禁止導入在httl或javassist代碼中聲明的包,但在運行時不需要:

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <extensions>true</extensions> 
    <configuration> 
     <instructions> 
      <Embed-Dependency>*;scope=compile|runtime;inline=false;artifactId=httl|javassist</Embed-Dependency> 
      <Embed-Transitive>false</Embed-Transitive> 
      <Import-Package> 
       !com.alibaba.*, 
       !com.thoughtworks.*, 
       !javassist.*, 
       !net.htmlparser.*, 
       !org.apache.commons.logging.*, 
       !org.codehaus.jackson.*, 
       !org.joda.convert.*, 
       !com.sun.jdi.*, 
       !javax.servlet.*, 
       * 
      </Import-Package> 
     </instructions> 
    </configuration> 
</plugin> 
+0

你的意思是我簡單地將我的JAR放入deploy文件夾,我的依賴關係應該解決?但是要告訴你那些JAR還沒有捆綁出來。 – usman

+0

Karaf自動將普通的香草JAR文件轉換爲盡力而爲捆綁jar文件。例如,它不可能推斷出版本。但它會部署jar文件好吧。如果你幸運的話,你的所有依賴關係都將得到解決。另一種方法是使用maven-bundle-plugin來[嵌入](http://felix.apache.org/documentation/subprojects/apache-felix-maven-bundle-plugin-bnd.html#embedding-dependencies)你所有的非捆綁依賴關係都會放入你自己的捆綁包中。 – Ralf

+0

而不是部署文件夾,我把self-made.jar(我的porject jar1)放在lib文件夾中,並在etc/config.properties中提供包路徑。那麼這樣我的捆綁包就獲得了第一個依賴關係,現在依賴關係在自制的.jar中,它們沒有被解析。這是我的問題的實際點。此外,我正在閱讀功能以及 – usman

0

如果我正確理解你的問題,你想建立你的artefact,但不包括第三方庫。你有沒有嘗試設置你不想捆綁的第三方庫?

例如

<dependency> 
     <artifactId>commons-logging</artifactId> 
     <groupId>commons-logging</groupId> 
     <version>[1.0,]</version> 
     <scope>provided</scope> 
    </dependency> 
+0

沒有這不是我所要求的與karaf庫相關的。 – usman

相關問題