Ant打包可运行的Jar包(加入第三方jar包)
介绍使用 Ant 打包可运行的 Jar 包。
打包 jar 包最大的问题在于如何加入第三方 jar 包使得 jar 文件可以直接运行,以下用实例进行说明。
程序结构:

关键代码:
package com.alfred.main; import com.alfred.bean.User;
import com.alfred.util.ProjConfig;
import com.thoughtworks.xstream.XStream; public class Main {
public static void main(String[] args) {
User user = new User();
user.setUsername("alfred");
user.setAge(15);
XStream xstream = new XStream();
String xml = xstream.toXML(user);
System.out.println("in Main");
System.out.println("prop:"+ProjConfig.MY_PROPERTY);
System.out.println("xml:"+xml);
}
}
Main.java
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="usage" name="antproj">
<!-- 引入配置文件 -->
<property file="build.properties" />
<!-- 配置引用属性 -->
<property name="src.dir" value="src" />
<property name="config.dir" value="config" />
<property name="build.dir" value="build" />
<property name="lib.dir" value="lib" />
<property name="name" value="antproj" /> <path id="master-classpath">
<fileset dir="${lib.dir}">
<include name="*.jar" />
</fileset>
<pathelement path="${build.dir}" />
</path> <target name="usage">
<!-- 输出信息到控制台中 -->
<echo message="" />
<echo message="${name} build file" />
<echo message="-----------------------------------" />
<echo message="" />
<echo message="Available targets are:" />
<echo message="" />
<echo message="build --> Build the application" />
<echo message="" />
</target> <!-- 编译生成class文件 -->
<target name="build"
description="Compile main source tree java files"> <!-- 删除编译存放的classes文件 -->
<delete dir="${build.dir}/classes"></delete>
<!-- 新建编译存放的classes文件 -->
<mkdir dir="${build.dir}/classes" />
<copy todir="${build.dir}/classes">
<!-- 将项目中除会编译生成class文件的java文件之外其他类型的文件拷贝到对应的目录下,指定文件名后缀 -->
<fileset dir="${src.dir}">
<include name="**/*.properties" />
<include name="**/*.xml" />
</fileset>
<fileset dir="${config.dir}">
<include name="**/*.properties" />
</fileset>
</copy>
<!-- java编译 -->
<javac destdir="${build.dir}/classes" source="1.5" target="1.5"
debug="true" deprecation="false" optimize="false" failonerror="true"
encoding="utf-8">
<src path="${src.dir}" />
<!-- 编译所需要的jar包路径 -->
<classpath refid="master-classpath" />
</javac>
</target> <target name="jar" depends="build"
description="Compress the java class files to jar"> <mkdir dir="${build.dir}/jar" />
<delete file="${build.dir}/jar/${name}.jar" />
<buildnumber file="${build.dir}/buildnum.txt" />
<!-- 指定时间戳 可以调用TODAY -->
<tstamp>
<format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" />
</tstamp> <!-- 生成清单文件 -->
<manifest file="${build.dir}/MANIFEST.MF">
<attribute name="Built-By" value="${user.name}" />
<attribute name="Implementation-Version"
value="${version.num}.${build.number}" />
<attribute name="Built-Date" value="${TODAY}" />
<attribute name="Main-Class" value="com.alfred.main.Main" />
</manifest> <!-- 打包jar -->
<!-- includes 包含哪些后缀文件 空格分隔 -->
<jar destfile="${build.dir}/jar/${name}.jar"
basedir="${build.dir}/classes"
includes="**/*.class **/*.properties **/*.xml"
manifest="${build.dir}/MANIFEST.MF">
<zipfileset src="${lib.dir}/xstream-1.4.9.jar"></zipfileset>
<zipfileset src="${lib.dir}/xpp3-1.1.3.3.jar"></zipfileset>
</jar>
</target> <target name="cleanup">
<!-- 删除编译文件夹下的所有文件(不包括编译文件夹下的文件夹)
<delete>
<fileset dir="${build.dir}/classes" includes="**/*.*" />
</delete>
-->
<!-- 删除编译文件夹 -->
<delete dir="${build.dir}/classes" />
</target>
</project>
build.xml
将第三方 jar 包加入的关键代码是:
<zipfileset src="${lib.dir}/xstream-1.4.9.jar"></zipfileset>
<zipfileset src="${lib.dir}/xpp3-1.1.3.3.jar"></zipfileset>
这种情况下生成的 jar 包内部结构如下:


