OldJavaMan的专栏

Henry的技术世界

用户操作
[即时聊天] [发私信] [加为好友]
俞京华ID:oldjavaman
51153次访问,排名2304,好友0人,关注者2人。
java 技术和开源技术的爱好者
oldjavaman的文章
原创 38 篇
翻译 6 篇
转载 4 篇
评论 28 篇
oldjavaman的公告
Google


最近评论
Johncui:期待这个翻译计划的继续。
Johncui:期待这个翻译计划的继续。
blackcathl:我在suse机器下用headless模式启动,总是直接退出
因为公司的运营机器处于安全考虑,并没有完全安装xwindow和桌面,同时没有显示器等硬件,如果不加headless,soffice程序似乎在监听,可是并没有绑定socket的端口,只是在tmp下边有个OSL...的文件,我想请问这是怎么回事呢?谢谢执教
wangyx:很好,很强大!我google"java 加密狗",一不小心就跑到你这里来啦,好久不见啊,向大家问个好!原先那个手机丢了,所以大部分号码消失,联系不上了。。。QQ:401192126,Mail:wangxiaokuang@sina.com
视频资讯搜索-视搜网:看不懂
视频资讯搜索vsoso.cn
文章分类
收藏
相册
blog 专用插图
dvd图片
sun 2004 科技日
我的照片
常用链接
Collegesoft
dvd不完全手册
友情Blog(征集中)
dolphin的blog
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 关于ant,不得不说的蚂蚁(一)收藏

新一篇: 说说Java的args,大家可能没有注意到的现象 | 旧一篇: TextField中进行字符的输入限制

ant logo

Apache Ant: Apache Ant is a Java-based build tool. In theory, it is kind of like Make, but without Make's wrinkles

上面是官方的定义, 说白了, 就是编译工具, 免费,高效。

我专门为写ejb来定义的:Build.xml

大家都知道 antcompare一个project的时候 必须编写一个XML 我们单位为了节省费用 没有购买Jbuilder 开发工具有idea,netBeanEclipse,我对Eclipse不是很熟悉 对于jbidea是用的比较多的 然而在一般的编译器里面 我们无法形成两个jar文件 如果你计划使用ejb 并且你准备使用分布式的部署 你将不得不为你的ejbclient来从新生成一个不包含yourEjbNameBeanjar文件。还有在jboss上部署ejb在你的META-INF目录里面必须包含两个xml文件:ejb-jar.xmljboss.xml jbuilder里面你可以自由的增加jar里面的xml文件, idea里面不行, ant可以由你任意增加。

为了实现以上两个目的,我编写build.xml文件如下:

 

<?xml version="1.0"  encoding="GB2312" ?>

<!--

参照antjakarta-ant-1.6alphabuild.xml

Copyright (c) 2002 The Neusoft Software Foundation.  All rights reserved.

============================================================

-->

 

<!--

    文档结构为:

    <project>

        <property/>               全局变量的定义

        <property/>...

 

        <target name="1">         任务组(tasks)

            <javac></javac>       一项javac任务

            ...

            <oneTask></ontTask>   一项其它任务

        </target>

        <target name="2">

            <javac></javac>

            ...

            <oneTask></ontTask>

        </target>

    </project>

    project代表一个项目,

    default:运行到名称为"dist"target(任务组)

    basedir:基准路径。

-->

<project default="dist" basedir=".">

<!--

