【发布时间】:2011-07-03 11:14:26
【问题描述】:
我收到以下警告:
[javac] build.xml:9: warning: 'includeantruntime' was not set,
defaulting to build.sysclasspath=last; set to false for repeatable builds
这是什么意思?
【问题讨论】:
标签: java ant build javac build-tools
我收到以下警告:
[javac] build.xml:9: warning: 'includeantruntime' was not set,
defaulting to build.sysclasspath=last; set to false for repeatable builds
这是什么意思?
【问题讨论】:
标签: java ant build javac build-tools
只需设置includeantruntime="false":
<javac includeantruntime="false" ...>...</javac>
如果您必须多次使用javac-task,您可能需要考虑使用PreSetDef 来定义您自己的始终设置includeantruntime="false" 的javac-task。
来自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 是 放。通常最好将其设置为 false 所以脚本的行为不是 对所处的环境敏感 它正在运行。
【讨论】:
正如@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 将在全球范围内应用,在您的所有项目中都禁止出现警告
【讨论】:
presetdef 技巧可以用于非内置Ant 任务吗?我已经用scalac 尝试过这个,但是因为较低的build.xml 文件必须手动定义scalac 任务,它们会覆盖我在顶层设置的任何内容。
Chet Hosey写了一个很好的解释here:
从历史上看,Ant 总是在 javac 任务可用的类路径中包含自己的运行时。因此,无论您喜欢与否,Ant 包含的任何库以及任何可用于 ant 的库都会自动出现在您构建的类路径中。
决定这可能不是大多数人想要的。所以现在有一个选择。
如果您选择“true”(对于 includeantruntime),那么至少您知道您的构建类路径将包含 Ant 运行时。如果您选择“false”,则表示您接受构建行为将在旧版本和 1.8+ 之间发生变化的事实。
尽管您看到这个警告很生气,但如果您的构建完全崩溃,您会更不高兴。保持这种默认行为允许未修改的构建文件在 Ant 版本之间一致地工作。
【讨论】:
丹尼尔的回答非常完美。这是我添加到 build.xml 中的示例 sn-p:
<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>
【讨论】:
如果你喜欢我从命令行工作,快速回答正在执行
export ANT_OPTS=-Dbuild.sysclasspath=ignore
然后再次运行您的 ant 脚本。
【讨论】:
set ANT_OPTS=-Xms40M -Xmx512M -Dbuild.sysclasspath=ignore。
我遇到了同样的情况,我签入了程序和功能。有一个更新安装了 jdk1.8,它与我在 Eclipse 中的 ant 旧设置(jdk1.6.0)不兼容。 我安装那个更新。 现在,我的 ant 项目构建成功。
试试吧,希望对你有帮助。
【讨论】: