http://bobcat.webappcabaret.net/javachina/faq/ant_01.htm#ant_mid_Q100
官网
http://ant.apache.org/faq.html#precompile-jsps
FAQ on ANT Building Process by Roseanne Zhang
The questions and answers here are my selective postings on jGuru , JavaRanch , ChinaJavaWorld ProgramFan in order to answer others' questions. After a while of doing this, I realized that a lot of similar questions are being asked again and again.
The purpose of creating this page is to let people in the future have a place to look for answers. People don't need to answer the same question again and again.
Software reusability is extremely important. OO analysis, design, and programming are invented for this purposes. So does the component-based software. Design patterns are discovered for reusing other's design ideas. This page is created for reusing my own answers. Hopefully, this page will make your learning process a little easier.
We all work together to make a difference!
Ant ABC

Just kidding! ANT is a Java based building tool, which is similar to make , and so much better than make .
ANT, what a smart name for a building tool, even the original author of ANT, James Duncan Davidson, meant "Another Neat Tool".

Ant is easy!
The hard part is how to make a very complicated diversified system work very simple and elegant. Knowledge about ant is not enough, you need an elegant and simple design, you need great naming convention, you need to optimize the code reusability and flexibility, you need a least maintenance system...
Then it is not easy now ...
- Download the most recent version of ant from Apache ; unzip it some where on your machine.
- Install j2sdk 1.4 or above.
- Set JAVA_HOME and ANT_HOME to the directory your installed them respectively.
- Put %JAVA_HOME%/bin;%ANT_HOME%/bin on your Path. Use ${JAVA_HOME}/bin:${ANT_HOME}/bin on UNIX. Yes, you can use forward slash on windows.
- Write a "Hello world" build.xml
<project name="hello" default="say.hello" basedir="." > <property name="hello.msg" value="Hello, World!" /> <target name="say.hello" > <echo>${hello.msg}</echo> </target> </project>
- Type ant in the directory your build.xml located.
- You are ready to go!!!!
<delete quiet="true" dir="${classes.dir}" includes="*.class"/>
- You should not use implicit fileset, which is deprecated. You should use nested fileset.
- If dir does not exist, the build will fail, period!
- If you are not sure, use a upper level dir, which exists for sure. See the following fileset.
<delete> <fileset dir="${upperdir.which.exists}"> <include name="${classes.dir}/*.class" /> </fileset> </delete>
<path id="build.classpath"> <fileset dir="${build.lib}" includes="**/*.jar"/> <fileset dir="${build.classes}" /> </path> <target....> <javac ....> <classpath refid="build.classpath" /> </java> </target> <target....> <java ....> <classpath refid="build.classpath" /> </java> </target>
Store your password in your ${user.home}/prj.properties
pswd=yourrealpassword
In your include directory master prj.properties
pswd=password
In your build-common.xml read properties files in this order
- The commandline will prevail, if you use it: ant -Dpswd=newpassword
- ${user.home}/prj.properties (personal)
- yourprojectdir/prj.properties (project team wise)
- your_master_include_directory/prj.properties (universal)
Problem solved!
<taskdef resource="net/sf/antcontrib/antcontrib.properties" />
Believe me or not? Forward slash works on windows in all ant or java code. It also works in windows environment variables. It does not work in cmd (dos) window before XP. It also works in XP dos window now!
<fileset id="fs1" dir="t1" includes="**/*.java"/> <property name="f1.contents" refid="fs1"/> <echo>f1.contents=${f1.contents}</echo>
Ant Intermediate
<target name="run" depends="some.target,some.other.target"> <java classname="${run.class}" fork="yes"> <classpath> <path refid="classpath" /> </classpath> <jvmarg line="${debug.jvmargs}" /> <jvmarg line="${my.jvmargs}" /> <jvmarg value="-Dname=${name}" /> <jvmarg line="${run.jvmargs}" /> <arg line="${run.args}" /> </java> </target>
- Do an echo on where you have doubt. You will find out what is the problem easily. Just like the old c printf() or Java System.println()
- Use project.log("msg") in your javascript or custom ant task
- Run Ant with -verbose, or even -debug, to get more information on what it is doing, and where. However, you might be tired with that pretty soon, since it give you too much information.
Ant Intermediate
<copy todir="${to.dir}" > <fileset dir="${from.dir}" > <exclude name="dirname1" /> <exclude name="dirname2" /> <exclude name="abc/whatever/dirname3" /> <exclude name="**/dirname4" /> </fileset> </copy>
ExecTask compile = (ExecTask)project.createTask("exec");
- You don't need to unzip the files from archive to put into your destination jar/ear/war files.
- You can use zipfileset in your jar/war/ear task to extract files from old archive to different directory in your new archive.
- You also can use zipfileset in your jar/war/ear task to send files from local directory to different directory in your new archive.
<jar destfile="${dest}/my.jar"> <zipfileset src="old_archive.zip" includes="**/*.properties" prefix="dir_in_new_archive/prop"/> <zipfileset dir="curr_dir/abc" prefix="new_dir_in_archive/xyz"/> </jar>
compile: [javac] Warning: commons-logging.properties modified in the future. [javac] Warning: dao\DAO.java modified in the future. [javac] Warning: dao\DBDao2.java modified in the future. [javac] Warning: dao\HibernateBase.java modified in the future.
- You changed the system time
- I had the same problem before, I checked out files from cvs to windows, and transfer them to a unix machine, somehow, I got huge amount of such warnings because the system timing issue.
- If you transfer files from Australia/China/India to the United States, you will get the problem too. True enough, I did and met the problem once.
In your own $ANT_HOME/docs/manual directory, there also is tutorial-writing-tasks-src.zip
Use them! Use taskdef to define it in your script, define it before using it.
<include name="a,b,c"/>If files are in the directory or subdirectories:
<include name="**/a,**/b,**/c"/>If you want all files without extension are in the directory or subdirectories:
<exclude name="**/*.*"/>
- Don't define java.home by yourself. Ant uses an internal one derived from your environment var JAVA_HOME. It is immutable.
- I do the followings:
- In my build.properties (read first)
jdk13.bin=${tools.home}/jdk1.3.1_13/bin
jdk14.bin=${tools.home}/j2sdk1.4.2_08/bin/ - In my master properties file (read last), set default
javac.location=${jdk13.bin} - In my prj.properties, if I need to use 1.4
javac.location=${jdk14.bin} - in my javac task
executable="${javac.location}/javac.exe"
- In my build.properties (read first)
<compilerarg value="-Xlint"/> <!-- or --> <compilerarg value="-Xlint:unchecked"/>
<xslt style="${xslfile}" in="${infile}" out="${outfile}" > <classpath> <fileset dir="${xml.home}/bin" includes="*.jar" /> </classpath> </xslt>
- Since target if/unless all depend on some property is defined or not, you can use condition to define different NEW properties, which in turn depends on your ant property values. This makes your ant script very flexible, but a little hard to read.
- Ant-contrib has <if> <switch> tasks for you to use.
- Ant-contrib also has <propertyregex> which can make very complicate decisions.
Ant advanced
<property file="${antutil.includes}/${os.name}-${os.arch}.properties" />This will auto-detect your platform, and you write one file for each environment specific variables. For example: HP-UX-PA_RISC2.0.properties SunOS-sparc.properties Windows XP-x86.properties ... They work great!!! :)

