2013-03-15 4 views
5

Wir arbeiten mit JPA und versuchen, die Standardspezifikationen einzuhalten (und Hibernate-spezifische Funktionen zu vermeiden).Wir verweisen auf die artifactId eines maven-Abhängigkeits-jars aus persistence.xml

Wir verwenden ein Projekt (nennen wir es X) in einem anderen Projekt (A) als Maven-Abhängigkeit.

Wir JPA brauchen Projekt X für Entities sowie Scan-Projekt A.

Zu diesem Zweck zu scannen, haben wir eine Linie

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

innen

<persistence-unit> 

hinzugefügt persistence.xml. Das funktioniert gut.

Das Problem, das wir noch haben, ist, dass wir nun die Version von Projekt X nicht nur in pom.xml, sondern auch in persistence.xml angeben müssen. Dies ist ein Rezept für Probleme mit zukünftigen Deployen.

Wir haben mit einem System mit Maven Ressource Filterung kommen:

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

in persistence.xml und

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

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

Dies funktioniert, ist aber immer noch nicht perfekt, da wir daran denken müssen, die Versionsnummer jedes Mal, wenn Projekt X eine neue Version erhält, an einem anderen Ort zu speichern.

Idealerweise möchten wir eine Situation haben, in der Versionsinformationen im Abhängigkeitsteil von pom.xml angepasst werden können und Änderungen automatisch in persistence.xml übernommen werden. Wir würden auf diese Weise viele mögliche Fehler in zukünftigen Deployments reduzieren.

Ist das möglich?

EDIT (UNSERE LÖSUNG):

haben wir eine Datei mit dem Namen jpa.xml hinzugefügt. Wir definieren eine entityManagerFactory, einen persistenceAnnotationBeanPostProcessor und einen transactionManager. Der wichtige Teil ist die EntityManagerFactory-Bean. Es verfügt über eine Eigenschaft "packagesToScan", mit der Sie bestimmte Pakete angeben können, die nach Entitäten durchsucht werden sollen, die in den Persistenzkontext eingefügt werden sollen.

Ein Code-Schnipsel:

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

Ich bin sicher, dass Sie den Vorteil sehen: wie wir auf diese Bibliotheken von Paketsignaturen beziehen wir nicht mehr über jar Versionsnummern kümmern.

+0

Ich habe mit meinem Projekt in die gleiche Situation führen. Haben Sie jemals eine gute Lösung für dieses Problem gefunden? –

+0

@EricB. Ich habe die Lösung als Bearbeitung zu meiner Frage hinzugefügt. Ich hoffe das hilft. – Zaan

+0

Danke. Ich habe am Ende dasselbe benutzt, mit dem Vorbehalt, dass es kein JPA-Standard ist. Aber ich habe die JPA-Standardlösung aufgegeben. Ich habe ein Plugin mit dem Namen 'jpa-maven-plugin' (http://ljnelson.github.io/jpa-maven-plugin/) gefunden, mit dem Sie die Datei persistence.xml während eines Maven-Builds aktualisieren können. –

Antwort

0

Darf ich vorschlagen, dass Sie einen Komponententest hinzufügen, um zu verifizieren, dass die jar-file, wie von persistence.xml erwartet, tatsächlich vorhanden ist?

Es wird nicht funktionieren, um die Versionsnummer in persistence.xml von einem dependency abzuleiten.

Es würde andersherum funktionieren, also dependency.version von der Eigenschaft in der POM setzen.Dies erfüllt Ihre Anforderung, die Version nur an einer Stelle zu definieren, und Entwickler, die die dependency aktualisieren möchten, werden wahrscheinlich auf die Eigenschaft stoßen, sie auschecken und die Eigenschaft aktualisieren, anstatt sie mit der aktualisierten Versionsnummer zu überschreiben.

Dies könnte durch die Versions Maven Plugin weiter unterstützt werden.

+0

sehe meine Antwort. Natürlich müssen Sie im Pom noch die Abhängigkeit zu Projekt X setzen, um die Klassen zu sehen, aber das Jar wird nur benötigt, wenn das Projekt erstellt wird, und in dieser Situation wird Maven die Filterung durchführen – unziberla

2

Ich habe es auf diese Weise gelöst:

in persistence.xml Ersatz der ganze <jar-file> Tag, das heißt

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

Schließlich stellen Sie Ihre Eigenschaften wie folgt aus:

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

Auf diese Weise Eklipse wird das jar-file Tag nicht sehen und sich nicht beschweren.

Meine Lösung war eigentlich ein bisschen sauberer, da ich eine .properties Datei verwendete, so dass ich CDATA nicht verwenden musste, ich hoffe, dass es immer noch funktioniert.

Meine Lösung:

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