`
祖祖cool
  • 浏览: 52196 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

使用Ant 以致Java JARs打包变起来简单,也更可靠

阅读更多
    日常生活中,我们都知道:因开发版本的不断改变而导致的项目进度混乱,系统bug蚕生,以及源码知识库破坏,开发队伍很长一段时间以来都争议着版本号与内部识别系统的关系,比如发布、修正、转折点、建立号。这些只限于办公室的讨论很少见于数据表格,网站,以及CDs中。然而,相比于办公室的版本号,他们的争议往往显得更加有用,尤其是当回答一个新的bug出现时提出的“这在这一版本号中有什么区别?”的问题的时候。
  
  当然,非同版本的系统,其存在是因为其能够指定Build工具中的发布标示。有些制作商对开发代码做出严格的保密,开发人员必须记住每一种版本改变所需要更改的信息。其他工程依赖于一些由许多源码管理系统支持的符号替换系统。另外,很多其他工程仍然需要手工地建立存档文件内部的一些小的文本文件。
  每一个版本都有自己的问题。开发人员通常会忘记增加Build数目──尤其是对“quick, little fixes”的分类,这样会很有可能导致出现bug。源码管理系统是基于文件,而且反映的只是简单文件的版本信息。当JARs打包,优化,融合的时候可以去掉文本文件。
  
  使用发布标识符来打包的更好方法是依赖于使用Ant build系统提供的符号过滤器。当从一个地方复制文件到另一个地方时,Ant复制任务可以使用任意字符串替代形成@TEXT@的符号。使用这一特性和一些其他Ant build文件技巧,我们可以确保所有的JARs能够具有一个发布号而获得打包,从而可以避免开发过程中的很多麻烦。
  
  源文件
  现在让我们看一看我们范例程序的源文件,即MyApp.java ( Listing A)。
  
  Listing A
  
  public class MyApp {
  
    public static final String RELEASE = "@RELEASE@";
  
    public static final String APP_NAME = "MyApp";
  
    public static final String VERSION = "1.0";
  
  public static String getVersionString() {
      return APP_NAME + " " + VERSION + " ("
  
        + System.getProperty("os.arch")+"; "+System.getProperty("os.name")
  
        + ((("@REL" + "EASE@").equals(RELEASE))?"":("; " + RELEASE))
  
        + ")";
  
    }
  
  public static void main(String[] args) {
      System.out.println(getVersionString());
  
    }
  
  }
  这一类文件中,你可以看到一个静态域和方法。第一个静态域名为RELEASE,其具有一个“@RELEASE@”的值。这也就是我们等下使用Ant复制过滤器取代的符号。然而现在,我们只需要将其置为“@RELEASE@”。
  
  两个静态方法中的第一个为getVersionString(),只是简单地连接了一些其他静态域的值,然后有选择性地添加RELEASE值,除非其值为字符串@RELEASE@。这种情况不需要添加RELEASE值,因为它包含很多无用的build识别信息。如果RELEASE在源文件编译之前已经被更改,这一值就会被添加到返回的版本字符中。
  
  请注意到,我们所使用与RELEASE值相比较的常量字符被分成两个字符串,这两个字符串在编译时被连接,这就防止Ant符号替代过滤器替代@RELEASE@常量。
  
  Build文件
  现在,我们将注意力转移到Build.xml文件(Listing B)。
  
  表B
  
  <project name="myapp" default="jar">
  
  <!-- where the project source code is found -->
   <property name="sources" value="src"/>
  
  <!-- where compiled class files should be left -->
   <property name="classes" value="classes"/>
  
  <target name="jar" depends="pre-jar,classes"
     description="build release jar">
  
    <jar destfile="jar/${ant.project.name}.jar">
  
     <fileset dir="classes">
  
      <include name="**/*.class"/>
  
     </fileset>
  
    </jar>
  
   </target>
  
  <target name="pre-jar" depends="ensure-release">
    <property name="srcdir" value="jar/src"/>
  
    <mkdir dir="${srcdir}"/>
  
    <copy todir="${srcdir}">
  
     <fileset dir="${sources}">
  
      <include name="**/*.java"/>
  
     </fileset>
  
     <filterset>
  
      <filter token="RELEASE" value="${release}"/>
  
     </filterset>
  
    </copy>
  
   </target>
  
  <target name="ensure-release" unless="release">
    <fail message="You must define -Drelease=<name>"/>
  
   </target>
  
  <target name="classes" description="compile classes">
    <property name="srcdir" value="${sources}"/>
  
    <mkdir dir="${classes}"/>
  
    <echo message="srcdir=${srcdir}"/>
  
    <javacdestdir="${classes}" srcdir="${srcdir}">
  
    </javac>
  
   </target>
  
  <target name="clean" depends="tidy" description="delete all generated files">
    <delete dir="jar" quiet="true"/>
  
   </target>
  
  <target name="tidy" description="delete all intermediary files">
    <delete dir="jar/src" quiet="true"/>
  
    <delete dir="classes" quiet="true"/>
  
   </target>
  
  </project>
  Build.xml文件采用了非普通的技巧,其中的一个目标是防止开发人员对每一次的编译指定发布信息。绝大部分的编译并非都需要发布,为了给每一测试编译提供一个发布名称,开发人员将通过使用一个固定的Build标识符的值来对他们的Builds过程进行脚本化。
  
  为了达到这一目的,我们将对象分离以建立类和任何的JARs。名为classes的类首先将其srcdir属性设置为前一个定义好的sources属性值,然后,当classes对象直接运行,使用编辑的Java sources文件将可以在scr目录中查找到。开发人员编写的源代码在被编译之前,允许使用IDE和其他程序,这就能够从编译错误信息中提取文件名然后可以在编辑程序中得以纠正。
  
  然而,当sources文件被编译为包含在一个JAR的类时,我们不会将这些类编译在scr目录中。相反,我们必须复制这些文件,然后执行符号替代。源代码目录的建立和声明都在pre-jar目标中执行。
  
  然后,pre-jar目标从scr目录中复制源代码层次到jar目录之下。在复制过程中,一个过滤器通过release属性的值取代字符@RELEASE@的所有具体值。在pre-jar对象中设置过滤源目录之后,classes对象将设置srcdir的值。幸运的是,Ant的不允许属性重新定义的规则防止了设置的值不会被覆盖。
  
  pre-jar目标处理过滤过程,但它无法保证用于@RELEASE@替代符号的release属性一定具有一个赋予值。这一过程可以通过ensure-release目标来检查,如果没有赋予值,就会跳出一个失败信息以说明如何指定一个发布标识符。
  
  集中
  pre-jar和ensure-release目标能够自动地被相关jar目标处理。尤其是jar目标确保它的任务被处理之前,pre-jar和classes被运行。首先pre-jar调用ensure-release目标以校验是否已经对发布标识符已经设置。结果是形成一个Build系统,这一系统能够使用classes目标(开发人员每一天编译和测试)运行。
  
  使用打包或非打包形式,缺省的Build标识符等,这些轮换构建方法都成为可能。现实中的Build过程通常会比较复杂,但是,只要能够避免javac任务的复本出现,绝大部分的构建都会变得直接明了。
3
1
分享到:
评论

相关推荐

    ant 编译用 jdt_jars

    Ant是一个开源的Java构建工具,它的主要功能包括编译源代码、打包、测试、部署等。与传统的Makefile相比,Ant使用XML来描述构建过程,使得构建脚本具有更好的跨平台性和可读性。Ant的核心概念是任务(Task),这些...

    java打包jar

    Java打包JAR(Java Archive)是一项常见的开发任务,它允许我们将多个类文件、资源和配置文件集合到一个可执行的JAR文件中。这有助于简化代码分发、部署和存储,同时也支持Java的类加载机制。在Eclipse这样的集成...

    apache-ant-1.7.0

    总体来说,Apache Ant 1.7.0作为一个强大的构建工具,为Java开发提供了一套规范化的流程,使得项目构建过程变得简单而可靠。虽然现在已经有了更现代的替代品,如Maven和Gradle,但Ant仍然是许多现有项目的基础,尤其...

    ant编译的文件要在eclipse中编译需要的jar文件

    在Java开发领域,Ant是一个非常重要的自动化构建工具,它由Apache软件基金会开发并维护。Ant以其XML为基础的构建文件(通常命名为build.xml)为开发者提供了跨平台的构建脚本,可以用于编译、打包、测试和部署应用...

    使用ANT远程发布Web项目

    本文主要介绍如何使用Apache Ant来实现Web项目的自动化打包并远程部署到Tomcat服务器上。 #### 二、准备工作 1. **环境配置** - **Eclipse IDE**:用于编写和构建项目。 - **Apache Ant**:用于自动化构建过程。...

    apache-ant-1.9.6的jar包

    Apache Ant 是一个开源的构建工具,它主要用于Java项目构建、自动化任务执行,如编译、打包、测试和部署。在Java开发中,Ant以其XML格式的构建文件(build.xml)著称,允许开发者定义项目构建的步骤和依赖关系。...

    java 打包

    本篇文章主要讲解Java打包的相关知识点,以及如何使用常用的打包工具。 首先,我们了解Java打包的基本概念。打包主要是将Java程序中的类文件、资源配置文件、库文件等整合到一起,形成一个独立的可执行文件。对于...

    apache-ant-1.9

    Apache Ant 是一个开源的构建工具,广泛用于Java项目,它基于XML来定义项目构建过程。在标题"apache-ant-1.9"中,我们关注的是Ant的1.9版本,这代表了该项目的一个特定稳定分支。Apache Ant 1.9系列在2013年发布,...

    ant的build文件说明

    Ant是Apache组织提供的一款开源构建工具,主要用于Java项目的构建、编译、测试和部署等任务。它的核心概念是基于XML的build文件,这个文件定义了一系列的任务(tasks)和目标(targets),来指导Ant如何执行构建过程...

    ant编译以及格式

    Ant是Apache软件基金会开发的一个Java库和命令行工具,其主要功能是驱动构建过程。它通过XML文件(称为build.xml)定义任务,这些任务可以包括编译、创建JAR文件、复制文件、运行测试等。Ant是Java项目管理和构建的...

    apache-ant-1.8.3-src.zip

    Apache Ant 是一个广泛使用的Java构建工具,其设计目标是通过XML描述构建过程,使得构建过程可配置、可扩展且易于管理。"apache-ant-1.8.3-src.zip" 是Apache Ant 1.8.3版本的源代码压缩包,它包含了Ant项目的所有源...

    一个完整的ant-j2se例子

    在这个例子中,我们将深入理解Ant的工作原理、基本配置文件(build.xml)的结构以及如何使用它来管理Java项目。 Apache Ant的核心概念是任务(Tasks),这些任务是Ant执行的具体操作,如编译源代码、打包JAR文件、...

    ant 初步

    除了基础任务,Ant还可以通过引入外部的Java库(JARs)来扩展功能,例如使用JUnit进行单元测试。此外,Ant也常与其他工具结合,如Maven和Gradle,提供更高级的构建管理。 总结,Ant作为一个轻量级的构建工具,其...

    ant打包,解决Eclipse环境下lib自定义变量部署问题

    Ant是一个由Apache软件基金会开发的Java构建工具,它以XML为基础,允许开发者定义构建任务,并提供了强大的依赖管理功能。 在Eclipse开发环境中,我们经常会遇到lib目录下的库文件(JARs或类路径)需要根据不同的...

    android自动打包方法(ant+proguard+签名)知识.pdf

    通过使用Ant构建工具,结合ProGuard进行代码混淆,并完成最终的签名操作,可以极大地提高Android应用的构建效率,同时也能有效保护应用的安全性。本篇文章提供了一个完整的示例,可以帮助开发者快速实现自动化打包...

    eclipse 打包 jar 碰到的问题(包含第三方包)

    对于更复杂的需求,可以编写自定义的shell脚本或批处理文件,使用`jar`命令行工具进行打包,同时通过`--classpath`参数指定依赖库。 例如,我们可以创建一个简单的bash脚本: ```bash #!/bin/bash cd /path/to/...

    基于Java的实例源码-图像处理类库 Java Image Filters.zip

    通过研究这个项目,开发者不仅可以提升在Java编程方面的技能,还能掌握如何在实际应用中处理和操纵图像,同时了解如何使用Ant进行项目构建。对于想要在Java环境中从事图像处理或图形用户界面开发的人来说,这是一个...

Global site tag (gtag.js) - Google Analytics