从_within_ build.xml完全指定Eclipse编译器

时间:2010-03-02 14:57:01

标签: java ant javac

作为一项实验,我们希望在Java 6的运行时版本而不是JDK上使用Eclipse java编译器(从eclipse.org下载的ecj-3.5.jar)构建我们的产品,据我所知,它是一个将此jar添加到ant类路径,并将build.compiler属性设置为指向适配器的问题。

包括

<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter" />

在我的build.xml中并使用JRE调用ant,我得到了无法找到适配器的预期错误,并且通过在Eclipse面板中的类路径中添加ecj-3.5.jar,我可以按预期编译我的代码。我相信使用现代蚂蚁命令行中的“-lib foo.jar”可以使用相同的功能。

现在,我想从 build.xml中指定我希望我的类路径上的ecj-3.5.jar满足上述要求。我们已经可以使用ant任务执行此操作,因此我认为这是可能的。

所以问题是:如何添加到javac使用的类路径,以便从build.xml中找到编译器?


看来即将推出的ant4eclipse 1.0包含了Eclipse编译器(我想用它来实现),所以通过升级到它(从0.5开始)可以解决我们遇到的问题。


2010-09-24:Ant4Eclipse仍在M4,但没有说明发布的时间。


2011-12-01:我们现在已经从蚂蚁迁移到了maven。 build.xml脚本遇到了复杂问题,需要采用新方法。任何人都需要选择做什么 - 除了琐碎的项目之外,不要去ant4eclipse路径。


2012-11-30:一年后,maven的经历仍然很好。思维方式有很多怪癖和变化,但大多数情况在上下文中都有意义。 Maven可以轻松地在单个项目上指定编译器级别。我们正在研究使用ecj而不是javac(出于几个原因)但是对于大多数用途来说,javac运行良好。

2 个答案:

答案 0 :(得分:11)

一种方法是在使用javac时指定componentdef的引用。

<componentdef name="ecj" 
              classname="org.eclipse.jdt.core.JDTCompilerAdapter" 
              classpath="ecj-3.7.1.jar" />

<javac ....>
  <ecj/>
</javac>

另一种选择是设置build.compiler或javac的编译器属性,然后为javac指定编译器类路径。这是一个正常的路径,就像保存用于加载编译器适配器的类路径一样。

<javac compiler="org.eclipse.jdt.core.JDTCompilerAdapter" ....>
  <compilerclasspath>
     ...
  </compilerclasspath>
</javac>

有关详细信息,请参阅Ant手册中的javac task文档。请注意,这两种解决方案仅适用于Ant 1.8以上。

答案 1 :(得分:1)

阅读Running Ant via Java。我想你可以写一个简单的包装器来正确设置一个类路径并将你的jar文件添加到生成的类路径中。

这里我只是从上面的链接中剪切并粘贴样本,并将您感兴趣的库添加到类路径中:

<java
        classname="org.apache.tools.ant.launch.Launcher"
        fork="true"
        failonerror="true"
        dir="${sub.builddir}"
        timeout="4000000"
        taskname="startAnt"
>
    <classpath>
        <pathelement location="${ant.home}/lib/ant-launcher.jar"/>
        <pathelement location="/path/to/ecj-3.5.jar"/>
    </classpath>
    <arg value="-buildfile"/>
    <arg file="${sub.buildfile}"/>
    <arg value="-Dthis=this"/>
    <arg value="-Dthat=that"/>
    <arg value="-Dbasedir=${sub.builddir}"/>
    <arg value="-Dthe.other=the.other"/>
    <arg value="${sub.target}"/>
</java>

我认为您甚至可以重复使用相同的构建文件,只需将不同的目标作为入口点。