繁体   English   中英

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

[英]Version number in jar name - how to handle persistence.xml?

我们正在制作带有大量罐子的耳朵文件。 其中一些包含persistence.xml文件,用于定义引用其他jar的持久性单元

<jar-file>other.jar</jar-file>

现在我们计划将来使用Maven,jar名称现在包含版本号。 这是上述机制,一个巨大的问题:与其other.jar ,我们需要指定other-1.2.3.jar 但是,当罐子在耳朵的建设,因为建立正确的版本号无法知道,依赖调解可以取代other-1.2.3.jarother-2.3.4.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.jarsecond-ejb-1.0.0.jar构建一个ear。 解析了依赖关系,但只有一个other-*.jar可以包含在耳中。 other-2.3.4.jar说,我们的依赖调解选择other-2.3.4.jar 然后first-ejb-1.0.0.jar有一个死<jar-file>条目,指向一个不存在的jar。

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

所以指定耳塞如下:

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

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

所以,就像你自己说的那样,当你构建EAR时,你的工件就被构建了, jar-file已经被定义并且无法更改。 因此,有两种选择:

  1. jar-file必须是特定版本 - 不允许使用其他版本
  2. jar-file可以是任何版本 - 从jar名称中排除版本

1.严格的版本

您可以通过使用单版本范围强制Maven仅考虑特定版本的依赖关系:

<dependency>
  <groupId>my.company</groupId>
  <artifactId>persistence</artifactId>
  <!-- require specifically this version -->
  <version>[1.0.2]</version>
</dependency>

2.从jar名称中排除版本

您可以使用任何名称向EAR添加jar, 即使没有版本

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <version>2.10.1</version>
        <configuration>
           <modules>
             <ejbModule>
               <groupId>my.company</groupId>
               <artifactId>persistence</artifactId>
               <!-- rename artifact in ear -->
               <bundleFileName>persistence.jar</bundleFileName>
             </ejbModule>
          </modules>
        </configuration>
      </plugin>
    </plugins>
  </build>

由于您有一个EAR项目和一个其他项目,我假设您有一个父项目。

我不完全确定你的意思

但是在构建jar时无法知道正确的版本号,因为在构建耳朵时,依赖调解可以用其他2.3.4.jar替换other-1.2.3.jar

我知道其他人不知道它的版本,直到建立耳朵 (但为什么?)。 您可以执行以下操作:在父项目中,定义一个变量以保存实际的最终版本。

<properties>
  <my.final.version>...</my.final.version>
</properties>

显然, my.final.version应该用您的实际预期值设置。 然后,将persistence.xml更改为:

<jar-file>other-${my.final.version}.jar</jar-file>

然后,在其他的pom.xml中,添加:

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

启用过滤告诉maven替换变量。

如果您不想对所有资源进行过滤(出于性能或其他原因),您可能希望对过滤进行微调。 寻找标签包括下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM