从persistence.xml中引用maven依赖jar包的artifactId

8

我们正在使用JPA,并尝试遵循标准规范(避免使用Hibernate特定的功能)。

我们在一个项目(称为X)中作为Maven依赖项使用另一个项目(A)。

我们需要JPA扫描项目X和项目A中的实体。

为此,我们添加了一行代码

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

内部

<persistence-unit>

在persistence.xml中。这个没问题。

我们还有一个问题,现在不仅需要在pom.xml中指定项目X的版本,还需要在persistence.xml中指定。这将导致未来部署时出现问题。

我们想出了一种使用Maven资源过滤的系统:

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

在persistence.xml文件中和

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

在pom.xml中使用 ${x-version} 是可行的,但仍不完美,因为每次项目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>

我相信你也看到了这个好处:既然我们是通过包签名引用这些库,就不再需要担心JAR版本号的问题。


我在我的项目中遇到了相同的情况。你是否找到了解决这个问题的好方法? - Eric B.
@EricB。我已经将解决方案作为问题的编辑添加了进去。希望这能有所帮助。 - Marceau
谢谢。最终我也使用了同样的方法,但需要注意的是这不是JPA标准。我放弃了JPA标准解决方案。我找到了一个名为jpa-maven-plugin(http://ljnelson.github.io/jpa-maven-plugin/)的插件,你可以在Maven构建期间使用它来更新persistence.xml文件。 - Eric B.
这对我仍然没有起作用,您是否需要更改JPA.XML以便使用它? - LeYAUable
这里有一个更新的 jpa-maven-plugin 分支:https://github.com/iSnow/jpa-maven-plugin - Johannes Jander
2个回答

3
我用以下方法解决了这个问题:
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>

0

我可以建议您添加一个单元测试来验证persistence.xml所期望的jar-file是否已经就位?

dependency中推导出persistence.xml中的版本号是行不通的。

相反,可以采用另一种方式,即从POM属性设置dependency.version。这样可以满足您只在一个地方定义版本的要求,并且想要更新dependency的开发人员可能会遇到该属性,检查并更新该属性,而不是用更新的版本号覆盖它。

这可以进一步得到Versions Maven Plugin的支持。


请查看我的回答。当然,在pom文件中,您仍然需要设置对项目X的依赖才能看到类,但是该jar文件仅在构建项目时需要,并且在这种情况下,Maven将执行过滤操作。 - unziberla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接