gpt4 book ai didi

java - jar 名称中的版本号 - 如何处理 persistence.xml?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:17 26 4
gpt4 key购买 nike

我们正在构建带有大量 jar 的 ear 文件。其中一些包含定义持久性单元的 persistence.xml 文件,这些持久性单元用

引用其他 jar
<jar-file>other.jar</jar-file>

现在我们计划在未来使用 Maven 并且 jar 名称现在包含版本号。对于上述机制来说,这是一个巨大的问题:而不是 other.jar , 我们需要指定 other-1.2.3.jar .但是在构建 jar 时无法知道正确的版本号,因为在 ear 的构建中,依赖中介可以替换 other-1.2.3.jar。与 other-2.3.4.jar这样我在 jar 的 persistence.xml 中的引用就变得无效了。

所以我的问题是:在构建大型 ear 文件时,如何在 Maven 中正确管理 persistence.xml 文件?


编辑:

让我试着构建一个小例子来阐明我的观点:

让我们有first-ejb-1.0.0.jar取决于 other-1.2.3.jarsecond-ejb-1.0.0.jar取决于 other-2.3.4.jar .两者 first-ejb-1.0.0.jarsecond-ejb-1.0.0.jar包含带有 <jar-file> 的 persistence.xml入口。 first-ejb-1.0.0.jar指向 other-1.2.3.jarsecond-ejb-1.0.0.jar指向 other-2.3.4.jar .到目前为止,还不错。

现在我用 first-ejb-1.0.0.jar 做了一只耳朵和 second-ejb-1.0.0.jar .依赖关系已解决,但只有一个 other-*.jar可以塞进耳朵里。比如说,我们的依赖调解选择 other-2.3.4.jar .然后 first-ejb-1.0.0.jar死了<jar-file>条目,指向一个不存在的 jar 。

最佳答案

maven-ear-plugin 有一个属性 fileNameMapping,您可以通过它指定文件名映射以用于 EAR 文件中包含的所有依赖项。以下值是有效的 standardno-versionfullno-version-for-ejbstandard 表示文件名是 artifactId incl。 Artifact 的版本。 no-version 表示文件只是没有版本的 artifactId。 full 表示文件名是 groupId+artifactId+ Artifact 的版本。 no-version-for-ejb 表示在 EJB 类型的情况下,文件名是没有版本的 artifactId。

所以指定ear插件如下:

  <plugin>
<artifactId>maven-ear-plugin</artifactId>
<version>2.10.1</version>
<configuration>
<fileNameMapping>no-version</fileNameMapping>
</configuration>
</plugin>

可能会帮到你。

备选方案 2:外部化 persistence.xml

另一种方法是将 persistence.xml 外部化。最直接的方法是创建一个包含 persistence.xml 的 jar 并将其放入 ear 的 lib 文件夹中:

EAR +
|- lib +
| |- core-module.jar
| \- persistence-module.jar +
| \- META-INF +
| \- persistence.xml
|- ejb1-module.jar
\- ejb2-module.jar

EJB 模块可以是 jar 文件或分解目录。在上面的设置中,persistence.xml 看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="my-persistence-unit">
<!-- Note: it's relative to `persistence-module.jar` file location in EAR -->
<jar-file>../ejb1-module.jar</jar-file>
<jar-file>../ejb2-module.jar</jar-file>
....
</persistence-unit>
</persistence>

在 EAR 级别定义的持久性单元通常对应用程序中的所有组件可见。但是,如果 EJB-JAR、WAR 或 EAR 中的应用程序 jar 文件定义了一个同名的持久性单元,那么在 EAR 级别定义的同名持久性单元将对该 EJB-定义的组件不可见。 JAR、WAR 或应用程序 jar 文件,除非持久性单元引用使用持久性单元名称 # 语法来指定路径名来消除引用的歧义。当使用 # 语法时,路径名是相对于引用应用程序组件 jar 文件的。例如,语法 ../lib/persistenceUnitRoot.jar#myPersistenceUnit 引用一个持久性单元,其名称在 persistence.xml 文件的名称元素中指定,是 myPersistenceUnit 并且持久单元的根的相对路径名称是 ../lib/persistenceUnitRoot.jar

可以通过使用 @PersistenceContext(unitName = "../lib/persistenceUnitRoot.jar#myPersistenceUnit") 注释 entityManager 来指定持久性单元。

关于java - jar 名称中的版本号 - 如何处理 persistence.xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37294083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com