- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们正在构建带有大量 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.jar
和 second-ejb-1.0.0.jar
取决于 other-2.3.4.jar
.两者 first-ejb-1.0.0.jar
和 second-ejb-1.0.0.jar
包含带有 <jar-file>
的 persistence.xml入口。 first-ejb-1.0.0.jar
指向 other-1.2.3.jar
和 second-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 文件中包含的所有依赖项。以下值是有效的 standard
、no-version
、full
、no-version-for-ejb
。 standard
表示文件名是 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/
我正在Mac上开发一个safari插件。现在我想知道safari3,safari4的所有版本号,因为我可以在一些插件示例代码info.plist中看到:MinBundleVersion是5530,我检
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在阅读 http://www.tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html我有一些问题。 版本号、次要版本号和发布号之间有什
是否必须所有用 C++ 创建的 dll 都有版本号?我的机器中有 dll,但是当我右键单击时,我无法看到版本号。 PS:我安装了Win 7。 最佳答案 重要的是要了解,在加载 DLL 期间不会使用版本
我知道 VS 2010 有 F# 2.0 和 VS 2012 - F# 3.0。 但是我如何获得 F# 版本号,例如在 F# 交互中?是否有一些命令,例如:#ver;; ? 谢谢。 最佳答案 当您在
我已经发布了如何在 Eclipse Gallileo 中找到它,但如果有人有有关旧版本的信息,请随时在下面发布。 最佳答案 (2012 年 9 月更新): MRT指出in the comments “
Rational Function Tester 脚本如何确定它在哪个版本的 RFT 下执行/构建? 我仔细研究了文档,发现最接近的是 com.rational.test.ft.script.Scri
我正在使用 Alfresco。我知道如何查看已安装的 Alfresco vesrion 编号,但我需要以编程方式获取此版本号,例如通过 rest API 或某些 http 请求。有可能吗? 最佳答案
我目前正在尝试更新版本号。在 TeamCity 中使用 Nant 构建文件,包含版本号。如果我只是使用 . . 在脚本中,buildNumber 已更新为 2.16.3,但我还希望有此版本号的计数
我想编写一个脚本,它可以递归地扫描目录中的 DLL 并生成所有版本号的报告。 如何使用脚本检测 DLL 的版本号? VBScript 解决方案是首选,除非有更好的方法。 最佳答案 您可以使用 File
我正在开始一个有人在两年前开始的项目,但我无法确定它运行的 django 版本。制作该项目的人不知道,而且我不确定猜测和检查是否有效,因为我实际上不知道该项目是否可以编译。我找到了this答案,但它表
我需要确保可用的 PostgreSQL 版本不低于要求的版本。可以按如下方式请求版本字符串: SELECT VERSION(); 它返回给我类似的东西: PostgreSQL 9.5.4, compi
在我的数据库中,我在列中填写了这些数据: 1 1.1 1.1.1 1.1.1.1 1.1.2 1.10 1.11 1.2 1.9 我想对其进行排序,得到的结果如下所示: 1 1.1 1.1.1 1.1
我正在编写一个脚本,它需要一个简单的短格式的 Bash 版本号。 我知道 bash --version,但这会产生很长的输出: GNU bash, version 4.2.10(1)-release
我将 Grunt 与 php 一起使用,并使用一个包来对我的 css 进行版本控制,并将日期戳记为 style.min.20160913230349.css。 但是我如何找到一个包,将新字符串更新到我
我有一个用 distutils 构建的 python 包,我在我的设置函数中使用版本参数,就像这样(除了名称和版本之外还有其他参数): setup(name='example_module', ver
Windows EXE 文件附有版本号,由以点分隔的四位数字组成(例如 1.0.0.0)。 问题:比较这些数字的正确方法是什么?具体来说,是 1.15.0.0 > 1.2.0.0(因为 15 > 2)
如果我有一个像 这样的 iOS 用户代理 Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532
我正在写一个 Symfony Console PHP应用程序takes a version number in the constructor . $app = new Application('my
我可以使用它们的一些构建语法或 Gradle API 中的某些内容来检查 Gradle 版本号吗? 最佳答案 gradle.gradleVersion 将返回版本号,作为字符串。 关于java - 如
我是一名优秀的程序员,十分优秀!