定义属性(property tasks

      最好把用到的路径呀,名称呀都在这里定义成全局变量

      例:定义

          <property name="a" value="hello"/>

      以后就可以这样用它:

          <property name="b" value="${a}/b"/>

      现在:b=="hello/b"

===========================================================

-->

 

    <!--主要的系统环境属性-->

<property environment="env"/>

<!--window,unix...的环境变量-->

    <property name="java.home" value="${env.JAVA_HOME}"/>

    <property name="ant.home"  value="${env.ANT_HOME}"/>

<property name="jboss.home"  value="${env.JBOSS_HOME}"/>

<property name="classpath"  value="${env.classpath}"/>

<property name="deploydir"  value="${env.JBOSS_HOME}/server/default/deploy"/>

    <!--主要的app环境属性-->

    <property name="app.name"      value="ejbtraining"/>

    <property name="app.jar"       value="${app.name}.jar"/>

 <property name="appclient.jar"       value="${app.name}client.jar"/>

    <property name="app.copyright" value=" Copyright (c) 2004 The Collegesoft Co.,  All rights reserved."/>

    <!--appsrc的属性-->

    <property name="src.dir"    value="src" />

    <property name="src.main"   value="${src.dir}/main"/>

    <property name="src.script" value="${src.dir}/script"/>

<property name="etc.dir" value="etc"/>

    <!--app用到的lib-->

    <property name="lib.dir" value="lib"/>

    <!--appbuild目录中-->

    <property name="build.dir"      value="build" />

    <property name="build.classes"  value="${build.dir}/classes"/>

<property name="build.classes.metainf"  value="${build.classes}/META-INF"/>

    <property name="build.docs"     value="${build.dir}/docs"/>

    <property name="build.docs.api" value="${build.docs}/api"/>

    <property name="build.lib"      value="${build.dir}/lib"/>

    <!--appdist (distribution) 目录中-->

    <property name="dist.dir"      value="dist"/>

    <property name="dist.bin"      value="${dist.dir}/bin"/>

    <property name="dist.docs"     value="${dist.dir}/docs"/>

    <property name="dist.lib"      value="${dist.dir}/lib"/>

<property name="dist.lib.server"      value="${dist.lib}/server"/>

<property name="dist.lib.client"      value="${dist.lib}/client"/>

    <!--appdocs目录中-->

    <property name="docs.dir"      value="docs"/>

    <!--

    定义一组路径以后可以通过id重用这组路径 ,例:

    <javac srcdir="src/main" destdir="build/classes">

            <classpath refid="classpath"/>

    </javac>

    -->

    <path id="classpath">

        <pathelement location="${classpath}"/>

        <pathelement location="${build.classes}"/>

        <pathelement path="${java.home}/lib/tools.jar"/>

<pathelement path="${jboss.home}/client/*.jar"/>

<pathelement path="${jboss.home}/client/lib/*.jar"/>

<pathelement path="${jboss.home}/server/default/lib/jboss-j2ee.jar"/>

<pathelement path="${jboss.home}/server/default/lib/javax.servlet.jar"/>

    </path>

 

<!--

   

      init 准备目录(File Tasks)

      主要的目录结构通常是不会变的,一起生成他们

   

-->

    <target name="init">

        <!--清除以前目录-->

        <delete dir="${build.dir}" failonerror="false" />

        <delete dir="${dist.dir}"  failonerror="false"/>

 

        <!--准备目录-->

        <mkdir dir="${build.dir}"/>

        <mkdir dir="${build.classes}"/>

<mkdir dir="${build.classes.metainf}"/>

        <mkdir dir="${build.docs}"/>

        <mkdir dir="${build.docs.api}"/>

        <mkdir dir="${build.lib}"/>

        <mkdir dir="${dist.dir}"/>

        <mkdir dir="${dist.bin}"/>

        <mkdir dir="${dist.lib}"/>

<mkdir dir="${dist.lib.server}"/>

<mkdir dir="${dist.lib.client}"/>

 

    </target>

 

<!--

======================================================

      Build the code (Compile Tasks,File Tasks)

======================================================

-->

    <target name="build" depends="init">

        <!--编译-->

        <javac srcdir="${src.main}" destdir="${build.classes}">

            <classpath refid="classpath"/>

        </javac>

    </target>

 

<!--

=============================================================

拷贝相关的部署xml文件到META-INF

-->

 

<target name="ejb-meta-inf" depends="init"> 

      <copy file="${etc.dir}/ejb-jar.xml" 

            tofile="${build.classes.metainf}/ejb-jar.xml" /> 

      <copy file="${etc.dir}/jboss.xml" 

            tofile="${build.classes.metainf}/jboss.xml" /> 

</target>

<!--

    =========================================================

      打包文档(Archive Tasks)

      Create the project jars: xxx1.jar and xxx2.jar

    ============================================================

-->

   <target name="jars" depends="build,ejb-meta-inf">

        <jar basedir="${build.classes}" jarfile="${dist.lib.server}/${app.jar}"/>

<jar basedir="${build.classes}" jarfile="${dist.lib.client}/${appclient.jar}"

excludes="com/collegesoft/training/ejb/olympicdate/StatelessDateBean.class,

com/collegesoft/training/ejb/helloejb/HelloBean.class" />

    </target>

 

<!--

=============================================================

       Creates the API documentation

==============================================================

-->

    <target name="javadocs"

            depends="jars"

            description="--> creates the API documentation">

        <!--copy docs 手册... -->

        <copy todir="${build.docs}">

            <fileset dir="${docs.dir}"/>

        </copy>

 

        <javadoc packagenames="com.collegesoft.training.ejb.*"

                 sourcepath="${src.main}"

                 defaultexcludes="yes"

                 destdir="${build.docs.api}"

                 author="true"

                 version="true"

                 use="true"

                 windowtitle="Docs API">

             <doctitle><![CDATA[<h1>hello ant Docs API</h1>]]></doctitle>

             <bottom><![CDATA[<i>${app.copyright}</i>]]></bottom>

             <tag name="todo" scope="all" description="To do:" />

         </javadoc>

    </target>

 

<!--

======================================================

       Create the distribution that can run (Archive Tasks)

       主要是从各目录中把该copycopy

=====================================================

-->

   <target name="dist" depends="javadocs">

        <!--copy bin 执行文件 -->

        <copy todir="${dist.bin}">

            <fileset dir="${src.script}/"/>

        </copy>

        <copy todir="${dist.docs}">

            <fileset dir="${build.docs}/"/>

        </copy>

        <!-- copy lib 文件 -->

        <copy todir="${dist.lib}">

            <fileset dir="${build.lib}/"/>

        </copy>

<copy todir="${deploydir}">

<fileset dir="${dist.lib.server}/"/>

</copy>

</target>

 

<!--

======================================================

      Cleans everything(File Tasks)

      例如可以删除build中的文件,留给你发挥吧

======================================================

-->

<target name="clear" depends="dist">

        <!--copy bin 执行文件 -->

        <copy todir="${dist.bin}">

            <fileset dir="${src.script}/"/>

        </copy>

        <copy todir="${dist.docs}">

            <fileset dir="${build.docs}/"/>

        </copy>

        <!-- copy lib 文件 -->

        <copy todir="${dist.lib}">

            <fileset dir="${build.lib}/"/>

        </copy>

<copy todir="${deploydir}">

<fileset dir="${dist.lib.server}/"/>

</copy>

</target>

 

</project>

 

很多人一开始看这个文档, 会摸不着边, 其实很简单,先来说明一下。

<project default="dist" basedir=".">

……

</project>

 

关于这个标签的说明, 表示了几个意义

1)  执行的基本目录在build.xml的当前目录

