当前位置: 首页 > 知识库问答 >
问题:

在maven中,我可以定义在另一个pom中使用的变量吗?

尉迟德惠
2023-03-14

运行maven build时出现错误(无法加载依赖项)。

[ERROR] Failed to execute goal on . . .

    Could not transfer artifact my.group:libme1:${someVariable} from/to . . .

我相信发布此工件的开发人员应该设置变量${某个变量},但没有。我认为这是一个错误,但我正在尝试通过设置变量来解决它。

我所依赖的JAR的POM<code>my.group:libme1:1.2.3</code>如下所示(突出显示问题的片段):

<groupId>my.group</groupId>
<artifactId>libme1</artifactId>

<parent>
    <groupId>my.group</groupId>
    <artifactId>libme1-parent</artifactId>
    <version>${someVariable}</version>
</parent>

我试图通过在命令行中添加-DsomeVariable=1.2.3来定义它,但没有成功。例如

mvn -DsomeVariable=1.2.3 clean install

应该基于Baeldung的文章,但不是。

我还跑了:

mvn -DsomeVariable=1.2.3 help:effective-pom

我看到变量正在设置,所以我知道我使用的POM已经定义了这个值,但是由于某种原因,另一个POM没有获取该值(或者在我看来是这样的)。

有没有办法设置变量,以便它可以在另一个POM中使用?我猜这是不可能的。

寻找我找到的答案:

专家医生

  • https://maven.apache.org/settings.html#Activation

如果您知道这是错误,请告诉我。我还联系了工件的发布,询问他们应该如何工作。

共有2个答案

向安福
2023-03-14

可能是变量存储在某个用户的settings.xml.

这将允许签出已经在生产中的旧版本来编写补丁。

<settings>
  ...

  <profiles>
    <profile>
      <id>work-in-progress</id>
      <properties>
        <someVariable>1.2.3</someVariable>
      </properties>
    </profile>
  </profiles>
 
  <activeProfiles>
    <activeProfile>work-in-progress</activeProfile>
  </activeProfiles>
</settings>

所以你也可以这么做。并在用户目录中搜索.m2 repo目录,其中通常包含设置。存储xml。

阎建中
2023-03-14

基本上,依赖项的 pom 是无效的,原因如下:

maven 允许开发人员执行以下操作:

  • 定义父pom中的依赖项
  • 通过对依赖项施加限制

从开发的角度来看,上面提到的所有这些特性都非常方便,但是当您发布工件时,这些特性会导致后面的痛苦:如果没有父pom,就无法使用外部库,因为父pom可能会定义依赖项和属性。

在您的特定情况下,有人将父 pom 的版本定义为 ${someVariable},这反过来意味着如果没有有关 ${someVariable} 值的信息,就不可能使用该库。但是,即使您已经知道${someVariable}的“正确”值,并且可能通过系统属性指定它,这也会导致一些奇怪的行为:今天您可能会为${someVariable}指定一个值,明天您(或其他人)将指定另一个值,最终您将获得不同的构建,由于该maven 拒绝这样的配置(这比构建不可靠的东西要好得多),最初拒绝发布这样的poms会更明智,但我们有我们所拥有的。

 类似资料:
  • 我当前有一个来自属性文件的变量,声明为: 在本例中,我希望在注释中使用,而不是硬编码常量“3”: 这有可能吗? 我试过: 但是我得到以下编译错误:

  • 然而,IntelliJ IDEA抱怨“无法解析符号'env.my_var'”

  • 问题内容: 我使用的父POM定义了我不想在子POM中运行的插件。如何完全禁用子pom中的插件? 约束:我不能更改父POM本身。 问题答案: 在禁用子POM中的Findbugs时,以下对我有用: 注意:Findbugs插件的完整定义在我们的父/超级POM中,因此它将继承该版本等。 在Maven 3中,您需要使用: 用于插件。

  • 我想用Ansible复制大文件。目标服务器有一个具有足够存储空间的专用分区。我注意到ansible使用由remote_tmp变量定义的临时目录。 谢谢你的回答。

  • 在另一个react组件中,如何使用存储mongoDB数据的变量,在该组件中,我们可以使用从mongoDB获取并存储在该变量中的数据。 从mongoDB中提取数据并将其存储在名为data的变量中的文件的代码 现在我想在另一个反应组件中使用这个数据变量,这样我就可以显示存储在数据变量中的数据

  • 问题内容: 我正在尝试执行一个当前在phpMyAdmin中可用的查询,但是使用MySqlAdapter在.NET中执行该查询时不起作用。这是Sql语句。 它使用@rownum对从我的内部标量查询返回的每个不同的行进行编号。但是,如果我在.NET中使用它,则假定@rownum是一个参数并抛出异常,因为我没有定义它。 关于如何解决这个问题的任何想法?还是我获取行号的可能方法? 问题答案: 我发现此博客