Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何告诉ant使用特定的javac可执行文件进行构建?_Java_Ant_Build_Executable_Javac - Fatal编程技术网

如何告诉ant使用特定的javac可执行文件进行构建?

如何告诉ant使用特定的javac可执行文件进行构建?,java,ant,build,executable,javac,Java,Ant,Build,Executable,Javac,我如何告诉ant使用命令行中的特定javac可执行文件 我在我们分发的库中安装了gcj,它是作为gcc的一部分构建的,我希望有一个特定的Java软件基于此构建。然而,它似乎只是使用了系统gcc,而“-Dbuild.compiler”等选项似乎希望我指定某种Java类而不是文件路径 我希望Makefiles中有类似于CC的东西 我相信这是件很简单的事,我只是在装傻 明确地说,如果可能的话,我希望避免自己编辑构建文件。是否有一些标准方法可以简单地在命令行上将编译器指定给ant?我不介意构建文件在某

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

我在我们分发的库中安装了gcj,它是作为gcc的一部分构建的,我希望有一个特定的Java软件基于此构建。然而,它似乎只是使用了系统gcc,而“-Dbuild.compiler”等选项似乎希望我指定某种Java类而不是文件路径

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

我相信这是件很简单的事,我只是在装傻


明确地说,如果可能的话,我希望避免自己编辑构建文件。是否有一些标准方法可以简单地在命令行上将编译器指定给ant?我不介意构建文件在某种意义上是“行为良好”的假设。

来自:

可以使用不同的编译器。这可以通过以下方式指定: 设置global build.compiler属性,这将影响 通过设置编译器,生成过程中的所有任务 属性,特定于当前任务或使用嵌套 实现的任何TypeDefed或ComponentDefed类型的元素 org.apache.tools.ant.taskdefs.compilers.CompilerAdapter。有效值 对于build.compiler属性或编译器属性:

  • classic
    (JDK1.1/1.2的标准编译器)–javac1.1和javac1.2可以用作别名
  • modern
    (JDK1.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中运行modern或classic)

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

如果您使用的是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 Exec任务做过类似的事情。看


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

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

ant-Dmyvar=true

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

最简单的方法是为javac可执行文件属性使用属性

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

fork=“yes”选项似乎要干净得多。活到老学到老!实际上,据我所知,
gcj
支持已经内置。新的CompilerAdapter仅在使用列表中未列出的另一个编译器时才需要。在我将其设置为gcj后,我是否可以以某种方式专门提供gcj可执行文件的路径?我不想使用系统范围的gcj。这是一个很好的建议,但这是在实际的ant文件中指定可执行文件,而不是在命令中line@bakoyaro. 使用可执行文件的属性,然后通过-D(例如,-Dmyjavacpath=which)从命令行传递它,就可以轻松解决这一问题,只要设置${myjavacpath}variabile@Matteo请看我贴出的这个问题的答案。
ant compile -Djavac.executable=/usr/bin/local/jdk/javac -Dsrc=/home/src -Dbuild=/home/build -Dcompiler=javac1.6 -Dfork=true