Apache Ant(以前称为Jakarta Ant)是一个基于XML的声明式构建工具,最初是为Java项目创建的。它提供了一组丰富的标准任务,用于执行大多数常见的构建操作,例如编译Java源代码,构建存档和运行测试。 Ant的功能可以通过自定义任务和宏进行扩展。
我正在尝试使用 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
我应该使用什么 Apache Ant 版本来运行 Java 6 项目? [重复]
我有很多遗留的 java 6 项目,我需要构建它。 使用 Eclipse Neon Ant 插件和 Java 8 正在构建 jar,但是当我将生成的 jar 与另一个 Java 6 项目一起使用时,我得到了...
如何指定两个名称来满足 Java 依赖关系? 我使用的是 Netbeans,默认情况下,Linux 将 OpenJDK 称为“JDK_7”。 Windows 将 Oracle JDK 称为“JDK 1.7”。 我想做到这一点
我在所有构建中都使用 ANT,并且还使用 Eclipse 作为 IDE,我希望能够在 Eclipse 中使用最新版本的 ANT,通常 Eclipse 附带的 ANT 是单点版本
我有一个 Ant 构建,它只生成一个充满 html 页面的 jar。我想对 Maven 做同样的事情。我当前正在将文件复制到新文件夹,但文件未添加到
从tomcat9迁移到tomcat10,系统仍然尝试加载javax/servlet/http/HttpServlet
我的servlet曾经在tomcat9上工作。我尝试使用tomcat10。 我从构建路径中删除了 javax.servlet-api-3.1.0.jar 并添加了 jakarta.servlet-api-5.0.0.jar。 我更改了对 javax.servlet 的任何引用...
我安装了 Java 和 Ant 后,进入 xrechnung-visualization 目录并运行命令,生成的 PDF 无法正常工作,当尝试使用 adobe acrobat 打开它时,它显示:“Adobe Ac...
我正在尝试安装 apache ANT 1.10.14。我从此页面下载了二进制配置。然后,我将解压后的“apache-ant-1.10.14”移至我的主目录。正如设置指南所示,我...
我们有一个属性,其中包含一系列要在 Ant 脚本中传递给 JVM 的参数。 示例(注意第二个条目中的引号): -Dsql.driver=oracle.jdbc.driver.OracleDriver -Dapp.
我有一个 ant 脚本,其中有一个 taskdef,该任务创建了一个 https 互联网连接,而 SSL 内容的某些内容是错误的。因此我想设置系统属性 javax.net.debug=all 来获取
我正在使用ant构建java jar文件。我需要使用“zipfileset src =“xxx.jar”“zipfileset src =”yyy.jar”包含其他jar,并且xxx.jar和yyy.jar都具有完全相同的类-
我有两个文件 test-200-12-30-2990 和 test-project-200-12-30-2990 我正在将其解压缩到相应的文件夹。第二个任务不起作用。我想选择文件“test-200-12-30-2990” 下面是...
我想向我的 Ant 项目添加依赖项;例如我想将 hibernate 依赖项添加到我的项目中。 我是蚂蚁的新手。之前我使用maven工具来构建项目。 在 Maven 中这非常简单...
Eclipse Ant Javadoc - 私有字段没有评论的警告
使用 在 Eclipse (2022-09 (4.25.0)) 中运行 Ant Javadoc 进程 在 Eclipse (2022-09 (4.25.0)) 中使用 运行 Ant Javadoc 进程 在私人领域收到一些此类警告。 然而,有很多私有领域它并不抱怨。 [javadoc] D:\workspace_12\...\NetConfCredential.java:47: warning: no comment [javadoc] private boolean verified = false; 它应该忽略所有私有字段,不是吗? 它不会抱怨所有没有 javadoc 的私有方法。 ====================== 在最小化代码以发布示例时,我发现它与 java.io.Serialized 有关。 public abstract class TestAbstract implements java.io.Serializable { /** Our serialization ID */ public static final long serialVersionUID = 12; } /** * Comment. */ public class TestCredential extends TestAbstract { /** UID */ public static final long serialVersionUID = 12; private static final String defaultString = "public"; private boolean verified = false; /** * Constructor */ public TestCredential() { } } [javadoc] D:\workspace_12\...\TestCredential.java:13: warning: no comment [javadoc] private boolean verified = false; [javadoc] ^ 从超类中删除可序列化,警告就会消失。 Javadoc 不会对私有静态字段发出警告。 ========================== <?xml version="1.0" encoding="UTF-8" standalone="no"?> <project default="javadoc"> <target name="javadoc"> <javadoc access="public" author="false" destdir="d:..." doctitle="NMS Core" classpath="..." noqualifier="all" nodeprecated="true" nodeprecatedlist="true" noindex="false" nonavbar="false" notree="false" Public="true" sourcefiles=" com\logikos\core\credentials\TestCredential.java " source="12" splitindex="false" use="false" version="false"/> </target> </project> [javadoc] Standard Doclet version 17.0.5+8 您遇到 JDK Bug https://bugs.openjdk.org/browse/JDK-8275199.
我正在尝试使用使用命令行参数的 main 方法为 java 类创建一个构建文件。但是构建文件的运行目标无法找到类,即使路径应该是
我正在用统一的 Maven 构建改造一堆现有的 Java 项目。由于每个项目都已经成熟并且已经建立了基于 Ant 的构建,所以我使用 maven-antrun-plugin 来执行现有的构建...
我有以下脚本可以毫无问题地启动和停止 weblogic 12.1.3 服务器,但即使我添加了该行,我也无法让它在调试中启动 我有以下脚本可以毫无问题地启动和停止 weblogic 12.1.3 服务器,但即使我添加了该行,我也无法让它在调试中启动 <jvmarg value="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -XX:PermSize=128m -XX:MaxPermSize=256m"/> 这是完整的脚本 <?xml version="1.0"?> <!DOCTYPE project> <project name="WeblogicServer" default="start-server" basedir="/Users/E3/Oracle/Middleware/Oracle_Home"> <property name="bea.home" value="/Users/E3/Oracle/Middleware/Oracle_Home" /> <property name="weblogic.home" value="/Users/E3/Oracle/Middleware/Oracle_Home/wlserver" /> <property name="domain.home" value="/Users/E3/Oracle/Middleware/Oracle_Home/user_projects/domains" /> <property name="domain.name" value="base_domain" /> <property name="host" value="localhost" /> <property name="port" value="7001" /> <property name="username" value="weblogic" /> <property name="password" value="weblogic123" /> <property name="admin.server.name" value="AdminServer" /> <path id="wls.classpath"> <fileset dir="${weblogic.home}/server/lib"> <include name="web*.jar"/> </fileset> </path> <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer" classpathref="wls.classpath"/> <target name="start-server" > <wlserver dir="${domain.home}/${domain.name}" host="${host}" port="${port}" domainname="${domain.name}" servername="${admin.server.name}" action="start" username="${username}" password="${password}" beahome="${bea.home}" weblogichome="${weblogic.home}" verbose="true" noexit="true" protocol="t3" classpath="${weblogic.home}/server/lib/weblogic.jar" > <jvmarg value="-server"/> <jvmarg value="-Xms256m"/> <jvmarg value="-Xmx512m"/> <jvmarg value="-XX:PermSize=128m"/> <jvmarg value="-XX:MaxPermSize=256m"/> <jvmarg value="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -XX:PermSize=128m -XX:MaxPermSize=256m"/> </wlserver> </target> <target name="stop-server"> <wlserver dir="${domain.home}/${domain.name}" host="${host}" port="${port}" servername="${admin.server.name}" username="${username}" password="${password}" action="shutdown" beahome="${bea.home}" weblogichome="${weblogic.home}" forceshutdown="true"/> </target> </project> 我可能会错过什么? 我在几个地方读到应该添加调试选项,但它对我不起作用 这个jvmarg: <jvmarg value="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -XX:PermSize=128m -XX:MaxPermSize=256m"/> 作为单个参数传递给 java 可执行文件,并嵌入空格,而不是一系列单独的参数。将其分成单独的 jvmargs。 您可以通过使用 -d 命令行选项运行 ant 来查看调用 java 可执行文件时发生的情况: $ ant -d ... Execute:Java13CommandLauncher: Executing '/.../bin/java' with arguments: '-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n -XX:PermSize=128m -XX:MaxPermSize=256m' 'package.and.classname' 注意您的 jvmargs 在调试输出中是如何成为单个字符串的。