0

我正在为一个项目使用 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>

pom.xml其中com.github.dblock.waffle:waffle-jna声明

<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 加上<artifact:pom>

<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,但不幸的是,目前这不是我可以单方面做出的决定。

4

1 回答 1

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 文档中的内容略有不同:

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

你错过了id="mypom"任务。

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

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

于 2014-11-11T05:04:05.667 回答