2013-03-15 59 views
5

我們正在使用JPA,並試圖堅持標準規範(並避免Hibernate特有的功能)。引用來自persistence.xml的maven依賴關係jar的artifactId

我們在另一個項目(A)中使用一個項目(我們稱之爲X)作爲Maven依賴項。

我們需要JPA掃描實體項目X以及掃描項目A.

爲此,我們在添加了一行

<jar-file>lib/X-v5-4.0.jar</jar-file> 

<persistence-unit> 

persistence.xml中。這工作正常。

我們現在仍然存在的問題是,我們現在需要指定項目X的版本,不僅在pom.xml中,而且在persistence.xml中。這是未來部署問題的祕訣。

我們已經想出了使用Maven資源過濾系統:

<jar-file>lib/X-v5-${x-version}.jar</jar-file> 

persistence.xml中和

<properties> 
    <x-version>4.0</x-version> 
</properties> 

和$ {X-版本} 在pom.xml中。

這個方法可行,但仍不完美,因爲每次項目X獲得新版本時,我們都必須記住在非標準位置更新版本號。

理想情況下,我們希望可以調整pom.xml的依賴部分中的版本信息,並且更改會自動傳播到persistence.xml。我們今後會減少很多可能出現的錯誤。

這可能嗎?

編輯(我們的解決方案):

我們已經加入了一個名爲jpa.xml文件。我們定義了一個entityManagerFactory,一個persistenceAnnotationBeanPostProcessor和一個transactionManager。這裏的重要部分是entityManagerFactory bean。它有一個屬性「packagesToScan」,允許你指定特定的包來掃描實體放入持久化上下文中。

的代碼段:

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="jpaDataSource" /> 
    <property name="loadTimeWeaver"> 
     <bean 
      class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
    </property> 
    <property name="packagesToScan"> 
     <list> 
      <value>org.com.our.external.library.package1</value> 
      <value>org.com.our.external.library.package2</value> 
      <value>org.com.our.external.library.package3</value> 
     </list> 
    </property> 
</bean> 

我敢肯定,你看到的好處是:因爲我們指的是這些庫包簽名,我們再也不用擔心罐子版本號。

+0

我碰到與我的項目同樣的情況。你有沒有找到這個問題的一個很好的解決方案? – 2014-02-12 04:00:31

+0

@EricB。我已經將該解決方案添加爲我的問題的編輯。我希望這有幫助。 – Zaan 2014-02-19 13:35:08

+0

謝謝。我最終也使用了同樣的東西,但要注意的是它不是JPA標準。但是我放棄了JPA標準解決方案。我確實找到了一個叫做'jpa-maven-plugin'的插件(http://ljnelson.github.io/jpa-maven-plugin/),你可以在Maven構建期間使用它來更新persistence.xml文件。 – 2014-02-19 17:01:48

回答

0

我可以建議你添加一個單元測試來驗證如persistence.xml所預期的那樣實際上是否到位?

dependency推導persistence.xml的版本號將無法正常工作。

它會反過來工作,從而在POM中設置dependency.version。這可以滿足您的要求,只需在一個地方定義版本,想要更新dependency的開發人員可能會遇到該屬性,檢查並更新屬性,而不是使用更新的版本號覆蓋它。

這可以由Versions Maven Plugin進一步支持。

+0

看到我的答案。當然在pom中,你仍然必須將依賴項設置爲項目X以查看類,但只有在構建項目時才需要該jar,在這種情況下,maven將執行過濾 – unziberla 2015-06-16 22:46:03

2

我已經這樣解決了它:

persistence.xml替代整個<jar-file>標籤,即

<persistence-unit name="PersistenceUnit"> 
    ... 
    <!-- here is where the jar file is supposed to go --> 
    ${importjarfile} 
    ... 
</persistence-unit> 

最後,設置你的屬性是這樣的:

<properties> 
    <x-version>4.0</x-version> 
    <importjarfile><![CDATA[<jar-file>lib/X-v5-${x-version}.jar</jar-file>]]></importjarfile> 
</properties> 

這樣的Eclipse將不會看到jar-file標記,並且不會投訴。

我的解決方案實際上是一個有點清潔,因爲我使用的是.properties文件,所以我沒有使用CDATA,我希望它仍然有效。

我的解決辦法:

importjarfile = <jar-file>lib/X-v5-${x-version}.jar</jar-file>