如何使用Ant来编译Java文件以及如何运行

如何使用Ant来编译Java文件以及如何运行,第1张

一、源文件情况

源文件位置为:D:\temp,源文件名(含包名字):com.ldq.WeatherDemo.java

前提:已安装 jdk ,并配置好环境变量。

二、过程

1、编译

提示符进入 D:\temp 路径下,输入:javac com\ldq\WeatherDemo.java

生成类文件:WeatherDemo.class

2、打包:

提示符进入 D:\temp 路径下,输入:jar cvf WeatherDemo.jar com\ldq\WeatherDemo.class

生成档案文件:WeatherDemo.jar

3、修改 MANIFEST.MF 文件:

由于引用了外部的类,所以要添加引用类的路径,即修改MANIFEST.MF文件。保存如下内容到 D:\temp下,文件名 MANIFEST.MF

Manifest-Version: 1.0

Sealed: true

Main-Class: com.ldq.WeatherDemo

Class-Path: lib/jaxrpc.jar lib/log4j-1.2.8.jar lib/mail.jar lib/saaj.jar lib/tools.jar lib/wsdl4j-1.5.1.jar lib/activation.jar lib/axis.jar lib/axis-ant.jar lib/commons-discovery-0.2.jar lib/commons-logging-1.0.4.jar

注意在后面空两行。

提示符进入 D:\temp 路径下,输入:jar umf MANIFEST.MF WeatherDemo.jar

执行时会提示更新的内容。

4、添加包含引用类的相应文件:

在 D:\temp 路径下,新建 lib 文件夹,讲对应的 jaxrpc.jar ... 拷入其中,此时,即可双击(或在提示符下输入:java -jar WeatherDemo.jar)运行 WeatherDemo.jar 文件了。

三、总结

双击运行 jar 文件时,虚拟机会到 jar 文件中下找 .MF 文件,找到对应的 Main-Class 运行,引入的类在 Class-Path 所指路径。

事实上可以利用 winrar或winzip 工具打开 jar 文件,直接将修改好的 MANIFEST.MF 拷入覆盖,class文件也可以做同样的 *** 作,节省了输入复杂难记的命令。另外,对于 javaME 生成的 jar 文件,限制严格些,MANIFEST.MF 文件中有个文件大小的字段,可以先保存,查看文件大小,再修改保存。

另一种方法是通过 Eclipse - Export - Runnable JAR file 直接生成 jar 文件,此时,所有的引用类都被打包在 jar 文件里了。

首先我们来看看如何使用ant脚本打出一个jar包 我们新建一个工程AntExportJar 在工程的目录下面新建一个build.xml,这个是ant脚本规定的一个入口脚本文件,文件名都是:build.xml [html] view plain copy?

<?xml version ="1.0" encoding ="UTF-8" ?>

<project name ="AntExportJar" basedir ="." default ="exportJar" >

????<!--?设置全局变量?-->

????<property name ="src" value ="src" />

????<property name ="dist" value ="dist" />

????<property name ="app.name" value ="ant" />

????<property name ="app.version" value ="1.0" />

????<property name ="classes.encode" value ="GBK" />

????<property name ="lib" value ="libs" />

????<property

????????name ="project-dir"

????????value ="C:\Users\i\workspace\AntExportJar" />

????<property

????????name ="sdk-folder"

????????value ="C:\Users\i\AppData\Local\Android\sdk" />

????<property

????????name ="platform-folder"

????????value ="${sdk-folder}\platforms\android-22" />

????<property

????????name ="android-jar"

????????value ="${platform-folder}\android.jar" />

????<property

????????name ="src"

????????value ="${project-dir}\src" />

????<property

????????name ="bin"

????????value ="${project-dir}\bin" />

????<property

????????name ="libs"

????????value ="${project-dir}\lib" />

????<!--?task?-->

????<target name ="init" >

????????<echo>

????????????Initialize...

????????</echo>

????????<delete dir ="${bin}" />

????????<mkdir dir ="${bin}" />

????</target>

????<target name ="buildFiles" depends ="init" >

????????<javac

????????????????bootclasspath ="${android-jar}"

????????????????compiler ="javac1.7"

????????????????target ="1.7"

????????????????destdir ="${bin}"

????????????????encoding ="GBK"

????????????????includeAntRuntime ="true"

????????????????listfiles ="true" >

????????????????<src path ="${project-dir}" />

????????????????<classpath>

?????????????????????<!--?引用第三方jar包需要引用,用于辅助编译,并没有将jar打包进去。jar的打包在dex命令中。-->

?????????????????????<fileset dir ="${libs}" includes ="*.jar" />

????????????????</classpath>

????????</javac>

????</target>

????<!--?导出jar文件?-->

????<target name ="exportJar" depends ="buildFiles" >

????????<delete dir ="${dist}" />

????????<!--?Create?the?distribution?directory?-->

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

????????<!--?Put?everything?in?${classes}?into?the?MyProject-${DSTAMP}.jar?file?-->

????????<jar jarfile ="${dist}/${app.name}.jar" basedir ="${bin}" >

????????????<!--

????????????<fileset?dir="${libs}"?includes="**/*.jar"?/>

????????????-->

????????????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/Baidu_NativeAd_SDK.jar" />

????????????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/gdt_mob_release.jar" />

????????</jar>

????</target>

</project>

脚本很简单,下面我们就来分析一下: [html] view plain copy?

