2012-07-20 18 views
4

我們有一個庫,其中包含JSF提供的功能(類似於其他ResourceHandlers)的小增加。使用JSF的庫的Maven依賴關係,應該與Mojarra或MyFaces一起工作

因爲它使用JSF類(來自javax.faces.*包),所以它自然必須依賴於JSF API。該庫打包爲Maven項目,並取決於com.sun.faces:jsf-api

這適用於編譯,以及在使用Mojarra的項目中使用。但是,如果我們將庫包含在使用MyFaces的JSF應用程序中,則會出現錯誤,如Exception: could not find Factory: javax.faces.context.FacesContextFactory中所述。

顯然,如果應用程序使用MyFaces,它必須使用myfaces-api.jar和myfaces-impl.jar(或相應的Maven代碼),and not jsf-api.jar or jsf-impl.jar

這讓我有點困惑。

  • 爲什麼Mojarra和MyFaces使用不同的API罐?兩者都實現相同的API(JSF),所以他們不應該使用相同的API罐?
  • 我認爲具有獨立的「api」和「impl」罐子的全部意義在於只有「impl」部分必須轉換爲使用不同的實現。我誤解了什麼?
  • 更具體地說:對於只應依賴於JSF API的庫來說,什麼是正確的Maven依賴關係?現在,我們依賴於jsf-api,並且使用MyFaces的項目必須使用<exclusions>來拋出jsf-api幷包含myfaces-api。這有效,但肯定有更好的方法?
+0

我們使用的是JBoss AS提供的JSF jar,但是我們使用的是用於源代碼下載的jsf api的maven依賴項。下面是它的定義: org.jboss.spec.javax.faces 的jboss-JSF-api_2.1_spec 提供 2012-07-20 14:52:38

回答

2

爲什麼Mojarra和MyFaces使用不同的API罐?兩者都實現了 相同的API(JSF),所以他們不應該使用相同的API jar嗎?

它們是JSF的獨立實現。 JSF是一個規範。見this Question

更具體地說:對於只有依賴於JSF API的庫而言,什麼是正確的Maven依賴關係?現在,我們依賴於jsf-api, 以及使用MyFaces必須使用的項目,以拋棄 jsf-api幷包含myfaces-api。這有效,但肯定有更好的方法嗎?

你在說什麼「JSF API」是它的Sun/Oracle實現(Mojarra)。這些依賴關係是:

<dependency> 
      <groupId>com.sun.faces</groupId> 
      <artifactId>jsf-api</artifactId> 
      <version>2.1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>com.sun.faces</groupId> 
      <artifactId>jsf-impl</artifactId> 
      <version>2.1.2</version> 
     </dependency> 
3

也許他們使用不同的API jar因爲一些分發/許可問題。我完全不知道。 但是API是一樣的,你的FacesContextFactory也可以在myfaces-api jar中找到。

我會嘗試創建配置文件(甚至兩個單獨的模塊),它們定義相關的相關集。使用配置文件您需要手動激活其中一個來切換依賴關係。隨着模塊都將被構建,但問題的來源將出現在哪裏,但可以將依賴關係設置爲編譯,以便創建可交付成果。

這裏值得一看的是Gradle - 我總是遇到需要採用不同的依賴項集的項目問題,並且我已經看到了一些不錯的功能。

對不起,我還沒有找到好的解決方案,但這種設置。

編輯:while thinking:你可能只是在你的SCM中創建兩個分支併合並它們之間的變化? (當然除了依賴關係)