2017-08-24 71 views
3

調試時,爲什麼我的包中的服務沒有被其他包導入,我注意到,我聲明瞭commons-io的錯誤版本(1.4而不是2.4) 。但是,在調用mvn clean然後mnv install之後,我注意到,舊版本仍然被引用!此外,還沒有聲明org.apache.httpcomponents的版本!Maven bundle插件生成錯誤或缺少版本的Manifest

我的有效POM看起來像以下:

....

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.5.3</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
    <scope>compile</scope> 
</dependency> 

...

<plugin> 
     <groupId>org.apache.felix</groupId> 
     <artifactId>maven-bundle-plugin</artifactId> 
     <version>3.3.0</version> 
     <extensions>true</extensions> 
     <executions> 
     <execution> 
      <id>bundle-manifest</id> 
      <phase>process-classes</phase> 
      <goals> 
      <goal>manifest</goal> 
      </goals> 
      <configuration> 
      <manifestLocation>META-INF</manifestLocation> 
      <instructions> 
       <_noee>true</_noee> 
       <_removeheaders>Import-Service,Export-Service</_removeheaders> 
      </instructions> 
      </configuration> 
     </execution> 
     </executions> 
     <configuration> 
     <manifestLocation>META-INF</manifestLocation> 
     <instructions> 
      <_noee>true</_noee> 
      <_removeheaders>Import-Service,Export-Service</_removeheaders> 
     </instructions> 
     </configuration> 
    </plugin> 

我在MANIFEST.MF看到的是:

進口包裝: .....................,org .apache.com mons.io; version =「[1.4,2)」,org.apache.http,org.apache.http.client,org.ap ache.http.client.methods,org.apache.http .entity,org.apache.http.impl.cl ient,org.osgi.service.blueprint;版本= 「[1.0.0,2.0.0)」,........

現在maven-bundle-plugin的行爲對我來說似乎是隨機的。有時候版本被放置在清單中,有時候不是,有時來自同一捆綁包的包被放置在Import-Package部分中,有時候不會。現在放置舊的包版本,就好像它被緩存在某處...

是否有任何強制maven-bundle-plugin從maven dependencies正確解析包版本的方法?我不想手動編寫版本,因爲這是我們使用Maven的...

一個可能很重要的注意事項:使用這些導入的類是在Blueprint描述符中聲明的,它是如何使用maven-bundle-插件在第一行找到包,看起來插件在Blueprint支持方面有一些問題...

回答

2

Maven bundle插件使用一些規則來創建Import-Package語句。

  • 它只會創造實際使用
  • 它將考慮藍圖,併爲一些有定義的進口包裝進口。例如,如果你聲明一個bean類=那麼它將導入包
  • 如果你導出一個包,那麼maven-bundle-plugin也會爲它創建一個導入。這使得OSGi可以選擇最好的進口產品。這對於系統的穩定性是一件好事。
  • 導入的版本取自您在maven中引用的包的Export-Package語句。如果Maven的依賴是不是一個包,然後將需要的版本從Maven版本

在你的情況爲org.apache.commons.io進口仍然在[1.4,2)範圍內的公共-io 2.4捆綁軟件將該軟件包與1.4.9999版本導出。我想這樣做是爲了使commons-io 2.4與針對commons-io 1.4編譯的bundle相兼容。

+0

哇,看起來這裏有一大堆爛攤子。實際上,作爲依賴關係的httpcomponents沒有捆綁工件,所以我編譯它們,但在特徵描述符中導入httpcomponents-osgi。似乎我還在對錯誤的東西進行調試,因爲我想檢查爲什麼我的服務不是由其他軟件包導入的,但似乎服務是導入的,只有karaf控制檯沒有顯示。 –

+0

是的。如果可能的話,您應該使用OSGi包作爲依賴項,因爲它會創建正確的導入。當我爲OSGi項目添加依賴項時,我總是看一看依賴項的清單。它通常可以讓你免於一些驚喜。 在藍圖中,當重構藍圖xml通常不會被重構時,您還需要小心。所以我經常有這樣的效果,即我的舊包名仍然被導入,並且我花了一段時間才找到原因:-) –

相關問題