【问题标题】:Maven project gets the version of other maven project?Maven项目获取其他Maven项目的版本?
【发布时间】:2019-06-11 23:58:06
【问题描述】:

我必须 maven 项目客户端和服务器。服务器的版本始终是客户端的版本。这个“版本”不是客户端的maven工件的版本。更多的是来自客户端的属性,我在服务器中需要它。它是根据 pom 的属性和内部版本号或“trunk-snapshot”(当客户端在开发人员机器上构建时)创建的。

客户端版本在@build 时创建(Jenkins build 或本地 mvn clean install)。我需要使用 Java 读取服务器模块上的客户端版本。

最好的方法是什么?

我尝试创建一个文本文件作为客户端的工件,但我找不到在服务器中读取它的简单方法。

【问题讨论】:

  • 你说的客户端项目和服务端项目,是指两个maven项目吗?是否有一个父项目同时构建这两个项目,或者它们完全独立并分别在两台不同的机器上构建?
  • 是的两个具有相同父级的 maven 项目。但它们可以单独构建。我们有一个工件,通常它们是在同一台机器上构建的。
  • 您应该能够在父 pom 中定义一个属性并在模块中引用,我在下面添加了一个示例作为答案。

标签: java maven


【解决方案1】:

在此处查看 POM 文档:https://maven.apache.org/guides/introduction/introduction-to-the-pom.html。具体看项目聚合:https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Aggregation

您可能想要的是一个父 POM,它有一个用于客户端的模块和一个用于服务器的模块。

您的项目结构将如下所示:

./pom.xml <-- this is your parent pom, it has version info, module entries for client/server, and dependencies that are used by both the client and server
./server
./server/pom.xml <- this is the pom for your server
./client
./client/pom.xml <- this is the pom for your client

然后你可以在你的父 pom 中定义版本,你的客户端和服务器继承它。要定义您的内部版本号,您可以使用 lkamal 建议的解决方案,通过更改您的 Maven 版本属性。

另一个需要考虑的选项是如何生成内部版本号。 Maven 的Build Number Plugin 可以生成任意顺序内部版本号或从 SCM 版本生成一个。

【讨论】:

  • 我认为这对我没有帮助。该版本仅在构建时创建,它不是工件的版本。
  • 您是使用代码生成这个版本还是使用源代码控制版本号之类的东西?如果是后一种情况 - 使用 maven 内部版本号插件生成该版本作为项目版本的一部分。 mojohaus.org/buildnumber-maven-plugin/usage.html
  • 构建客户端后如何使用Java获取服务器版本?
  • 好的,所以您的代码正在执行类似于完整性检查的操作,以确保调用服务器的客户端版本与服务器版本匹配。此处详细说明了一些策略:stackoverflow.com/questions/3697449/…。我会考虑一下,然后回复。我认为您有 3 或 4 个子任务来解决您的整体用例。
  • 我找到了一个解决方案,在客户端中使用 properties-maven-plugin 创建一个属性文件,该文件最终会出现在 client.jar 中。我使用 ClassLoader.getSystemResourceAsStream("my.properties") 在服务器中读取它
【解决方案2】:

最简单的解决方案是在父 pom 文件中定义一个属性,并在客户端和服务器模块中引用它。

pom.xml
server/pom.xml
client/pom.xml

现在父 pom.xml 将具有以下内容。

<properties>
    <my.custom.version>1234</my.custom.version>
</properties>

在服务器和客户端的 pom.xml 文件中,您可以参考如下。

<version-needed-tag>${my.custom.version}</version-needed-tag>

【讨论】:

  • 构建客户端时如何更新属性?
  • 一种选择是通过命令行传递属性的值。 mvn clean install -Dmy.custom.version=1234
  • K,这将更新客户端工件的属性,然后我如何使用 java 为服务器模块获取此属性?
  • 当您使用父 pom 构建客户端和服务器两个模块时,您需要通过命令行传递属性。然后两个子模块将收到相同的属性值。
  • 是的,这行得通,但我的主要问题是大多数时候它们是单独构建的,所以我需要一种 @server 模块从客户端工件中读取版本
【解决方案3】:

我在客户端使用properties-maven-plugin 解决了这个问题,创建了一个属性文件,该文件将在client.jar 中结束。我使用 ClassLoader.getSystemResourceAsStream("my.properties") 在服务器中读取它。

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 2016-01-13
    • 2023-03-30
    • 2012-04-11
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多