ant警告:“未设置'includeantruntime'”


397

我收到以下警告:

[javac] build.xml:9: warning: 'includeantruntime' was not set, 
defaulting to build.sysclasspath=last; set to false for repeatable builds

这是什么意思?

Answers:


388

蚂蚁运行时

只需设置includeantruntime="false"

<javac includeantruntime="false" ...>...</javac>

如果必须javac多次使用-task,则可能需要考虑使用PreSetDef定义自己的javac总是设置的任务includeantruntime="false"

额外细节

http://www.coderanch.com/t/503097/tools/warning-includeantruntime-was-not-set

这是由于Ant 1.8中引入的功能不当引起的。只需将名称的属性添加到javac任务,将其设置为false,就可以忘记它曾经发生过。

http://ant.apache.org/manual/Tasks/javac.html中

是否在类路径中包含Ant运行时库;除非设置了build.sysclasspath,否则默认为yes。通常最好将其设置为false,以便脚本的行为对运行它的环境不敏感。


Apache Ant(TM)版本1.8.2于2010
user496949

因此,如果需要在类路径中使用ant运行时,请将其设置为yes / true,否则将其设置为no / false。我想你不需要它。
Daniel Kutik

5
+1,好答案。我只是希望我能设置一旦某处构建文件,而不是乱抛垃圾每javac的调用它...
Jonik

1
在任何情况下将其设置为True是什么?
罗伦佐·莱拉特

“是否在类路径中包含Ant运行时库;除非设置了build.sysclasspath,否则默认为yes。通常最好将其设置为false,以使脚本的行为对运行它的环境不敏感。 ”
丹尼尔·库蒂克

72

正如@Daniel Kutik提到的,这presetdef是一个不错的选择。特别是如果一个人正在处理一个项目,build.xml而该项目包含许多无法或不希望编辑的文件(例如,来自第三方的文件)。

要使用presetdef,请将这些行添加到顶级build.xml文件中:

  <presetdef name="javac">
    <javac includeantruntime="false" />
  </presetdef>

现在,所有后续javac任务将基本上继承includeantruntime="false"。如果您的项目确实确实需要ant运行时库,则可以将它们显式添加到构建文件中或set includeantruntime="true"。后者也将摆脱警告。

javac如果需要,后续任务仍然可以显式更改它,例如:

<javac destdir="out" includeantruntime="true">
  <src path="foo.java" />
  <src path="bar.java" />
</javac>

我建议您不要使用ANT_OPTS。它可以工作,但不能达到警告的目的。该警告告知一个人的构建在另一系统上的行为可能有所不同。使用ANT_OPTS使这种可能性更大,因为现在每个系统都需要以ANT_OPTS相同的方式使用。而且,ANT_OPTS将在全球范围内应用,在您的所有项目中故意禁止发出警告


1
非常适合用多个javac任务改造现有的Ant构建文件。Presetdef元素就位于project元素内部。
萨克斯曼

@jwfearn:是否可以将类似presetdef技巧用于非内置的Ant任务?我已经尝试过使用scalac,但是由于下层build.xml文件必须手动定义scalac任务,因此它们会覆盖我在顶层设置的内容。
斯图尔特·戈洛德兹

2
请注意,使用presetdef会引起蚂蚁警告,说明已重新定义了javac任务。对每个javac任务使用addind includeantruntime可以避免这种情况。我不知道该警告的缺点。但这对于“需要”干净建筑的人可能有用。
mikijov 2012年

是的,presetdef提供了“试图覆盖任务javac的旧定义”
迈克·琼斯

62

Chet Hosey 在这里写了一个很好的解释:

从历史上看,Ant始终将自己的运行时包含在javac任务可用的类路径中。因此,无论您是否喜欢,Ant附带的任何库以及可用于ant的任何库都会自动出现在构建的类路径中。

人们决定这可能不是大多数人想要的。所以现在有一个选择。

如果选择“ true”(对于includeantruntime),那么至少您知道您的构建类路径将包含Ant运行时。如果选择“ false”,则表示您接受以下事实:构建行为将在旧版本和1.8+之间改变。

看到此警告后,您会非常恼火,如果您的构建完全崩溃,您甚至会感到不高兴。保留此默认行为可使未经修改的构建文件在Ant版本之间始终如一地工作。


3
我一直以为这是有史以来最愚蠢的功能/消息。谁想要他们的配置管理工具中的“可重复构建”?;)
karmakaze 2012年

1
这个答案似乎是唯一可以告诉我们警告实际含义的答案。
ty

26

Daniel的回答非常完美。这是我添加到build.xml中的样本片段:

<target name="compile">
    <mkdir dir="${classes.dir}"/>
    <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false">
                                                 <!--   ^^^^^^^^^^^^^^^^^^^^^^^^^  -->
        <classpath>
            <path id="application" location="${jar.dir}/${ant.project.name}.jar"/>
            <path id="junit" location="${lib.dir}/junit-4.9b2.jar"/>
        </classpath>
    </javac>
</target>

5

如果您喜欢我从命令行进行的工作,则可以执行快速解答

export ANT_OPTS=-Dbuild.sysclasspath=ignore

然后再次运行您的ant脚本。


这对我有很大帮助。我正在使用set ANT_OPTS=-Xms40M -Xmx512M -Dbuild.sysclasspath=ignore
保罗·巴尔加斯


-3

我也面临同样的问题,我在程序和功能中签入。有一个针对jdk1.8的更新安装,它与我在eclipse中的ant的旧设置(jdk1.6.0)不兼容。我安装该更新。现在,我的ant项目正在构建成功。

尝试一下,希望对您有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.