`
yuxiaoshui
  • 浏览: 28114 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于使用ant制作可执行jar

阅读更多

   由于部署的需要,需要将业务实现打成可执行jar部署在linux上长期运行。一般说,用Eclipse导出jar即可,他会把依赖的jar一起打到我们的最终jar中,这个过程是手动的-----对于我习惯于使用自动化时,这就让我不爽了,且:使用eclipse导出的可执行jar,eclipse本身会在里面加一些属于自己的东西, 不信你可以看看 jarFile/META-INF/MANIFEST.MF就知道了,其中加了一些属于eclipse的jar,包括启动类也是eclipse的, 实际上我的jar已经依赖够多了,这也是我不能容忍的地方,因此,我简单的拓展了下ant 任务,使用自定义任务结合 ant 的 jar任务,一起打可执行包。

   关于制作可执行jar有几种方式,不清楚的地方可以参考这篇博客
   http://yangdc.iteye.com/blog/144507 

  
  好了,有了上面的基础知识后,我们对比一下就知道第三种方式最适合,因为这样我们可以在应用程序级别上管理我们应用的依赖lib。 其核心思想就是 在清单文件中指定类路径,这样的话我们即可在将引用的jar 单独放在某个目录,只需在打包的适合指定即可。
但是第三种方式也有个缺点,如果你引用的jar比较多,那么你不得不写很长很长的路径,如: Class-Path:classes12.jar  lib/class12.jar....................
或者聪明一点的是写个小程序去遍历classpath吧,但是如果处于调试阶段,你将重复的去制作清单文件,打包。。。。。。烦死了。
 
 
  下面的内容需要一定的ant基础。

      制作可执行jar一个比较重要的任务就是 在清单文件中指定启动类(Main-Class)和Class-Path属性,这样的话在执行jar的适合,JVM就知道从什么地方加载、哪个类是入口类----执行才为可能。
     
      ant的jar 任务可以在订单文件中写入各种属性,其中Main-Class可以我们手动指定, 而Class-Path手动指定就太麻烦了。  由于jar引用的classpath是确定,且jar任务可以写入任何清单属性,那么,我们能不能将classpath生成然后借助jar任务写入清单文件件呢?

      上面就是基本原理,废话少说(已经说了很多啦), 下面是如何拓展ant任务。

      Task的参数
      classpath: 类路径Path类,需要将这path代表的jar的名称写入清单中
      outClassPath:通过任务生成的Class-Path,这个值实际上是一个属性的key值,
                      可以通过引用这个key 得到task生成的类路径列表。
      libPath  :  这个是生成在每一个jar前面的根路径,通过指定这个值,
                     可以控制最终生成可执行jar的目录中引用lib的位置已经文件件名称。 

  再看看如何拓展ant任务。

 

  

public class BuildClassPathTask extends Task {

 private String outClassPath;

 private Path classpath;

 private String libPath;

 @Override
 public void execute() throws BuildException {

  super.execute();

  if (null == outClassPath || "".equals(outClassPath.trim())) {
   throw new BuildException("outClassPath could not be null!");

  }
  if (null == classpath) {
   throw new BuildException("classpath could not be null!");
  }

  String[] all = classpath.list();

  StringBuilder sb = new StringBuilder();

  if (null == libPath || "".equals(libPath)) {
   libPath = "";
  }

  libPath += "/";

  for (int i = 0; i < all.length; i++) {

   String filePath = all[i];
   filePath = filePath.substring(1 + filePath.lastIndexOf(System
     .getProperty("file.separator")));
   sb.append(libPath);
   sb.append(filePath);
   sb.append(" "); // one blank
  }
  sb.append(System.getProperty("line.separator"));
  System.out.println("execute :  " + sb.toString());

  PropertyHelper ph = PropertyHelper.getPropertyHelper(getProject());
  ph.setNewProperty(outClassPath, sb.toString());

 }

 public String getOutClassPath() {
  return outClassPath;
 }

 public void setOutClassPath(String outClassPath) {
  this.outClassPath = outClassPath;
 }

 public Path createClasspath() {
  if (classpath == null) {
   classpath = new Path(getProject());
  }
  return classpath.createPath();
 }

 public void setClasspath(Path classpath) {
  this.classpath.append(classpath);
 }

 public Path getClasspath() {
  return classpath;
 }

 public String getLibPath() {
  return libPath;
 }

 public void setLibPath(String libPath) {
  this.libPath = libPath;
 }

 

  上面的代码简单的说就是: 我有一个引用lib,通过这个Task 生成一个jar清单格式的Class_Path,然后将这个拼装好的路径放在Ant的上下文属性中,你可以在jar中引用这个属性,并最终写入你的jar的清单文件中。

   我们将上面的Task编译打包然后放在ant的lib目录下去,这样就成了我的工具的一部分了,这部分工作我使用的仍是ant,build.xml文件是:

 

<?xml version="1.0"?>
<project default="main" basedir=".">
 <property name="source" value="src/com/" />
 <property name="classes" value="build/classes" />
 <property name="jar.path" value="build/jar" />
 <property name="jar.name" value="deftask.jar" />

 <delete dir="${classes}" />
 <mkdir dir="${classes}" />

 <target name="main">
  <javac srcdir="${source}" destdir="${classes}">
  </javac>
  <jar destfile="${jar.path}/${jar.name}" basedir="${classes}" update="true" />
  <copy tofile="${ant.home}/lib/${jar.name}" file="${jar.path}/${jar.name}" overwrite="true" />
 </target>
</project>



    执行上面的ant后,这个任务就部署在 ANT_HOME/lib目录下了,以后可以随意使用了。

现在看如何使用它:

    在编译打包我的目标应用程序时,使用的ant,部分代码如下:

 

<javac srcdir="${sources}" destdir="${destDir}">
   <classpath>
    <fileset dir="lib" includes="*.jar">
    </fileset>
   </classpath>
  </javac>

  <taskdef name="buildClassPath" classname="com.taoyu.ant.excutable.jar.BuildClassPathTask">
   <classpath>
    <fileset dir="${ant.home}/lib" includes="*.jar" />
   </classpath>
  </taskdef>

  <buildClassPath libpath="lib" outclasspath="manifest_class">
   <classpath>
    <fileset dir="lib" includes="**/*.jar" />
   </classpath>
  </buildClassPath>

  <jar destfile="${build}/${jarFileName}" basedir="${destDir}" update="true">
   <manifest>
    <attribute name="Main-Class" value="com.rockton.syn.task.Laungher" />
   </manifest>
   <manifest>
    <attribute name="Class-Path" value="${manifest_class}" />
   </manifest>
  </jar>

  <echo message="jar file over" />

  <ftp action="send" server="192.168.1.6" userid="root" password="ytsj" remotedir="/root/userfile/yutao/synDataTool/lib">
   <fileset dir="lib" />
  </ftp>




  上面是: 编译-->声明自定义任务---->生成路径串-->打包--->部署到环境


好了,整个过程就这么个过程,如果有帮助到你我很荣幸,如果需要帮助,请留言。QQQ!


关于那个 libPath的作用可以用下图了解释:

    dir(d://test)
    ------DataSynTool.jar (那个可执行jar)
    ------lib(所以引用的第三方jar包) libPath=lib  你现在应该明白什么意思了

附件是ant任务定义工程, 下载解压后可以直接导入你的eclipse中。

 

分享到:
评论

相关推荐

    ant 将依赖的jar包和classes文件一起打成可执行jar

    以下是一些关于如何使用Ant构建包含依赖的可执行JAR的关键知识点: 1. **Ant配置文件**:Ant的工作是基于一个名为`build.xml`的配置文件,这个文件列出了所有的构建任务。在这个例子中,我们看到有一个名为`build....

    ant.jar,ant-junit.jar,ant-launcher.jar,ant-trax.jar

    例如,你可以使用ant.jar来编译源代码、创建类路径、打包JAR文件,甚至运行单元测试。这个库是使用Ant进行项目构建的基础,几乎所有的Ant任务都依赖于它。 2. ant-junit.jar:此文件扩展了Ant的功能,使其能够集成...

    制作可执行jar文件【3中方法】

    制作可执行的JAR文件是Java开发者经常遇到的任务,它允许我们将代码和资源打包成一个独立的可执行文件。下面将详细介绍三种制作可执行JAR文件的方法。 **方法一:使用WinRAR或WinZIP** 这种方法相对简单,适用于...

    apache-ant-1.9.6的jar包

    在Eclipse中,开发者可以利用这些jar文件配置Ant插件,使Eclipse能够理解并执行Ant构建过程。Eclipse的集成使得开发者能够在IDE内部直接运行build.xml文件,无需离开编辑器,提高了开发效率。 标签“ant”标识了这...

    使用ant 元件所用的 jar 包

    在这个例子中,`destfile`属性指定了输出的JAR文件,`fileset`定义了要包含的文件(这里是编译后的类文件),而`manifest`部分则添加了主类的信息,使得JAR文件可以作为可执行程序运行。 在描述中提到的"ant-jar...

    ant-launcher.jar.zip

    遵循这个许可协议,开发者可以在自己的项目中自由地使用Ant,同时也必须尊重开源的精神,保留Apache的版权信息。 了解Ant-Launcher.jar后,我们来看看如何在实际开发中使用它。首先,需要确保Java环境已安装,并且...

    ant-dependencies.jar.zip

    阅读此文件,开发者可以了解使用Ant的法律条款,确保符合开源社区的规定。 总结,"ant-dependencies.jar.zip"是一个包含了Ant运行所必需的依赖库的压缩文件,配合"ant.license.txt",为开发者提供了一个便捷、合规...

    ant-contrib.jar

    正确理解和使用Ant Contrib,能够使开发过程更加高效,构建流程更加可控,对于提升团队开发效率具有显著作用。因此,熟悉并掌握Ant Contrib的使用,对于任何Java开发人员来说都是一个重要的技能。

    使用ANT所需jar包

    在使用ANT时,你需要在类路径(classpath)中包含这些JAR文件,以便ANT在运行时能找到并加载所需的库。这可以通过在ANT的`&lt;classpath&gt;`标签中指定JAR文件的位置来实现。例如: ```xml &lt;path id="ant.classpath"&gt; ...

    ant-1.6.5.jar

    描述中的“使用apache ant jar包进行zip打包操作”可能是指使用Ant来创建ZIP格式的归档文件,尽管`jar`任务通常用于生成JAR文件,但通过特定配置,也可以处理ZIP格式。 关于描述中提到的问题,“为什么资源分不能选...

    ant-installer.jar.zip

    其中,"ant-installer.jar"是Ant的安装程序,它是一个可执行的JAR文件,通过运行这个文件,用户可以在本地系统上轻松安装Ant。而"ant.license.txt"则包含了Ant的许可证信息,阐述了Ant的使用条款和条件,对于尊重...

    ant-1.5.4.jar.zip

    JAR文件是一种归档格式,它允许将多个Java类文件、资源文件和其他相关文件打包到一个单一的可执行文件中。这有助于减少网络传输的时间,同时也能提供一种方式来保护代码版权,因为JAR文件可以被签名。 在压缩包内,...

    ant脚本编译jar

    `&lt;manifest&gt;`部分用于添加`JAR`的清单文件,`Main-Class`属性指定了程序的主类,使得`JAR`可以作为可执行文件运行。 在实际项目中,可能还需要其他任务,比如清理(`clean`)构建输出,或者进行单元测试(`junit`)...

    制作可执行的JAR文件包及jar命令详解

    本文将详细介绍如何制作可执行的JAR文件以及如何使用`jar`命令。 首先,理解JAR文件的结构至关重要。JAR文件本质上是一个ZIP格式的归档,包含了编译后的`.class`文件、资源文件(如图片、配置文件等)以及相关的元...

    ant-javamail.jar.zip

    4. **ant.license.txt**:此文件包含了Apache 2.0许可协议的详细内容,该协议允许用户自由地使用、复制、修改和分发ant-javamail.jar,但需遵守一定的条款,如保留原有的版权信息和许可声明。 5. **应用实例**:一...

    ant-eclipse.jar.zip

    前者是主要的可执行文件,可能包含了Ant-Eclipse插件的实现,使得用户可以在Eclipse内无缝地使用Ant功能。后者,ant.license.txt,很可能是该插件的许可协议文件,详细列出了使用该软件的条款和条件,对于合法和合规...

    ant-1.5.1.jar.zip

    3. **使用Ant-1.5.1.jar** - 用户可以通过Java的`java -jar`命令来运行Ant,例如`java -jar ant-1.5.1.jar`,在运行前需要确保系统环境变量`ANT_HOME`指向Ant的安装目录。 - 在执行构建时,Ant会解析`build.xml`,...

Global site tag (gtag.js) - Google Analytics