可以看到第三方 jar 包实际上都被拆开打包进我们的 jar 包了。如果使用的第三方 jar 包太多的话,会变得非常混乱。这时可以通过单独将程序打包为 jar 包,通过引用的方法调用外部第三方 jar 包的方式运行。
如果使用如下的写法:
<zipfileset dir="${lib.dir}">
<include name="*.jar"/>
</zipfileset>
那么打包生成的 jar 包将无法正常调用第三方 jar 包,jar 包结构如下:


可以看到第三方 jar 包都是完整的。
由以上示例可知,无论是将第三方 jar 包拆分打包(结构混乱)还是保持第三方 jar 包完整打包(无法正常运行),都存在一定的问题,以下介绍一种通过引用的方式调用第三方 jar 包的方式。
在 build.xml 中新建一个任务
<target name="jar2" depends="build" description="Compress the java class files to jar">
<mkdir dir="${build.dir}/jar" />
<delete file="${build.dir}/jar/${name}.jar" />
<buildnumber file="${build.dir}/buildnum.txt" />
<!-- 指定时间戳 可以调用TODAY -->
<tstamp>
<format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" />
</tstamp> <pathconvert property="quote.classpath" pathsep=" ">
<mapper>
<chainedmapper>
<!-- jar包文件只留文件名,去掉目录信息 -->
<flattenmapper />
<!-- add lib/ prefix -->
<globmapper from="*" to="lib/*" />
</chainedmapper>
</mapper>
<path refid="master-classpath" />
</pathconvert> <!-- 生成清单文件 -->
<manifest file="${build.dir}/MANIFEST.MF">
<attribute name="Built-By" value="${user.name}" />
<attribute name="Implementation-Version" value="${version.num}.${build.number}" />
<attribute name="Built-Date" value="${TODAY}" />
<attribute name="Main-Class" value="com.alfred.main.Main" />
<attribute name="Class-Path" value="${quote.classpath}" />
</manifest> <!-- 打包jar -->
<!-- includes 包含哪些后缀文件 空格分隔 -->
<jar destfile="${build.dir}/jar/${name}.jar"
basedir="${build.dir}/classes"
includes="**/*.class **/*.properties **/*.xml"
manifest="${build.dir}/MANIFEST.MF">
</jar>
</target>
将关联的第三方 jar 包通过路径转换加上路径前缀(也就是之后你 jar 包引用第三方 jar 包的路径),生成新的路径信息 quote.classpath,将路径信息配置进 Class-Path 属性,通过这种方式生成的 jar 包中 MANIFEST.MF 文件内容中 Class-Path 如下:
Class-Path: lib/xpp3-1.1.3.3.jar lib/xstream-1.4.9.jar
之后我们将第三方 jar 包放置于 lib 目录中,将打包后的 antproj.jar 放置于和 lib 同级目录,运行 jar 正常。
另外,要打包可运行的 jar 包,加入第三方 jar 包的话,也可以通过一些 IDE 的插件,例如:fatjar。
Ant打包可运行的Jar包(加入第三方jar包)的更多相关文章
- Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参
Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参 一.打包 情况1:不需要向程序传参数,并且程序没有使用第三方jar包 Eclipse上导出jar: 然后选择一个java文件作为入 ...
- eclipse打包jar时包含第三方jar包的相关问题
我用的是mars4.5版本的eclipse 需求:要把写好的工程打成jar包,并能直接运行.工程用了若干个第三方jar. 在打包的时候,eclipse提供的打包方法不能引用第三方jar包,导致了出现C ...
- myeclipse8.5打包jar并引入第三方jar包
用myeclipse自带的export工具,无法引入被引用的第三方的jar包,有两种方式: (1)直接export出jar包,解压jar包(第三方的jar包太多,太麻烦) 在创建好的JAR文件里找到M ...
- 用eclipse打包可执行的jar(含第三方jar包)
在eclipse中的解决方式如下: 在工程目录下(与src同层)建立lib目录,将第三方Jar包放到这个目录里(copy,paste即可)[如果直接引用本地的jar,一旦换电脑就呵呵了...] 右击工 ...
- 将Maven项目打包成可执行jar文件(引用第三方jar)
方法一. mvn assembly 或 mvn package (一个jar包) 把依赖包和自己项目的文件打包如同一个jar包(这种方式对spring的项目不支持) <build> ...
- eclipse打jar包解决第三方依赖包
在项目根目录下手动MANIFEST.MF(eclipse无法自动生成) MANIFEST.MF Manifest-Version: 1.0 Class-Path: lib/kafka-clients- ...
- 用ant打包可运行的jar文件 (将第三方jar包放进你自己的jar包)
http://blog.csdn.net/caiqcong/article/details/7618582 <span style="font-family:SimSun;font-s ...
- Maven打包jar-打包jar时引入第三方jar
- 将Maven项目打包成可执行 jar文件(引用第三方jar)
使用maven assembly插件完成打包 修改pom: <build> <pluginManagement> <plugins> <!--设置jdk版本, ...
随机推荐
- bug: '\xff' 转换成-1 而不是255
后台给的值处理后 Byte rtncode = payload[0]; 打印payload[0]是'\xff', 增加 if (rtncode ==255 ){ ....} 的判断,跳里面去了 然后用 ...
- 跨域的问题(nginx解决才是王道)
跨域分为两类:一时get跨域,而是post跨域.常见的是三种: 一种是jsonp, $.ajax({ url: "http://127.0.0.1/~chenjiebin/mycode/ph ...
- JavaScript学习(四)
- 林兴爆料小程序很快可以支持各个 App 直接打开小程序
在微信开放平台基础高级产品经理林兴演讲的当场,他爆料了微信小程序一个轰动性新能力:小程序很快可以支持各个 App 直接打开小程序!没错,你没有听错,简单来说,在不久以后,所有的 App 里面都可以看到 ...
- what's the 套期保值
出自 MBA智库百科(https://wiki.mbalib.com/) 什么是套期保值 套期保值是指把期货市场当作转移价格风险的场所,利用期货合约作为将来在现货市场上买卖商品的临时替代物,对其现在买 ...
- MACD回零轴有三种方式
MACD回零轴三种方式 MACD上双线回抽或者回档到0轴附近: 第一主动回零轴. 第二被动回零轴. 第三单N回零轴. 随后的走势第二种涨幅最猛.第三种级别最大. 这里要正确理解背离.背离有三种.1,指 ...
- 20165236 2017-2018-2 《Java程序设计》第九周学习总结
20165236 2017-2018-2 <Java程序设计>第九周学习总结 一.第十三章教材内容总结 1.URL类 URL类是java.net包中的一个重要的类,使用URL创建对象的应用 ...
- vue中$emit 和$on 和$set的用法
1.$set的用法:给 student对象新增 age 属性 data () { return { student: { name:"里斯'} } } 直接给student赋值不会触发视图更 ...
- eclipse 优化
1.取消验证 windows–>perferences–>validation 把 除了manual 下面的全部点掉,build下只留 classpath dependency Valid ...
- (转)EOS中账户、钱包和密钥的关系
EOS对于账户的设计与ETH有很大的不同,引入了Account账户, Wallet钱包, 钱包密码, Key公私钥, Permission权限等众多概念,刚入门的时候感觉一头雾水.本文希望通过对这些概 ...