maven antrun 插件内的父属性

问题描述 投票:0回答:2

有一个多模块项目。在孩子内部,我需要做一些复杂的事情(集成测试与部署到应用程序服务器等)。所以有一个集成测试子模块,从这个模块我需要父模块的根才能到达其他模块。我不想使用“..”。 Integrationtest POM中有一个属性:

<properties>
 <main.basedir>${project.parent.basedir}</main.basedir>
    ...
</properties>

还有一个antrun插件,内容如下:

<plugins>
 <plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <executions>
   <execution>
    <id>render-parameter-sql</id>
    <phase>validate</phase>
    <goals>
     <goal>run</goal>
    </goals>
    <configuration>
     <tasks>
      <echoproperties/>
     </tasks>
    </configuration>
   </execution>
  </executions>
 </plugin>
</plugins>

在输出中,main.basedir 未解析:

main:
[echoproperties] #Ant properties
[echoproperties] #Thu Oct 28 09:32:13 CEST 2010
[echoproperties] ant.core.lib=C\:\\Users\\gaborl\\.m2\\repository\\org\\apache\\ant\\ant\\1.8.1\\ant-1.8.1.jar
...
[echoproperties] main.basedir=${project.parent.basedir}
[echoproperties] maven.dependency.antlr.antlr.jar.path=C\:\\Users\\gaborl\\.m2\\repository\\antlr\\antlr\\2.7.6\\antlr-2.7.6.jar

在变得非常生气之后,我决定问你如何解决这个问题......

maven-2 multi-module maven-antrun-plugin
2个回答
11
投票

我不知道确切地为什么

${project.parent.basedir}
在AntRun中不“可用”,也许它只是不受支持(请参阅http://jira.codehaus.org/browse/MNG-3597)。

这是一个使用 gmaven 的可怕解决方法:

<plugin>
  <groupId>org.codehaus.gmaven</groupId>
  <artifactId>gmaven-plugin</artifactId>
  <version>1.3</version>
  <executions>
    <execution>
      <id>set-custom-property</id>
      <phase>validate</phase>
      <goals>
        <goal>execute</goal>
      </goals>
      <configuration>
        <source>
          project.properties.setProperty('main.basedir', project.parent.basedir.toString())
        </source>
      </configuration>
    </execution>
  </executions>
</plugin>
<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.6</version>
  <executions>
    <execution>
      <id>render-parameter-sql</id>
      <phase>validate</phase>
      <goals>
        <goal>run</goal>
      </goals>
      <configuration>
        <target>
          <echo>project.artifactId        : ${project.artifactId}</echo>
          <echo>project.parent.basedir    : ${project.parent.basedir}</echo>
          <echo>main.basedir              : ${main.basedir}</echo>
          <echo>project.basedir           : ${project.basedir}</echo>
          <echo>project.build.directory   : ${project.build.directory}</echo>
        </target>
      </configuration>
    </execution>
  </executions>
</plugin>

我并不为此感到自豪,但它有点“有效”(如果父 basedir 路径的字符串表示形式适合您):

$ mvn 验证
[信息] 正在扫描项目...
...
[信息] --- maven-antrun-plugin:1.6:run (render-parameter-sql) @ Q4040778 ---
[INFO] 执行任务

主要的:
     [回声] 项目.artifactId:Q4040778
     [echo] 项目.parent.basedir : ${project.parent.basedir}
     [echo] main.basedir : /home/pascal/Projects/stackoverflow
     [回声]project.basedir:/home/pascal/Projects/stackoverflow/Q4040778
     [echo]project.build.directory:/home/pascal/Projects/stackoverflow/Q4040778/target
[INFO] 已执行的任务
...

但我需要说的是,你想要做的事情(从这个模块我需要父级的根才能到达其他模块)是一种不好的做法,模块应该是自包含的,而不是紧密耦合的。

我不建议使用我发布的内容:)


0
投票

您是否考虑过使用

maven-resources-plugin
? 我必须将多模块项目中的 jacoco 生成的文件从子模块(聚合来自所有其他子模块的 jacoco 文件)复制到父目标文件夹,并且在将其添加到子模块 pom.xml 时,后续工作效果很好

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
      <outputDirectory>${project.parent.basedir}/target/site/jacoco-aggregate</outputDirectory>
      <resources>
        <resource>
          <directory>${project.basedir}/target/site/jacoco-aggregate</directory>
        </resource>
      </resources>
    </configuration>
    <executions>
      <execution>
        <id>copy-resources</id>
        <goals>
          <goal>copy-resources</goal>
        </goals>
        <phase>install</phase>
      </execution>
    </executions>
  </plugin>
© www.soinside.com 2019 - 2024. All rights reserved.