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

411

我收到以下警告:

[javac] build.xml:9: warning: 'includeantruntime' was not set, 
defaulting to build.sysclasspath=last; set to false for repeatable builds
这是什么意思?
7个回答

402

Ant运行时

只需设置includeantruntime="false"

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

如果你需要多次使用javac-task,你可能想考虑使用PreSetDef来定义自己的javac-task,并始终将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运行时库;默认为yes,除非设置了build.sysclasspath。通常最好将此设置为false,以使脚本的行为不会受到其运行环境的影响。


Apache Ant(TM) 版本 1.8.2,编译于2010年12月20日。 - user496949
如果您需要在类路径中设置Ant运行时,请将其设置为yes/true,否则设置为no/false。我猜您不需要它。 - Daniel Kutik
6
+1,很好的答案。我只希望能够在构建文件的某个位置设置它一次,而不是在每个javac调用中都添加它... - Jonik
1
它被设置为True时,它表示什么? - Lorenzo Lerate
是否在类路径中包含Ant运行时库;默认为是,除非设置了build.sysclasspath。通常最好将其设置为false,这样脚本的行为就不会受到其运行环境的影响。 - Daniel Kutik

75

正如@Daniel Kutik提到的那样,presetdef 是一个不错的选择。尤其是当你在一个拥有许多build.xml文件的项目中工作时,这些文件可能无法编辑或者不想编辑(例如来自第三方的文件)。

要使用presetdef,请在您的顶层build.xml文件中添加以下几行:

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

现在所有后续的 javac 任务都将从本质上继承 includeantruntime="false"。如果您的项目确实需要 ant 运行时库,可以将它们明确添加到构建文件中,或者设置 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元素内部。 - saxman
@jwfearn:是否可以使用类似的“presetdef”技巧来处理非内置的Ant任务?我已经尝试过对“scalac”进行操作,但是由于较低级别的“build.xml”文件必须手动定义“scalac”任务,它们会覆盖我在顶层设置的任何内容。 - Stuart Golodetz
2
请注意,使用presetdef会导致ant警告javac任务已被重新定义。在每个javac任务中添加includeantruntime可以避免这种情况。我不知道警告的缺点。但对于需要“干净构建”的人来说可能很有用。 - mikijov
是的,presetdef 给出了“试图覆盖旧的 javac 任务定义”的警告。 - mike jones

67

Chet Hosey这里进行了很好的解释:

历史上,Ant总是在javac任务可用的类路径中包含其自己的运行时。因此,任何与Ant一起包含的库和任何对于Ant可用的库都自动包含在您的构建类路径中,无论您是否喜欢。

人们认为这可能不是大多数人想要的,所以现在有了一个选项。

如果您选择“true”(对于includeantruntime),那么至少您知道您的构建类路径将包括Ant运行时。如果您选择“false”,则意味着您接受了旧版本和1.8+之间的构建行为将发生变化的事实。

尽管您看到了这个警告而感到烦恼,但如果您的构建完全崩溃,您会更加不开心。保持这种默认行为可以使未修改的构建文件在Ant的不同版本之间始终能够工作一致。


3
我一直认为这是最傻的功能/消息。谁会想在他们的配置管理工具中使用“可重复构建”的功能呢? ;) - karmakaze
1
这个答案似乎是唯一一个告诉我们警告实际含义的。 - llf

27

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>

6
如果您喜欢从命令行工作,那么快速的答案是执行:

`

export ANT_OPTS=-Dbuild.sysclasspath=ignore

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


这对我帮助很大。我正在使用 set ANT_OPTS=-Xms40M -Xmx512M -Dbuild.sysclasspath=ignore - Paul Vargas
我遇到了一个蚂蚁问题 - deepakl.2000

6

在您的build.xml文件中使用<property name="build.sysclasspath" value="last"/>

有关更多详细信息,请在Ant javac中搜索includeAntRuntime

其他可能的值可以在此处找到


-3
我遇到了同样的问题,我在程序和功能中检查了一下。有一个更新安装了jdk1.8,这与我在eclipse中使用的旧设置(jdk1.6.0)不兼容。 我安装了那个更新。 现在,我的ant项目构建成功了。
试试吧,希望这会有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接