2013-03-15 6 views
5

Stiamo lavorando con JPA e stiamo cercando di attenerci alle specifiche standard (ed evitare le funzionalità specifiche di Hibernate).Riferendosi all'oggetto del vaso di dipendenza di Maven da persistence.xml

Usiamo un progetto (chiamiamolo X) all'interno di un altro progetto (A) come dipendenza da Maven.

Abbiamo bisogno di APP a eseguire la scansione del progetto X per Enti, nonché progetto di scansione A.

A tal fine, abbiamo aggiunto una linea

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

all'interno

<persistence-unit> 

in persistence.xml. Funziona bene

Il problema che abbiamo ancora è che ora dobbiamo specificare la versione del progetto X non solo in pom.xml ma anche in persistence.xml. Questa è una ricetta per i problemi con gli schieramenti in futuro.

Siamo venuti su con un sistema che utilizza Maven filtraggio delle risorse:

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

in persistence.xml e

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

e $ {x-version} in pom.xml.

Questo funziona ma non è ancora perfetto, poiché dovremo ricordarci di aggiornare il numero di versione in una posizione non standard ogni volta che il progetto X ottiene una nuova versione.

Idealmente, ci piacerebbe avere una situazione in cui possiamo regolare le informazioni sulla versione nella parte delle dipendenze di pom.xml e le modifiche si propagheranno automaticamente a persistence.xml. Ridurremmo un sacco di errori possibili in future distribuzioni in questo modo.

È possibile?

EDIT (LA NOSTRA SOLUZIONE):

abbiamo aggiunto un file chiamato jpa.xml. Definiamo un entityManagerFactory, un persistenceAnnotationBeanPostProcessor e un transactionManager in esso. La parte importante qui è il bean entityManagerFactory. Ha una proprietà "packagesToScan" che consente di indicare pacchetti specifici per la scansione delle entità da inserire nel contesto di persistenza.

Un frammento di codice:

<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> 

sono sicuro che si vede il vantaggio: come ci si riferisce a queste librerie di firma pacchetto, non dobbiamo più preoccupare di vaso numeri di versione.

+0

ho incontrato la stessa situazione con il mio progetto. Hai mai trovato una buona soluzione per questo problema? –

+0

@EricB. Ho aggiunto la soluzione come modifica alla mia domanda. Spero che aiuti. – Zaan

+0

Grazie. Ho finito per usare la stessa cosa, con l'avvertenza che non è uno standard JPA. Ma ho rinunciato alla soluzione standard JPA. Ho trovato un plugin chiamato 'jpa-maven-plugin' (http://ljnelson.github.io/jpa-maven-plugin/) che puoi usare per aggiornare il file persistence.xml durante una build di maven. –

risposta

0

Posso suggerire di aggiungere un test di unità per verificare che lo jar-file come previsto da persistence.xml sia effettivamente in posizione?

Non funzionerà per derivare il numero di versione in persistence.xml da un dependency.

Funzionerebbe il contrario, quindi impostare dependency.version dalla proprietà nel POM.Questo soddisfa la tua esigenza di definire la versione solo in un unico posto e gli sviluppatori che desiderano aggiornare lo dependency probabilmente incontreranno la proprietà, la verificheranno e aggiorneranno la proprietà piuttosto che sovrascriverla con il numero di versione aggiornato.

Questo potrebbe essere ulteriormente supportato dal Versions Maven Plugin.

+0

vedi la mia risposta. ovviamente nel pom dovrai comunque impostare la dipendenza al progetto X per vedere le classi, ma il jar è necessario solo quando si costruisce il progetto, e in quella situazione maven eseguirà il filtraggio – unziberla

2

ho risolto in questo modo:

nel persistence.xml sostituto tutta <jar-file> tag, cioè

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

Infine, impostare le proprietà come questo:

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

In questo Eclipse modo non vedrà il tag jar-file e non si lamenterà.

La mia soluzione era in realtà un po 'più pulita dato che stavo usando un file .properties quindi non dovevo usare CDATA, spero che funzioni ancora.

La mia soluzione:

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