1

我正在尝试在基于构建器的 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 ...

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

4

2 回答 2

1

我终于在构建器邮件列表的帮助下让它工作了。对于任何感兴趣的人:这里提到的示例包含一个问题。这个:

compile.from generate

应该:

compile.from generate.to_s

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

于 2011-08-27T15:10:30.330 回答
0

您通过调用“附加”项目中的父项目来导致循环依赖。在那一行: Java.classpath << projects('generator')

也许您应该将所有内容放在同一水平上,这也是示例所显示的。在这种情况下,您的“生成”引用也不可用,因为它在“附加”范围内。

像这样的东西(未经测试):

  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
于 2011-08-17T13:37:48.720 回答