【问题标题】:How to tell ant to build using a specific javac executable?如何告诉 ant 使用特定的 javac 可执行文件进行构建?
【发布时间】:2011-12-11 13:12:08
【问题描述】:

如何告诉ant 从命令行使用特定的 javac 可执行文件?

我在我们分发的一个库中安装了 gcj,它是 gcc 的一部分,我希望有一个基于它构建的特定 Java 软件。但是,它似乎只是使用了 system-gcc,并且诸如“-Dbuild.compiler”之类的选项似乎希望我指定某种 Java 类而不是文件路径。

我希望在 Makefiles 中有类似于 CC 的东西。

我确定这很简单,但我只是愚蠢。


为了清楚起见,我想尽可能避免自己编辑构建文件。有没有一些标准的方法来简单地在命令行上指定编译器到 ant?我不介意构建文件在某种意义上“表现良好”的假设。

【问题讨论】:

    标签: java ant build executable javac


    【解决方案1】:

    如果您使用的是 Ant 1.6 或更高版本,则可以设置 javac 属性 fork="yes"。这使您能够在使用 jikes、jvc、gcj、sj 或您正在使用的任何 javac 版本时指定可执行文件的路径。

      <javac srcdir="${src}"
             destdir="${build}"
             fork="yes"
             executable="/opt/java/jdk1.1/bin/javac"
             compiler="javac1.1"
      />
    

    【讨论】:

    • 这是一个很好的建议,但这是在实际的 ant 文件中指定可执行文件,而不是在命令行中
    • @bakoyaro。这很容易解决,使用可执行文件的属性,然后使用 -D 从命令行传递它(例如,-Dmyjavacpath=whatever 将设置 ${myjavacpath} 变量
    • @Matteo 请查看我发布的这个问题的答案。
    【解决方案2】:

    调用 ant 时的 -D 参数将使用 Ant 脚本内部命令行中的属性。它的使用形式是:

    ant -Dmyvar=true

    其中myvar 是属性名称,true 是您要在脚本中使用的值。

    那么最简单的方法是为您的 javac 可执行属性使用一个属性。

     <target name="compile">  
       <javac srcdir="${src}"
         destdir="${build}"
         fork="${fork}"
         executable="${javac.executable}"
         compiler="${compiler}"/>  
     </target>
    

    然后在命令行上你可以调用:

    ant compile -Djavac.executable=/usr/bin/local/jdk/javac -Dsrc=/home/src -Dbuild=/home/build -Dcompiler=javac1.6 -Dfork=true
    

    【讨论】:

      【解决方案3】:

      来自javac task page

      可以使用不同的编译器。这可以指定为 要么设置全局 build.compiler 属性,这将影响 整个构建过程中的所有任务,通过设置编译器 属性,特定于当前任务或使用嵌套 实现的任何类型定义或组件定义类型的元素 org.apache.tools.ant.taskdefs.compilers.CompilerAdapter。有效值 对于 build.compiler 属性或编译器属性是:

      • classic(JDK 1.1/1.2的标准编译器)——javac1.1和javac1.2可以用作别名。
      • modern(JDK 1.3/1.4/1.5/1.6/1.7 的标准编译器)——javac1.3 和 javac1.4 和 javac1.5 和 javac1.6 和 javac1.7(从 Ant 1.8.2 开始)可以用作别名。
      • jikes(Jikes 编译器)。
      • jvc(Microsoft SDK for Java / Visual J++ 的命令行编译器)- microsoft 可以用作别名。
      • kjc(kopi 编译器)。
      • gcj(来自 gcc 的 gcj 编译器)。
      • sj(赛门铁克 java 编译器)- 赛门铁克可用作别名。
      • extJavac(在自己的 JVM 中运行现代或经典)。

      按照我的阅读方式,您需要编写一个实现 CompilerAdapter 并使用您的编译器的类。然后 typedef 该任务并在 javac 编译器属性中使用它。

      【讨论】:

      • 实际上,据我了解,gcj 支持已经内置。新的 CompilerAdapter 只有在使用不在列表中的其他编译器时才需要。
      • 将其设置为 gcj 后,我能否以某种方式专门提供 gcj 可执行文件的路径?我不想使用系统范围的 gcj。
      【解决方案4】:

      我以前做过类似的事情,使用 Ant Exec 任务。见http://ant.apache.org/manual/Tasks/exec.html

      它允许您调用特定的系统命令。在我们的例子中,我们需要调用 Delphi(不要问)来为特定项目构建一些 DLL。 exec 命令还允许您调用 gcj 而不是 javac。

      【讨论】:

      • fork="yes" 选项似乎更简洁。生活和学习!
      猜你喜欢
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2020-10-27
      • 1970-01-01
      • 2016-07-08
      • 2018-09-24
      • 1970-01-01
      相关资源
      最近更新 更多