8

作为一个实验,我们想在 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 时,我得到了无法找到适配器的预期错误,并且通过将 ecj-3.5.jar 添加到 Eclipse 面板中的类路径中,我可以按预期编译我的代码。我相信现代蚂蚁的命令行中的“-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:我们现在已经从 ant 迁移到 maven。build.xml 脚本遇到了复杂性,需要一种新的方法。任何需要选择做什么的人——除了琐碎的项目外,不要走 ant4eclipse 路径。


2012-11-30:一年过去了,maven 的体验还是不错的。思维方式有很多怪癖和变化,但大多数在上下文中是有意义的。Maven 可以轻松地指定单个项目的编译器级别。我们正在考虑使用 ecj 代替 javac(出于多种原因),但对于大多数用途来说,javac 效果很好。

4

2 回答 2

12

一种方法是在使用 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 任务文档。请注意,这两种解决方案都只能从 Ant 1.8 开始工作。

于 2010-03-02T15:17:58.120 回答
1

阅读通过 Java 运行 Ant。我认为您可以编写一个简单的包装器来正确设置类路径并将您的 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>

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

于 2010-03-03T17:29:49.010 回答