在构建器项目中使用生成的源

时间:2011-08-17 10:57:18

标签: buildr

我正在尝试在基于buildr的java项目中使用代码生成器。我想...

  • 调用生成器
  • 编译生成的类,打包它们
  • eclipse查看生成的内容(即让.classpath包含这些内容)

我花了很多时间在谷歌上搜索一个完整的例子,但无济于事。这里的示例:https://cwiki.apache.org/confluence/display/BUILDR/How+to+generate+sources+before+compilation

给出了很多错误。这就是我尝试过的:

 define 'generator' do
    compile.with ALL_COMMON_MODULES
  end
  define 'extras' do
    p 'calling generator..'
    Java.classpath << ALL_COMMON_MODULES
    Java.classpath << projects('generator')
    Java.org.foo.generator.Main.main(['../modules/daos', 'target/generated-sources'])
    sources = FileList[_("src/main/jeannie/*.*")]
    generate = file(_("target/generated-sources") => sources).to_s do |dir|
      puts 'generating...'
      mkdir_p dir.to_s # ensure directory is created
    end
    compile.from generate
  end

给我一​​个错误:

RuntimeError: Circular dependency detected: TOP ...

所以我显然做了一件非常错误的事情。我很高兴看到一个使用代码生成的工作示例或项目。

2 个答案:

答案 0 :(得分:1)

我终于得到了buildr邮件列表的帮助。对于任何感兴趣的人:提到的示例here包含一个问题。这样:

compile.from generate

应该是:

compile.from generate.to_s

现在效果很好!如果'compile.from'指向另一个位置,buildr还会自动扩展eclipse的.classpath(以及想法,以防你使用它)。

答案 1 :(得分:0)

通过调用'extras'项目中的父项目,可以产生循环依赖。 在那一行:Java.classpath&lt;&lt;项目( '发生器')

也许你应该将所有内容放在同一级别上,这也是示例所示。 在这种情况下,您的“生成”引用将无法使用,因为它位于“额外”范围内。

像这样(未经测试):

  define "generator" do
    generate = file(_("target/generated-sources") => sources).to_s do |dir|
      p 'calling generator..'
      Java.classpath << ALL_COMMON_MODULES
      Java.classpath << projects('generator')
      Java.org.foo.generator.Main.main(['../modules/daos', 'target/generated-sources'])
      sources = FileList[_("src/main/jeannie/*.*")]
      puts 'generating...'
      mkdir_p dir.to_s # ensure directory is created
    end
    compile.with ALL
    compile.from generate
  end