码迷,mamicode.com
首页 > 编程语言 > 详细

Ant打包可运行的Jar包(加入第三方jar包)

时间:2016-04-09 21:48:45      阅读:380      评论:0      收藏:0      [点我收藏+]

标签:

本章介绍使用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包)

标签:

原文地址:http://www.cnblogs.com/alfredinchange/p/5372657.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!