ant 打包 jar 可执行

打包成的jar可以执行需要注意的是 

1、依赖外部jar包的情况下,怎么可以让我们自己写的程序找到依赖的外部jar包

2、src目录下面的一些配置文件或者资源文件我们也需要拷贝到我们的jar包中

3、MANIFEST.MF文件中Class-Path 选项可以根据我们添加jar后自动修改,而不用我们手动在后面写一大段的

繁琐代码

<!-- convert build.classpath to mf.classpath (the string needed for the manifest task) -->
  <pathconvert property="mf.classpath" pathsep=" ">
      <path refid="build.classpath" />
      <flattenmapper />
  </pathconvert>

  <!-- now build the manifest file, using mf.classpath -->
  <tstamp/><!-- needed for TODAY -->
  <manifest file="MANIFEST.MF">
    <attribute name="Built-By" value="${manifest.built.by}"/>
    <attribute name="Created-By" value="${manifest.created.by}"/>
    <attribute name="Main-Class" value="${manifest.main.class}"/>
    <attribute name="Implementation-Version" value="${version.number}-b${build.number}"/>   
    <attribute name="Built-Date" value="${TODAY}"/>
    <attribute name="Class-Path" value="${mf.classpath}" />
  </manifest>

写好 MANIFEST.MF后就需要在打包的时候包含在我们的jar文件中,同时要注意依赖jar包的位置,一般我们都是放在lib目录下面。

 <!-- create the jar file, including the manifest file we just created -->
  <jar basedir="${dest.dir.classes}" 
       destfile="${package.file}"
       includes="**/*.*"
       excludes="**/*Test*"
       manifest="MANIFEST.MF" />

  <!-- copy all the jar files out to the destination directory (dest.dir) -->
  <copy todir="${dest.dir}">
    <fileset dir="${lib.dir}">
      <exclude name="junit*" />
      <include name="*.jar"/>
      <include name="*.zip"/>
    </fileset>
  </copy>

 

当打包完成后,我们就可以到deploy目录下面双击我们的jar包来运行了。可以看到界面(前提是你有提供界面)

打包后的目录结构:



 

我的界面如下



 

bulid.xml文件的内容

<?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="jar">

  <!-- Name of the output .jar file -->
  <property name="jar.name" value="jar_name.jar" />

  <!-- Base directory for distribution target -->
  <property name="deploy.home" value="deploy" />

  <!-- Base directory for compilation targets -->
  <property name="build.home" value="." />

  <!-- Main class -->
  <property name="main.class" value="com.chen.test.JTabbedPane2" />
 
  <!-- The base directory for all libraries (jar) files -->
  <property name="lib.home" value="lib" />

	<pathconvert property="mf.classpath" pathsep=" ">  
		  	      <mapper>  
		  	        <chainedmapper>  
		  	          <!-- remove absolute path -->  
		  	          <flattenmapper />  
		  	  
		  	          <!-- add lib/ prefix -->  
		  	          <globmapper from="*" to="lib/*" />  
		  	        </chainedmapper>  
		  	      </mapper>  
		  	      <path>  
		  	        <!-- lib.home contains all jar files,   
		  	                                        in several subdirectories -->  
		  	        <fileset dir="${lib.home}">  
		  	          <include name="**/*.jar" />  
		  	        </fileset>  
		  	      </path>  
		  	  
	</pathconvert> 
	
	<path id="classpath"> 
		<fileset file="${lib.dir}" includes="**/*.jar" />
	</path>	

    <target name="compile">
    	<mkdir dir="${deploy.home}/classes"/>
    	
    	<copydir dest="${deploy.home}/classes" src="resources"></copydir>
      	<copy todir="${deploy.home}/classes">
      		<fileset dir="src">
      			<exclude name="**/*.java"/>
      			<include name="**/*.*"/>
      		</fileset>
      	</copy>
    	<javac destdir="${deploy.home}/classes" classpathref="classpath" encoding="UTF-8">
    		<src path="src"/>
    		<src path="resources"/>
    	</javac>
    </target>
	<!-- Next, my package task uses that classpath -->
	<target name="jar" depends="compile">
	  
	  <!-- now build the manifest file, using mf.classpath -->
	  <tstamp/><!-- needed for TODAY -->
		  <manifest file="MANIFEST.MF">
		    <attribute name="Main-Class" value="${main.class}"/>
		    <attribute name="Built-Date" value="${TODAY}"/>
		    <attribute name="Class-Path" value="${mf.classpath}" />
		  </manifest>
		  
	  <!-- create the jar file, including the manifest file we just created -->
		
	<mkdir dir="${deploy.home}/lib"/>
	  <jar basedir="${deploy.home}/classes" 
	       destfile="${deploy.home}/${jar.name}"
	       includes="**/*.*"
	       manifest="MANIFEST.MF" />

	  <!-- copy all the jar files out to the destination directory (dest.dir) -->
	  <copy todir="${deploy.home}/lib">
	    <fileset dir="${lib.home}">
	      <exclude name="junit*" />
	      <include name="*.jar"/>
	      <include name="*.zip"/>
	    </fileset>
	  	
	  </copy>

	  <delete dir="${deploy.home}/classes" />
		
	</target>
</project>

 

猜你喜欢

转载自chen106106.iteye.com/blog/1783825