【问题标题】:Access a maven-ant-tasks dependency's properties (declared in its pom) from ant从 ant 访问 maven-ant-tasks 依赖项的属性(在其 pom 中声明)
【发布时间】:2015-01-07 13:42:27
【问题描述】:

我正在为一个项目使用 maven-ant-tasks,我遇到了需要从 Ant 引用在依赖项的 pom 中声明的属性。

具体来说,我依赖 waffle-jna:

<property name="waffle-jna-version" value="1.7" />
<artifact:dependencies ...>
  <dependency groupId="com.github.dblock.waffle" artifactId="waffle-jna" version="${waffle-jna-version}">
</artifact:dependencies>

in its pom.xml, com.github.dblock.waffle:waffle-jna declares:

<properties>
  <guava.version>18.0</guava.version>
  <jna.version>4.1.0</jna.version>
  <servlet.version>2.5</servlet.version>
  <slf4j.version>1.7.7</slf4j.version>
</properties>

我需要找出我正在构建的 Waffle 版本使用的 jna 和 slf4j 版本,然后添加一些具有相同版本的相关依赖项(例如,对 slf4j-simple 的运行时依赖项)。

我知道我可以改为在 maven-ant-tasks 中排除 Waffle 的依赖项,然后在顶层使用我自己的版本声明它们,但我更愿意遵循 Waffle 版本使用的版本我正在使用。

有没有办法告诉 maven-ant-tasks 将依赖 pom 中声明的属性暴露给 Ant?


我尝试导入 pom,对 pom 有额外的依赖加上 &lt;artifact:pom&gt;:

<artifact:dependencies>
  <dependency groupId="com.github.dblock.waffle" artifactId="waffle-jna" version="${waffle-jna-version}" type="pom"/>
</artifact:dependencies>

<!-- Expose the Waffle POM so we can reference its version attributes -->
<artifact:pom file="${com.github.dblock.waffle:waffle-jna:pom}" inheritAllProperties="true"/>

...但是虽然它正确设置了 pom 路径的属性:

ant -debug
....
Setting project property: com.github.dblock.waffle:waffle-jna:pom -> /home/craig/.m2/repository/com/github/dblock/waffle/waffle-jna/1.7/waffle-jna-1.7.pom
Adding reference: com.github.dblock.waffle:waffle-jna:pom
....
[artifact:pom] Maven Ant Tasks version: 2.1.3

BUILD FAILED
/home/craig/projects/2Q/pgjdbc/build.xml:148: java.lang.NullPointerException
        at java.util.Hashtable.get(Hashtable.java:334)
        at org.apache.tools.ant.Project$AntRefTable.getReal(Project.java:2409)
        at org.apache.tools.ant.Project$AntRefTable.access$000(Project.java:2394)
        at org.apache.tools.ant.Project.addReference(Project.java:1973)
        at org.apache.maven.artifact.ant.Pom.doExecute(Pom.java:423)
        at org.apache.maven.artifact.ant.AbstractArtifactTask.execute(AbstractArtifactTask.java:751)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
....

所以我束手无策。我宁愿全部使用 Maven,但不幸的是,目前这不是我可以单方面做出的决定。

【问题讨论】:

    标签: maven ant properties maven-ant-tasks


    【解决方案1】:

    上面你的 pom import 语句:

    <!-- Expose the Waffle POM so we can reference its version attributes -->
    <artifact:pom file="${com.github.dblock.waffle:waffle-jna:pom}" inheritAllProperties="true"/>
    

    maven ant-tasks pom documentation 中的内容略有不同:

    <artifact:pom id="mypom" file="pom.xml" />
    

    您缺少id="mypom" 分配。

    它会让你按名称引用属性,例如${mypom.properties.jna.version}

    请注意,您必须明确指定属性节点的路径;属性不是直接添加到mypom 下,而是出现在mypom.properties 下,镜像pom.xml 结构。 (这也意味着从父 pom 继承的属性不会被暴露)。

    【讨论】:

    • 谢谢 - 丢失的 id 是 NPE 的原因。有了这个修复,构建继续进行,但它似乎仍然没有暴露嵌套属性;将 id="waffle-pom" 添加到上述 pom 声明中,然后 &lt;dependency groupId="org.slf4j" artifactId="slf4j-simple" version="${waffle-pom.slf4j.version}"/&gt; 导致 Downloading: org/slf4j/slf4j-simple/${waffle-pom.slf4j.version}/slf4j-simple-${waffle-pom.slf4j.version}.pomant -debug 不显示在 artifact:pom 运行后注册的任何属性,只是 waffle-pom 自身的注册。
    • 啊哈。您必须明确指定属性节点,它是一个 XML 路径。所以mypom.properties.jna.version 代表&lt;project&gt;&lt;properties&gt;&lt;jna.version&gt;4.1.0&lt;/jna.version&gt;...&lt;/properties&gt;...&lt;/project&gt;。编辑以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 2014-05-25
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多