<project name ="AntExportJar" basedir ="." default ="exportJar" >

最外围的一个标签是project,是一个工程标签,有名字,还有就是工程的目录baseDir,用点号:"." 接下来就是定义全局变量,或者是属性值: [html] view plain copy?

<!--?设置全局变量?-->

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

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

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

<property name ="app.version" value ="1.0" />

<property name ="classes.encode" value ="GBK" />

<property name ="lib" value ="libs" />

<property

????name ="project-dir"

????value ="C:\Users\i\workspace\AntExportJar" />

<property

????name ="sdk-folder"

????value ="C:\Users\i\AppData\Local\Android\sdk" />

<property

????name ="platform-folder"

????value ="${sdk-folder}\platforms\android-22" />

<property

????name ="android-jar"

????value ="${platform-folder}\android.jar" />

<property

????name ="src"

????value ="${project-dir}\src" />

<property

????name ="bin"

????value ="${project-dir}\bin" />

<property

????name ="libs"

????value ="${project-dir}\lib" />

这样我们在后面就可以使用:${name值} 来使用value值的定义了,所以这里就相当于定义了变量的作用,这里我们看到有一些value值是路径,但是这里我们感觉有一个不好的地方,就是这些路径是写死的,那么我们还可以怎么做能让他变得灵活呢?其实很简单,ant脚本中是可以访问环境变量的,那么我们只要将这些路径定义成环境变量就可以了: [html] view plain copy?

<property environment ="env" />

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

第一行先申明一个环境变量值,这个env是公共的写法,也是ant自带的,他表示当前的环境变量的值,那么后面就可以访问具体的哪些环境变量了,比如这里我配置了ANDROID_HOME这个环境变量,那么就可以用${env.ANDROID_HOME}来访问androidsdk的目录了,和上面的那个直接使用绝对路径的方式是一样的。 解析来就是定义task了,在ant中task也是最重要的,我们最终运行的都是task,就相当于Java中的main方法一样。ant脚本中可以定义多个task,而且每个task可以有执行的先后顺序的。相当于Java中的方法中调用其他方法一样。 [html] view plain copy?

<!--?task?-->

<target name ="init" >

????<echo>

????????Initialize...

????</echo>

????<delete dir ="${bin}" />

????<mkdir dir ="${bin}" />

</target>

首先这里定义了一个初始化的task,其中echo标签也是很常用的,就是打印信息的,然后是删除目录${bin},这个bin变量在上面已经定义了,然后在创建${bin}目录。 初始化完之后,开始执行编译工作: [html] view plain copy?

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

????<javac

????????bootclasspath ="${android-jar}"

????????compiler ="javac1.7"

????????target ="1.7"

????????destdir ="${bin}"

????????encoding ="GBK"

????????includeAntRuntime ="true"

????????listfiles ="true" >

????????<src path ="${project-dir}" />

????????????<classpath>

????????????????<!--?引用第三方jar包需要引用,用于辅助编译,并没有将jar打包进去。jar的打包在dex命令中。-->

????????????????<fileset dir ="${libs}" includes ="*.jar" />

????????????</classpath>

????</javac>

</target>

这里在此定义一个buildFiles的task,depends的值是表示当前的task在这个depends的task执行完之后在执行,这里就是先执行init的task,然后在执行buildFiles的task,这里的task主要是编译Java成class文件: bootclasspath:表示编译依赖的系统库,这里依赖的是android.jar compiler:表示编译的java版本 target:表示编译之后的class的版本,就是能够运行的java版本 destDir:表示编译之后的class文件的存放目录 其他的就不说了,这里还有一个重点,也就是我们在编译的时候会遇到的问题,就是我们在编译的时候,会引用到第三发的jar,所以这里我们为了保证能够编译过,这里还必须用classpath标签来引用这些jar,当然这里只是能够保证编译通过,并不会把这些jar也编译到最终我们想要的jar中,这个问题我们后面再说。 下面在看最后的一个task,就是将编译完之后的class文件打包成jar文件: [html] view plain copy?

<!--?导出jar文件?-->

<target name ="exportJar" depends ="buildFiles" >

????<delete dir ="${dist}" />

????<!--?Create?the?distribution?directory?-->

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

????<!--?Put?everything?in?${classes}?into?the?MyProject-${DSTAMP}.jar?file?-->

????<jar jarfile ="${dist}/${app.name}.jar" basedir ="${bin}" >

????????<!--

????????<fileset?dir="${libs}"?includes="**/*.jar"?/>

????????-->

????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/Baidu_NativeAd_SDK.jar" />

????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/gdt_mob_release.jar" />

????</jar>

</target>

这里我们定义了一个exportJar的task,他是在buildFiles的task运行完之后在运行。 首先删除目标目录${dist},然后在创建一个目录。这个目录就是存放最后编译好的jar文件的目录 然后就是用jar标签来导出jar文件了: jarfile:表示编译完之后存放的jar文件名路径 basedir:表示需要编译jar的class文件目录 其他就OK了,但是在实际中我们在编译的过程中会引用到第三方的jar,那么这时候我们把这些jar编译到最终的jar中,说道这里,其实我们在使用Eclipse导出jar的时候,有一个插件可以做到这点:fat-jar,安装完插件

ant 的 build.xml 中指定引用的位置,,,,,,其实,放哪都可以,但建议放 项目目录的lib目录里面。

~~~~~~~btw,换maven2吧,这样包的管理也方便


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11766123.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存