2)  这个project的起始任务是”dist”

ok,我们来查找, targetname=dist”的标签:

<target name="dist" depends="javadocs">

        <!--copy bin 执行文件 -->

        <copy todir="${dist.bin}">

            <fileset dir="${src.script}/"/>

        </copy>

        <copy todir="${dist.docs}">

            <fileset dir="${build.docs}/"/>

        </copy>

        <!-- copy lib 文件 -->

        <copy todir="${dist.lib}">

            <fileset dir="${build.lib}/"/>

        </copy>

<copy todir="${deploydir}">

<fileset dir="${dist.lib.server}/"/>

</copy>

</target>

这个标签里面里面描述了另外一个信息,depends="javadocs" 这就表明, 做这个动作之前必须先完成javadocs这个标签, 那我们又继续查找target name=”javadoc”的标签, 依此类推, 最后发现第一个执行的是init这个target 所以, 在编写builder.xml时, 他最先写, 因为实际ant执行时是从他开始的

发表于 @ 2004年07月14日 08:54:00|评论(loading...)|编辑

新一篇: 说说Java的args,大家可能没有注意到的现象 | 旧一篇: TextField中进行字符的输入限制

评论

#lingice 发表于2004-07-14 19:19:00  IP: 61.49.208.*
写的好极了,原来我也写了一个,但远没有你的详细!
谢谢
#oldJavaman 发表于2004-07-14 22:35:00  IP: 220.192.108.*
谢谢鼓励, 我会写下去的, 介绍ant的各种定义
发表评论