从Properties文件中读取Maven SCM url值

时间:2015-04-25 12:30:42

标签: java maven svn

我的pom.xml的scm配置如下

<scm>
 <url>${my.scm.url}</url>
</scm>

我有一个属性文件,我正在使用property-maven-plugin阅读,其值为$ {my.scm.url},而且我还使用buildnumber-maven-plugin从SVN获取最新版本。

问题是buildnumber-maven-plugin抛出了无效的scm url错误但是,当我用我的svn repo的实际url替换$ {my.scm.url}时,它运行得很好。

如何在不必硬编码scm url的情况下实现成功执行?

PS:我使用:mvn clean install command运行构建。

2 个答案:

答案 0 :(得分:2)

问题可能是由于插件运行的顺序。以下应该有效:

  1. public class Main { private static final class NumAndDate { private final int num; private final Date date; NumAndDate(int num, Date date) { this.num = num; this.date = date; } } public static final class NumAndDateComparator implements Comparator<NumAndDate> { @Override public int compare(NumAndDate r1, NumAndDate r2) { int value = 0; value = r1.num - r2.num; if (value == 0 && !isValueNull(r1.date, r2.date)) value = r1.date.compareTo(r2.date); return value; } private boolean isValueNull(Date date, Date date2) { return date == null || date2 == null; } } public static void main(String[] args) { NumAndDate[] array = { new NumAndDate(0, new Date(0)), new NumAndDate(0, new Date(1)), new NumAndDate(0, null) }; Random random = new Random(); for (int i = 0; i < 100; i++) { for (int j = 0; j < 10000; j++) { List<NumAndDate> list = new ArrayList<>(); int[] arr = new int[i]; for (int k = 0; k < i; k++) { int rand = random.nextInt(3); arr[k] = rand; list.add(array[rand]); } try { Collections.sort(list, new NumAndDateComparator()); } catch (Exception e) { System.out.println(arr.length + " " + Arrays.toString(arr)); return; } } } } } 绑定到properties-maven-plugin阶段
  2. AFTER POM中的插件配置,添加initialize插件
  3. AFTER 前两个插件,放置buildnumber-maven-plugin插件(默认绑定到buildnumber-maven-plugin阶段)。
  4. 现在所有3个插件都应该以正确的顺序运行(您可以从日志中查看)。或者,您可以绑定到不同的阶段以确保它们以正确的顺序运行,但上述应该足够并且符合initialize phase的目标(初始化构建状态,例如设置属性或创建目录)。

答案 1 :(得分:0)

因为你没有发布POM文件,我猜了一下。

显然,顺序很重要,你必须首先加载属性。也就是说,看mojo,我不确定设置属性是否等同于基本上设置-D。

如果您执行了mvn -Dscm.url = clean install,则该值将存在,因为它被定义为mvn JVM。根据$ {scm.url}的评估点,如果它在属性mojo有机会运行之前,那就太晚了。

如果使用可以在 mvn调用之前加载属性的CI工具(即Jenkins,Hudson),则定义该变量。

我已经为构建使用了buildNumber mojo,因为我为自己的快照工件自动生成了buildNumbers。事情顺序发生了:

  1. 属性文件从Jenkins master下载到此作业的slave
  2. Jenkins插件将属性文件加载到作业中
  3. maven build开始,在调用mvn之前已经定义了构建号(再次,表现得像-D)并且我的buildNumber被合并到我的工件版本中
  4. buildNumber mojo导致属性文件的buildNumber增加
  5. 将属性文件复制回Jenkins master
  6. 我还想在maven中加载属性文件并让它“动态”更新工件ID,但到那时,Maven已经评估过;因此,我必须事先做好。

    希望这有帮助。