ant的jar打包的target
- <project name="client" default="compile" basedir=".">
- <property name="product" value="client"/>
- <property name="version" value="1.0"/>
- <property name="src.dir" value="${basedir}/src"/>
- <property name="build.dir" value="${basedir}/build"/>
- <property name="lib.dir" value="${basedir}/lib"/>
- <property name="jar.file" value="${product}.${version}.jar"/>
- <path id="classpath">
- <fileset dir="${lib.dir}">
- <include name="**/*.jar"/>
- </fileset>
- </path>
- <target name="clean">
- <echo>clean build dir</echo>
- <delete dir="${build.dir}" quiet="true"/>
- <delete file="${lib.dir}/${jar.file}" quiet="true"/>
- </target>
- <target name="init" depends="clean">
- <mkdir dir="${build.dir}"/>
- </target>
- <target name="compile" depends="init">
- <echo>compile the source</echo>
- <javac srcdir="${src.dir}" destdir="${build.dir}">
- <include name="**/*.java"/>
- <classpath refid="classpath"/>
- </javac>
- </target>
- <target name="jar" depends="compile">
- <jar destfile="${lib.dir}/${jar.file}">
- <fileset dir="${build.dir}">
- <include name="**/*.class"/>
- </fileset>
- <manifest>
- <attribute name="Main-Class" value="Demo"/>
- <attribute name="Class-Path" value="axis.jar commons-discovery-0.2.jar commons-logging.jar jaxrpc.jar saaj.jar wsdl4j-1.5.1.jar"/>
- </manifest>
- </jar>
- </target>
- <target name="run" depends="jar">
- <java jar="${lib.dir}/${jar.file}" fork="yes">
- </java>
- </target>
- </project>
<project name="client" default="compile" basedir=".">
<property name="product" value="client"/>
<property name="version" value="1.0"/>
<property name="src.dir" value="${basedir}/src"/>
<property name="build.dir" value="${basedir}/build"/>
<property name="lib.dir" value="${basedir}/lib"/>
<property name="jar.file" value="${product}.${version}.jar"/>
<path id="classpath">
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
<target name="clean">
<echo>clean build dir</echo>
<delete dir="${build.dir}" quiet="true"/>
<delete file="${lib.dir}/${jar.file}" quiet="true"/>
</target>
<target name="init" depends="clean">
<mkdir dir="${build.dir}"/>
</target>
<target name="compile" depends="init">
<echo>compile the source</echo>
<javac srcdir="${src.dir}" destdir="${build.dir}">
<include name="**/*.java"/>
<classpath refid="classpath"/>
</javac>
</target>
<target name="jar" depends="compile">
<jar destfile="${lib.dir}/${jar.file}">
<fileset dir="${build.dir}">
<include name="**/*.class"/>
</fileset>
<manifest>
<attribute name="Main-Class" value="Demo"/>
<attribute name="Class-Path" value="axis.jar commons-discovery-0.2.jar commons-logging.jar jaxrpc.jar saaj.jar wsdl4j-1.5.1.jar"/>
</manifest>
</jar>
</target>
<target name="run" depends="jar">
<java jar="${lib.dir}/${jar.file}" fork="yes">
</java>
</target>
</project>
当用java -jar yourJarExe.jar来运行一个经过打包的应用程序的时候,会发现如何设置-classpath参数应用程序都找不到相应的第三方类,报ClassNotFound错误。实际上这是由于当使用-jar参数运行的时候,java VM会屏蔽所有的外部classpath,而只以本yourJarExe.jar的内部class作为类的寻找范围,因此当使用-jar执行可执行Jar包时,JVM将Jar包所在目录设置为codebase目录,所有的class搜索都在这个目录下开始.所以如果使用了其他第三方的jar包,一个比较可以接受的可配置方案,就是利用jar包的Manifest扩展机制.
步骤如下:
1.将需要的第三方的jar包,复制在同可执行jar所在的目录或某个子目录下. 比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包复制到/usrhome目录下或/usrhome/lib 等类似的子目录下.
2.修改Manifest 文件
在Manifest.mf文件里加入如下行
Class-Path:classes12.jar lib/thirdlib.jar
Class-Path 是可执行jar包运行依赖的关键词