<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    牛仔褲的夏天

    JAVA是藍色的- online

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      30 隨筆 :: 5 文章 :: 15 評論 :: 0 Trackbacks

    FAQ on ANT Building Process by Roseanne Zhang

    scjp, advanced, job tips, xml, ant, tomcat

    The questions and answers here are my selective postings on jGuru, JavaRanch, ChinaJavaWorld 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!

    Table of Contents

    Ant ABC

    Ant Intermediate

    Ant advanced


    Ant ABC

    Q. What is ant?
    A: Ant is a small animal who can build magnificent buildings. Ant builds!
    Here is a picture for it. ant picture

    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".

    To the top

    Q. A win-win ant learning method
    A: There is a shortcut.
    If you download a small jakarta project, such as Log4J, which is built by ant. It is a good and simple example for you to learn ant. Actually, you hit two birds with one stone.

    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 ...

    To the top

    Q. How do I get started to use ant? Can you give me a "Hello World" ant script?
    A: Simple.
    • 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
    • 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!!!!
    To the top

    Q. How to delete files from a directory if it exists? The following code fails when directory does not exist!
    <delete quiet="true" dir="${classes.dir}" includes="*.class"/>
    
    A: Your code has many problems.
    1. You should not use implicit fileset, which is deprecated. You should use nested fileset.
    2. If dir does not exist, the build will fail, period!
    3. 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>
      
    To the top

    Q. How do I set classpath in ant?
    A: Here is some snippet of code
      <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>
      

    Q. How does ant read properties? How to set my property system?
    A: Ant sets properties by order, when something is set, the later same properties cannot overwrite the previous ones. This is opposite to your Java setters.
    This give us a good leverage of preset all properties in one place, and overwrite only the needed. Give you an example here. You need password for a task, but don't want to share it with your team members, or not the developers outside your team.

    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

    1. The commandline will prevail, if you use it: ant -Dpswd=newpassword
    2. ${user.home}/prj.properties (personal)
    3. yourprojectdir/prj.properties (project team wise)
    4. your_master_include_directory/prj.properties (universal)
    <cvsnttask password="${pswd} ... />

    Problem solved!


    Q. How to modify properties in ant?
    A: No, you can't!
    Properties in Ant are immutable. There is a good reason behind this, see this FAQ item for more details.

    Q. How to use ant-contrib tasks?
    A: Simple, just copy ant-contrib.jar to your ant*/lib directory
    And add this line into your ant script, all ant-contrib tasks are now available to you!
        <taskdef resource="net/sf/antcontrib/antcontrib.properties" />
    
    To the top

    Q. How to loop on a list or fileset?
    A: Use ant-contrib <for> <foreach> tasks
    General to say, use <for> is better than use <foreach> since for each is actually open another ant property space, use more memory too.
    To the top

    Q. Why do I get en exception when I use location="D:\Code\include" as attribute of includepath?
    A: See here.
    You need to escape the string to "D:\\Code\\include" or use "D:/Code/include" instead!

    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!


    Q. Can I put the contents of a classpath or fileset into a property?
    A: Yes, you can.
    This is very similar to the call of Java class toString() method and actually it is calling the toString() method inside ant. For example
    <fileset id="fs1" dir="t1" includes="**/*.java"/>
    <property name="f1.contents" refid="fs1"/>
    <echo>f1.contents=${f1.contents}</echo>
    
    To the top

    Q. Where can I find the javadoc for ant API?
    A: Download apache ant src version. Use ant javadocs command to see generated javadoc for ant in build/docs directory.
    To the top

    Ant Intermediate

    Q. How can I use ant to run a Java application?
    A: Here is a real world example.
      <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>
    
    To the top

    Q. How to use ant to run commandline command? How to get perl script running result?
    A: Use exec ant task.
    Don't forget ant is pure Java. That is why ant is so useful, powerful and versatile. If you want ant receive unix command and result, you must think Unix. So does in MS-Windows. Ant just helps you to automate the process.
    To the top

    Q. How do I debug my ant script?
    A: Many ways
    • 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.
    To the top

    Ant Intermediate

    Q. How to exclude multi directories in copy or delete task?
    A: Here is an example.
          
      <copy todir="${to.dir}" >
        <fileset dir="${from.dir}" >
          <exclude name="dirname1" />
          <exclude name="dirname2" />
          <exclude name="abc/whatever/dirname3" />
          <exclude name="**/dirname4" />
        </fileset>
      </copy>
    
    To the top

    Q. How to use Runtime in ant?
    A: You don't need to use Runtime etc. Ant have exec task.
    The class name is org.apache.tools.ant.taskdefs.ExecTask. You can create the task by using the code in your customized ant Task.
    ExecTask compile = (ExecTask)project.createTask("exec");
    
    To the top

    Q. How to rearrange my directory structure in my jar/war/ear/zip file? Do I need to unarchive them first?
    A: No, you don't need to unarchive them first.
    • 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.
    See the follow example:
      <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>
        
    To the top

    Q. Why did I get such warning in ant?
    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.
    
    A: System time problem, possible reasons:
    • 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.
    To the top

    Q. How can I write my own ant task?
    A: Easy!
    Writing Your Own Task How-To from ant.
    In your own $ANT_HOME/docs/manual directory, there also is tutorial-writing-tasks-src.zip
    Use them!
    To the top

    Q. How to copy files without extention?
    A:
    If files are in the directory:
    <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="**/*.*"/> 
    To the top

    Q. How do I use two different versions of jdk in ant script?
    A: The followings are what I'm doing.
    1. Don't define java.home by yourself. Ant uses an internal one derived from your environment var JAVA_HOME. It is immutable.
    2. 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"
    To the top

    Q. How to pass -Xlint or -Xlint:unchecked to 1.5 javac task?
    A: pass it as compilerarg nested <compilerarg> to specify.
      <compilerarg value="-Xlint"/>
      <!-- or -->
      <compilerarg value="-Xlint:unchecked"/>
    

    Q. Can you give me a simple ant xslt task example?
    A: Here is a working one!
        <xslt style="${xslfile}" in="${infile}" out="${outfile}" >
          <classpath>
            <fileset dir="${xml.home}/bin" 
              includes="*.jar" />
          </classpath>
        </xslt>
    
    To the top

    Q. How to hide password input?
    A: Override ant Input task.
    Response every user input with a backspace. Not the best, but it works.
    To the top

    Q. How do I add elements to an existing path dynamically?
    A:
    Yes, it is possible. However, you need to write a custom ant task, get the path, and add/modify it, and put it in use. What I am doing is that I define a path reference lib.classpath, then add/modify the lib.classpath use my own task.
    To the top

    Q. How to do conditional statement in ant?
    A: There are many ways to solve the problem.
    • 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.
    To the top

    Q. Can I change/override ant properties when I use ant-contrib foreach task?
    A:
    <foreach> is actually using a different property space, you can pass any property name/value pair to it. Just use <param> nested tag inside foreach
    To the top

    Ant advanced

    Q. Do we have an ant custom task to count source lines?
    A: See here.
    I don't know if there is one published. However, I wrote a custom task by myself and count the lines with semicolons and open braces as a pretty good estimation for Java files. I used a different criteria for XML/configuration files. Just give you a hint, you can write one too.

    Q. How to let auto-detect platform and use platform specific properties?
    A: Tell you a great trick, it works excellent.
    In your major build-include.xml, put in this line
     
      <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!!! :)

    Q. How to make ant user interactive? I tried to use BufferedReader to get user input, it hangs.
    A: See here.
    Use this class TimedBufferedReader instead of your BufferedReader will work. This is a working one in our installation process. The original author is credited in the code. I've made some improvement.
    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();
      }
    }
    
    To the top

    Q. Why cannot I delete or rename a file/directory in ant?
    A:

    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:

    1. Check/disable your anti-virus software.
    2. Close all possible apps use that file/dir.
    3. Close cmd or cygwin windows
    4. Close Windows Explorer, then reopen.
    5. If still not work, shut-down your PC, count 1 to 10, then start again. It worked.

    Haha!

    To the top

    Q. What is a good directory structure for main code and junit test code?
    A:
      Dev
        |_src
        |  |_com
        |     |_mycom
        |        |_mypkg
        |           |_A.java
        |_test
           |_src
             |_com
                |_mycom
                   |_mypkg
                      |_ATest.java
    
    To the top

    Q. Should I use quilt to monitor QA code coverage?
    A: My answer is no, but it is up to you!
    • 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:
      1. It is stale, it stopped developing in 2003.
      2. It is dangerous, since it alters the bitecode.
    To the top

    Q. What should I use to build J2ME application/games?
    A:
    You can use WTK and antenna and Proguard obfuscator.

    Q. A creative use of token replacement in ant copy task to handle multi-languages in mobile games.
    A:
    I used a strategy plus ant token replacement in copy task, made our game code comment and uncomment out Chinese/English/etc by just needing to change one user defined ant property
    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
    1. 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.
    2. 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.
    3. We only need one code base instead of many, which made code maintenance a lot simpler, less headache!!!
    You need to use apache ANT to do your build and deployment.
    To the top

    Q. How to do c/c++ build by using ant?
    A:
    Take a look at ant-contrib cc task, it can do more than you want!!!

    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.

    To the top

    Q. A complicated case study, How do I handle two source files with the same pkg/name?
    A: A friend asked a question at JavaRanch Exclude sources in javac task
    My answer:
    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...

    To the top

    Q. How do I find out the relationship between ant task name and Java class in the code?
    A: They are mapped in default.properties.
    When you want to build a custom ant task, I need to have a look at
    • ant source code
    • ant javadoc, when you download the source code, the javadoc is included.
    • default.properties under ant source code
    To the top

    last updated: 12-03-2005
    Copyright ? 1999 - 2005 Roseanne Zhang, All Rights Reserved
    [JavaChina] [Online Tutoring, Training] [SCJD Group]
    posted on 2005-12-16 09:08 luckyrobbie 閱讀(1899) 評論(1)  編輯  收藏

    評論

    # re: 有關ant的faq 2010-10-21 11:58 thomas sabo charm
    default.properties under ant source code   回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲天堂一区在线| 性做久久久久免费看| 亚洲?v无码国产在丝袜线观看 | 亚洲精品资源在线| 2022免费国产精品福利在线| 免费毛片网站在线观看| 亚洲人配人种jizz| 中文字幕av无码无卡免费| 亚洲国产福利精品一区二区| 中文无码日韩欧免费视频| 免费一级e一片在线播放| 综合一区自拍亚洲综合图区| 好吊妞在线成人免费| 亚洲人精品亚洲人成在线| 亚洲精品视频在线免费| 又黄又爽无遮挡免费视频| 国产成人亚洲综合无| 成人免费视频一区| 永久免费观看的毛片的网站| 亚洲精品狼友在线播放| 免费观看91视频| 激情内射亚洲一区二区三区| 可以免费观看的国产视频| 亚洲狠狠综合久久| h视频在线观看免费完整版| 亚洲av无码一区二区三区天堂古代| 亚洲免费观看网站| 亚洲日本国产综合高清| 亚洲国产精品一区二区三区久久| GOGOGO免费观看国语| 亚洲精品电影天堂网| 国产免费看插插插视频| 中文在线日本免费永久18近| 亚洲欧洲国产成人精品| 全部免费毛片在线| 亚洲一级毛片免费看| 午夜不卡AV免费| 国产精品高清视亚洲精品| 三上悠亚亚洲一区高清| 成人黄页网站免费观看大全| fc2免费人成在线|