Apache Ant(以前称为Jakarta Ant)是一个基于XML的声明式构建工具,最初是为Java项目创建的。它提供了一组丰富的标准任务,用于执行大多数常见的构建操作,例如编译Java源代码,构建存档和运行测试。 Ant的功能可以通过自定义任务和宏进行扩展。
我们有一个通过 Ant 编译的项目,我们遇到了一些问题,人们编写的代码只能通过 eclipse 编译器编译,而不能通过常规 javac 编译,因此我们通过传递...来更改编译器
我正在编写一个ant脚本。在这个特定部分中,我需要获取当前月份以及上个月。我在想类似的事情 我正在编写一个 Ant 脚本。在这个特定部分中,我需要获取当前月份以及上个月。我在想类似的事情 <tstamp> <format property="thismonth" pattern="MMyy"/> <!-- 0210 by february 2010--> </tstamp> <!--I'd like to get 0110 (january 2010) here, but can't imagine how--> <property name="priormonth" value="?"> 我一直在阅读有关房产助手的内容,但我找不到我需要的东西。接下来我可以尝试什么? 您可以使用自定义 JavaScript scriptdef: <project default="build"> <target name="build"> <echo message="Hello world"/> <setdates/> <echo message="thismonth ${thismonth}"/> <echo message="priormonth ${priormonth}"/> </target> <scriptdef name="setdates" language="javascript"> <![CDATA[ importClass(java.text.SimpleDateFormat); importClass(java.util.Calendar); today = new Date(); cal = Calendar.getInstance(); cal.setTime(today); cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - 1); priormonth = cal.getTime(); fmt = new SimpleDateFormat("MMyy"); self.getProject().setProperty('thismonth', fmt.format(today)); self.getProject().setProperty('priormonth', fmt.format(priormonth)); ]]> </scriptdef> </project> 我确信某些正则表达式可以带来奇迹,但我会简单地创建一个自定义任务。 在您的任务中,您可以使用 getProjet().setProperty() 方法定义新属性。 类似以下内容就足够了: public class PreviousMonthTask extends Task { private String currentDate; private String propertyName; public void setCurrentDate(String currentDate) { this.currentDate = currentDate; } public void setPropertyName(String propertyName) { this.propertyName = propertyName; } @Override public void execute() throws BuildException { // calculate the previous month String previousMonth = ...; getProject().setProperty(this.propertyName, previousMonth); } } 剩下要做的就是定义一个带有类链接的属性文件: previousmonth = org.myproject.PreviousMonthTask 当您加载任务时(请参阅 Ant 文档),您只需使用以下命令调用您的任务: <previousmonth propertyName="previous" currentDate="${current}"/> ANT 的 tstamp 任务 有一个偏移元素: <tstamp> <format property="twoDaysAgo" pattern="yyyy-MM-dd" offset="-2"/> </tstamp> 这会返回两天前的时间戳。 如果您的模式是几个月,我希望您能够做同样的事情,那么偏移量可能会在几个月内起作用。 其实你可以使用: <tstamp> <format property="twoDaysAgo" pattern="yyyy-MM-dd" unit="day" offset="-2"/> </tstamp> 因此,您在前 2 个月使用: <tstamp> <format property="twoDaysAgo" pattern="yyyy-MM-dd" unit="month" offset="-2"/> </tstamp>
如何将一个 Gradle 脚本导入到另一个 Gradle 脚本中?
我有一个复杂的 Gradle 脚本,它包含了围绕构建多个 NetBeans 项目并将其部署到多个环境的大量功能。 该脚本运行得很好,但本质上......
我有一个单元测试,其中我静态定义了一个相当大的字节数组(超过8000字节)作为我不想每次运行单元测试时读取的文件的字节数据。 私有静态最终由...
javac 参数 memoryInitialSize 和 memoryMaximumSize 的默认值是多少?它是否从 env/os 属性或设置中获取这些值? javac参数memoryInitialSize和memoryMaximumSize的默认值是多少?它是否从 env/os 属性或设置中获取这些值? <javac srcdir="@{srcdir}" destdir="@{destdir}" includeantruntime="@{includeantruntime}" debug="@{debug}" deprecation="@{deprecation}" target="@{target}" source="@{target}" fork="@{fork}" executable="@{executable}" memoryInitialSize="@{memoryInitialSize}" memoryMaximumSize="@{memoryMaximumSize}"> <compilerarg compiler="${build.compiler}" line="${build.compiler.args}"/> <javac-elements/> </javac> 文档说,如果 javac 在外部运行,ant 将使用标准 VM 内存设置。正如 dkatzel 在他的评论中指出的那样,这些 VM 设置将在here 进行讨论。
我想忽略特定文件引发的 ant 警告。 为什么有警告并不是强制性的,我只想找到一种方法,忽略来自特定类别的警告...
我有一个项目 git clone --depth 1 --branch v2.3.30 https://github.com/apache/freemarker.git 并想从源代码构建它。为此我发出命令 蚂蚁罐 具有以下输出 └─$ 蚂蚁-v...
我正在寻找一个可以让我切换正在运行的 Java 实现的工具,例如 Ruby 的 RVM(或 RBENV)。我知道 Debian 系统提供了替代机制,我可以设置
antd form.setFieldValue 未按预期工作
我正在使用 form.setFieldValue 修改包含序列号和数字组合的表单字段值。但它只需要数字部分,即使我把它们放在一起并创建了一个......
无法使用ant和闭包编译器编译javascript,因为Jquery的$未声明
我正在尝试让 Google Closure Compiler 编译我使用 Jquery 的 javascript 代码,但我不断收到变量 $ 未声明,有没有办法让它看到 $ 变量。难道是……
如何在没有 ant 的情况下从命令行编译使用 Google Webdriver 的 java 应用程序[重复]
我想编译一个使用谷歌网络驱动程序的示例代码。 我将 webdriver 保存到 /home/iyo/webdriver 中。我的代码是: 包 com.googlecode.webdriver.example; 导入 com.googlecode.webdrive...
Amazon Corretto 21 和 DITA-OT 4.2.3 的 Ant 脚本无法识别 Nashorn
我正在将自定义插件迁移到 DITA OT 4.2.3,这需要更新版本的 JDK。我们使用的是 Amazon Corretto 21.0.3.9.1。我们有一个包含 JavaScript 的 Ant 构建脚本。自从...
运行“ant test”命令时出现“java.lang.IllegalStateException: CONSTANT_info: invalid tag value [18]”如何解决?
我有一个使用apache-ant-1.10.9构建的spring项目。使用tools-2.14版本。在本地环境中运行“ant test”命令时,构建失败并收到错误消息“...
我正在从 ant 文件执行 shell 脚本。我想在日志文件“buillog-perform.txt”中捕获 shell 脚本的标准输出。 下面是我的代码摘录。我的完整版本很好。但是
包 org.apache.tools.ant.util 不存在
我正在尝试使用 maven-antrun-plugin 将 Ant 项目包装在 Maven 中。 这是我的插件配置 org.apache.maven.plugins <
是否可以在 Ant 脚本中调用或执行 Maven 目标? 假设我有一个名为“distribute”的 ant 目标,在其中我需要从另一个 pom.xml 调用 maven“编译”目标。
我正在尝试使用 ANT WAR 任务更新现有 WAR 文件内的文件。 我需要用 HDD 中的新文件替换 WAR 文件夹中的一组 xml 文件。 我正在尝试使用 ANT WAR 任务更新现有 WAR 文件内的文件。 我需要用 HDD 中的新文件替换 WAR 文件夹中的一组 xml 文件。 <war destfile="myApp.war" update="true" > <zipfileset dir="<PathToStubsFolderOnHDD>" includes="**/*.xml" prefix="<PathToStubsFolderInWAR>"/> </war> 如果原始 WAR 没有同名的 xml,这可以正常工作。但是,如果原始 WAR 包含同名的 xml; WAR 任务不会使用 HDD 中的文件更新它们。 ANT WAR 任务文档如下: 更新 |指示是否更新或覆盖目标文件(如果已存在)。默认为“假”。 重复|发现重复文件时的行为。有效值为“添加”、“保留”和“失败”。默认值为“添加”。 如果我使用 update="false";原始 WAR 中的所有其他文件都将被删除,仅存储新的 xml。 使用duplicate="add"也没有任何效果。 关于如何实现这一点有什么建议吗? 似乎使用 update=true 选项,war 文件比您要更新的文件新。 有人建议应用带有“0”的touch任务来解决该问题。 zip 任务仅检查您希望添加到现有 zip 的源文件是否比该 zip 更新。解决方法是在添加之前先<touch millis="0" /> zip 文件。 或者你可以做相反的事情: 在对 XML 文件执行 touch 任务之前执行 war 可以实现 工作。 谢谢爱藤! 这是完整的 ANT 脚本: <target name = "UpdateWARWithStubs" description="Updates WAR file with files from Stub folder"> <!-- Use touch to set modification time of all stubs to current time. This will force war task to update stub files inside the war --> <tstamp> <format property="touch.time" pattern="MM/dd/yyyy hh:mm aa"/> </tstamp> <touch datetime="${touch.time}"> <fileset dir="${path.to.stubs.on.hdd}" /> </touch> <war destfile="myApp.war" update="true"> <zipfileset dir="${path.to.stubs.on.hdd}" prefix="${path.to.stubs.in.war}"/> </war> </target> 这是我替换 zip(.war) 文件中现有文件的解决方案。初始状态是我有 build.xml 来为 Tomcat6 服务器编译和打包 mywebapp.war 。 Tomcat7 服务器需要在 war 文件中进行少量配置更改。 项目子文件夹 web 和 webT7 是 CVS 控制的文件夹,我不想无缘无故地触及时间戳。以下技巧可以完成这项工作。 照常编译并创建 web/WEB-INF/lib/mywebapp.jar 文件 目标“war”从 Web 文件夹创建 tomcat6 存档 webT7 子文件夹中有一些特定文件,例如 META-INF/context.xml 和 WEB-INF/web.xml 文件,我必须针对每个 tomcat 版本进行一些修改。 创建 mywebapp.war.zip 文件的副本 将文件从 webT7 子文件夹复制到新的构建临时文件夹,不要使用preservelastmodified属性!这为每个文件提供了一个新的时间戳,因此它的触摸无需单独的触摸命令。 故障安全触摸新的 zip 以放置过去的时间戳,这可以确保 zip 更新正常工作。 使用 zip 任务更新 mywebapp.war_T7.zip 内容,它应该替换现有文件,因为我们复制了它们而没有保留原始时间戳。 我将 webT7 内容复制到临时构建文件夹的原因是内容管理系统。我不想无缘无故地更改原始存储库文件的时间戳。无论我使用什么 Tomcat 目标,其他所有编译、jar、war 目标始终相同。 Zip update="true" 属性如前所述不会替换文件,仅当 zip 的文件比我们提供的文件旧时才会更新。如果我有 web/config.jsp(2013-01-21 14:01:01) 和 webT7/config.jsp(2012-12-21 15:02:03) 文件,这可能会带来问题。文件未被替换。 build.xml 文件中的片段 <target name="war" depends="compile,jar" description="Create a .war file"> <delete file="${name}.war.zip" /> <zip destfile="${name}.war.zip" basedir="./web/" excludes=" **/CVS* " /> </target> <target name="warT7" depends="war" description="Create a .war file for Tomcat7"> <delete dir="${build}" /> <mkdir dir="${build}" /> <delete file="${name}.war_T7.zip" /> <copy file="${name}.war.zip" tofile="${name}.war_T7.zip" overwrite="true" preservelastmodified="true" /> <copy todir="${build}" overwrite="true"> <fileset dir="./webT7" /> </copy> <touch datetime="01/31/1981 01:00:00 AM" file="${name}.war_T7.zip" /> <zip destfile="${name}.war_T7.zip" update="true"> <zipfileset dir="${build}" prefix="" /> </zip> <delete dir="${build}" /> </target> 也许最简单的方法是将 war 分解到临时目录,进行更改,然后重建 war。不可否认,这不太好。 这两种触摸选项都不适合我。由 ant 脚本中的 Maven 工件创建的原始 war 文件可能与此有关。最终将 war 文件重新打包成临时文件并覆盖原始 war 文件,如下所示: <target name="update-properties"> <war destfile="target/${war.name}temp" needxmlfile='false'> <zipfileset src="target/${war.name}" includes="**/*" excludes="${path.to.properties.in.war}" /> <zipfileset file="${path.to.new.properties}" fullpath="${path.to.properties.in.war}" /> </war> <move file="target/${local.war.name}temp" tofile="target/${local.war.name}"/> <delete file="target/${local.war.name}temp"/> </target> 其中 ${path.to.properties.in.war} 可以类似于 "WEB-INF/classes/META-INF/spring/database.properties" 我很有钱,+8613520320431。 我需要女孩,支付$6000/3小时,我可以飞往大多数国家,如果你想来中国北京,我可以提供航班和酒店 请叫我:钱先生。 +8613520320431
Ant 命令“war”失败,并出现错误“jvxml.xml.lib 不表示 zip 文件集或文件集”
我正在尝试运行 JVoiceXML 演示,但我对所有这些新技术都很陌生。我成功地运行了演示,但 servlet 除外(其中您必须使用 tomcat。问题是:当我尝试...
Jacoco @Generated 注释不排除具有匿名类方法的类
我正在使用以下注释从 jacoco 覆盖范围中排除类 @Target({ElementType.TYPE,ElementType.METHOD}) 公共@interface ExcludeFromJacocoGenerateReport { } 我想排除以下...
我需要使用ant(1.7.0)编译一个jar文件以在特定版本的Java(1.5)下运行。我的机器上目前有 Java 1.6。我尝试过设置: 我需要使用ant(1.7.0)编译一个jar文件以在特定版本的Java(1.5)下运行。我的机器上目前有 Java 1.6。我尝试过设置: <target name="compile"> <javac compiler="javac1.5" target="1.5" srcdir=.../> </target> 我也删除了 <property name="build.compiler" value="modern"/> 并且没有属性文件。我在 Linux/SUSE 上运行 Java 1.6 还有一种简单的方法可以确定 jar 文件中需要哪个版本的 Java。 使用“target”属性并删除“compiler”属性。请参阅此处。所以它应该是这样的: <target name="compile"> <javac target="1.5" srcdir=.../> </target> 这里是直接使用 javac 命令来实现此目的的示例。此信息来自@kon psych 的链接。我知道,这并没有显示蚂蚁是如何做到这一点的 build.xml 但它仍然非常有帮助,我想将这些信息保留在网站上,以防有一天出现 URL 404。 交叉编译示例 以下示例使用 javac 编译将在 1.6 VM 上运行的代码。 % javac -source 1.6 -target 1.6 -bootclasspath jdk1.6.0/lib/rt.jar \ -extdirs "" OldCode.java -source 1.6 选项指定使用 Java 编程语言的 1.6(或 6)版本来编译 OldCode.java。选项 -target 1.6 选项可确保生成的类文件与 1.6 VM 兼容。请注意,大多数情况下,-target 选项的值就是-source 选项的值;在此示例中,您可以省略 -target 选项。 您必须指定 -bootclasspath 选项来指定引导类(rt.jar 库)的正确版本。如果不是,编译器会生成警告: % javac -source 1.6 OldCode.java warning: [options] bootstrap class path not set in conjunction with -source 1.6 如果没有指定正确版本的引导类,编译器将使用旧的语言规则(在本例中,它将使用 Java 编程语言的 1.6 版本)与新的引导类相结合,这可能会产生类文件不适用于旧平台(在本例中为 Java SE 6),因为可能会包含对不存在方法的引用。 应指定源和目标。我建议提供 ant 默认值,这样您就不需要为每个 javac 任务指定源/目标属性: <property name="ant.build.javac.source" value="1.5"/> <property name="ant.build.javac.target" value="1.5"/> 更多信息请参见Java交叉编译笔记。 在我使用的类文件中查找 java 的版本: javap -verbose <classname> 在开始时宣布版本为 minor version: 0 major version: 49 对应Java 1.5 您还可以设置 {{ant.build.javac.target=1.5}} ant 属性来更新任务的默认目标版本。 请参阅 http://ant.apache.org/manual/javacprops.html#target