TimedBufferedReader.java
package setup; import java.io.Reader; import java.io.BufferedReader; import java.io.IOException; /** * Provides a BufferedReader with a readLine method that * blocks for only a specified number of seconds. If no * input is read in that time, a specified default * string is returned. Otherwise, the input read is returned. * Thanks to Stefan Reich * for suggesting this implementation. * @author: Anthony J. Young-Garner * @author: Roseanne Zhang made improvement. */ public class TimedBufferedReader extends BufferedReader { private int timeout = 60; // 1 minute private String defaultStr = ""; /** * TimedBufferedReader constructor. * @param in Reader */ TimedBufferedReader(Reader in) { super(in); } /** * TimedBufferedReader constructor. * @param in Reader * @param sz int Size of the input buffer. */ TimedBufferedReader(Reader in, int sz) { super(in, sz); } /** * Sets number of seconds to block for input. * @param seconds int */ public void setTimeout(int timeout) { this.timeout=timeout; } /** * Sets defaultStr to use if no input is read. * @param str String */ public void setDefaultStr(String str) { defaultStr = str; } /** * We use ms internally * @return String */ public String readLine() throws IOException { int waitms = timeout*1000; int ms = 0; while (!this.ready()) { try { Thread.currentThread().sleep(10); ms += 10; } catch (InterruptedException e) { break; } if (ms >= waitms) { return defaultStr; } } return super.readLine(); } }
Windose makes a lot of decisions for you, even it is not always correct.
I was struggling with similar problems these two days. When ant cannot do it, then try use your hand to delete it, if you cannot, it is clear it is "Windose".
How to fight with your "Windose"? Try the followings in order:
- Check/disable your anti-virus software.
- Close all possible apps use that file/dir.
- Close cmd or cygwin windows
- Close Windows Explorer, then reopen.
- If still not work, shut-down your PC, count 1 to 10, then start again. It worked.
Haha!
Dev |_src | |_com | |_mycom | |_mypkg | |_A.java |_test |_src |_com |_mycom |_mypkg |_ATest.java
- Quilt here
- Copied from Quilt site: Quilt is a Java software development tool that measures coverage , the extent to which unit testing exercises the software under test. It is optimized for use with the JUnit unit test package, the Ant Java build facility, and the Maven project management toolkit.
- Interesting!!
We wrote something similar to the functionality of quilt long time ago, when I was working in a Microsoft Solution Provider shop. We actually could tell how QA did their job. However, it was considered spying on QA, and for keeping the reasonable relationship between development and QA, we were forced to take them out.
It would be better if it were a third party product, in my case.
- Took a look, we 'd be better off not to use it. The reasons are:
- It is stale, it stopped developing in 2003.
- It is dangerous, since it alters the bitecode.
lang=en lang=cn lang=any other supported languages such as Spanish, etc.
/* @cn.comment.start@ String abc="??"; @cn.comment.end@ */ /* @en.comment.start@ String abc="Source code"; @en.comment.end@ */ // More languages here.When lang=en, or English "@en.comment.start@" is replaced by "*/". "@en.comment.end@" is replaced by "/*" The cn, Chinese code and all other language code is untouched or still commented out. Advantages
- When we copy the code to the place for build (compile), the replacement is done automatically by ant copy task. Build games in different languages became as easy as switching one word in the build.properties.
- One more thing is wonderful here. It is way better than use "if else or switch case statements". since the byte code is much smaller. It is especially important when you are building games on mobile devices.
- We only need one code base instead of many, which made code maintenance a lot simpler, less headache!!!
By the way, I did all my native build by myself on 4 different operating systems. It is quite hack of work. You basically need to know how to do it without ant, then put them in ant to automate the process. Even I've not used ant-contrib cc task yet, but from rough look at the doc, I guess what I said would be still true.
I had a good reason to do the similar like you said here when I was working in another company. We had developers work in a sandbox, no other people knew the new code yet, but the working developer. The sanbox would have the same name source code, which might be different from the mainstream same name code. In my case, when the sandbox built, the mainstream would be your src2.
How did I handle it?
I had a build/tmp/src directory, before compiling, I copied the source code need to compile to that directory. To mainstream developer, copying mainstream src was enough, then compile. To sandbox developer, copying mainstream src first, then copying the sandbox/src second, and set overwrite="true", very important, otherwise, copy task copies according to timestamps.
You javac from build/tmp/src to build/classes. In this way, your problem would be solved.
Actually, my case was way more complicated then, I even wrote my own copy task which called CopyWithDependencies. Of course, this is out of the range of our discussion here... Writing it down might help you think further...
- ant source code
- ant javadoc, when you download the source code, the javadoc is included.
- default.properties under ant source code
相关推荐
内容概要:本文档详细介绍了基于 MATLAB 实现的 LSTM-AdaBoost 时间序列预测模型,涵盖项目背景、目标、挑战、特点、应用领域以及模型架构和代码示例。随着大数据和AI的发展,时间序列预测变得至关重要。传统方法如 ARIMA 在复杂非线性序列中表现欠佳,因此引入了 LSTM 来捕捉长期依赖性。但 LSTM 存在易陷局部最优、对噪声鲁棒性差的问题,故加入 AdaBoost 提高模型准确性和鲁棒性。两者结合能更好应对非线性和长期依赖的数据,提供更稳定的预测。项目还展示了如何在 MATLAB 中具体实现模型的各个环节。 适用人群:对时间序列预测感兴趣的开发者、研究人员及学生,特别是有一定 MATLAB 编程经验和熟悉深度学习或机器学习基础知识的人群。 使用场景及目标:①适用于金融市场价格预测、气象预报、工业生产故障检测等多种需要时间序列分析的场合;②帮助使用者理解并掌握将LSTM与AdaBoost结合的实现细节及其在提高预测精度和抗噪方面的优势。 其他说明:尽管该模型有诸多优点,但仍存在训练时间长、计算成本高等挑战。文中提及通过优化数据预处理、调整超参数等方式改进性能。同时给出了完整的MATLAB代码实现,便于学习与复现。
palkert_3ck_01_0918
pepeljugoski_01_1106
tatah_01_1107
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
题目:基于单片机的步进电机控制系统 模块: 主控:AT89C52RC 步进电机(ULN2003驱动) 按键(3个) 蓝牙(虚拟终端模拟) 功能: 1、可以通过蓝牙远程控制步进电机转动 2、可以通过按键实现手动与自动控制模式切换。 3、自动模式下,步进电机正转一圈,反转一圈,循环 4、手动模式下可以通过按键控制步进电机转动(顺时针和逆时针)
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
内容概要:本文详细介绍了建设智慧校园平台所需的六个关键步骤。首先通过需求分析深入了解并确定校方和使用者的具体需求;其次是规划设计阶段,依据所得需求制定全面的建设方案。再者是对现有系统的整合——系统集成,确保新旧平台之间的互操作性和数据一致性。培训支持帮助全校教职工和学生快速熟悉新平台,提高效率。实施试点确保系统逐步稳定部署。最后,强调持续改进的重要性,以适应技术和环境变化。通过这一系列有序的工作,可以使智慧校园建设更为科学高效,减少失败风险。 适用人群:教育领域的决策者和技术人员,包括负责信息化建设和运维的团队成员。 使用场景及目标:用于指导高校和其他各级各类学校规划和发展自身的数字校园生态链;目的是建立更加便捷高效的现代化管理模式和服务机制。 其他说明:智慧校园不仅仅是简单的IT设施升级或软件安装,它涉及到全校范围内的流程再造和创新改革。
该文档系统梳理了人工智能技术在商业场景中的落地路径,聚焦内容生产、电商运营、智能客服、数据分析等12个高潜力领域,提炼出100个可操作性变现模型。内容涵盖AI工具开发、API服务收费、垂直场景解决方案、数据增值服务等多元商业模式,每个思路均配备应用场景拆解、技术实现路径及收益测算框架。重点呈现低代码工具应用、现有平台流量复用、细分领域自动化改造三类轻量化启动方案,为创业者提供从技术选型到盈利闭环的全流程参考。
palkert_3ck_02_0719
克鲁格曼专业化指数,最初是由Krugman于1991年提出,用于反映地区间产业结构的差异,也被用来衡量两个地区间的专业化水平,因而又称地区间专业化指数。该指数的计算公式及其含义可以因应用背景和具体需求的不同而有所调整,但核心都是衡量地区间的产业结构差异或专业化程度。 指标 年份、城市、第一产业人数(first_industry1)、第二产业人数(second_industry1)、第三产业人数(third_industry1)、专业化指数(ksi)。
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
精品推荐,通信技术LTE干货资料合集,19份。 LTE PCI网络规划工具.xlsx LTE-S1切换占比专题优化分析报告.docx LTE_TDD问题定位指导书-吞吐量篇.docx LTE三大常见指标优化指导书.xlsx LTE互操作邻区配置核查原则.docx LTE信令流程详解指导书.docx LTE切换问题定位指导一(定位思路和问题现象).docx LTE劣化小区优化指导手册.docx LTE容量优化高负荷小区优化指导书.docx LTE小区搜索过程学习.docx LTE小区级与邻区级切换参数说明.docx LTE差小区处理思路和步骤.docx LTE干扰日常分析介绍.docx LTE异频同频切换.docx LTE弱覆盖问题分析与优化.docx LTE网优电话面试问题-应答技巧.docx LTE网络切换优化.docx LTE高负荷小区容量优化指导书.docx LTE高铁优化之多频组网优化提升“用户感知,网络价值”.docx
matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
pepeljugoski_01_0508
szczepanek_01_0308
oif2007.384.01_IEEE
stone_3ck_01_0119
oganessyan_01_1107