问题
上篇文章:使用one-jar-appgen快速生成jar文件嵌套的eclipse工程中提到的方法适合于以下几个情况:
- 新建立工程。
- 原有工程目录结构与工具提供的类似,既build.xml的改动较小。
- 你是一个“拥抱变化”的哥们。
在其它情况下可以你就没有动力使用这个工具了。
one-jar-ant-task
本文说的方法是one-jar提供的另一个方法,直接使用ant的自定义task实现。这个方法相对于使用one-jar-appgen的方法更为轻量级一些。非常适合在已有工程上的build.xml上直接修改几处就可以了。好了,言归正传。
Step by Step
step0. 准备
eclipse工程
ant(已配置环境变量)
one-jar-ant-task.jar下载http://one-jar.sourceforge.net/index.php?page=downloads&file=downloads
step1. 新建一个工程
简单的写几行代码实现对外部jar的调用。
step2. 准备一个ant的build.xml文件
使程序能够编译通过,这时候调用jar任务的话生成的jar是不包含外部的jar文件的。
step3. 解压one-jar-ant-task.jar包
如c:/one-jar-ant-task
step4. 修改build.xml
这里有2个地方,引用自定义task,这里使用的是import的方法将one-jar-ant-task.jar中的one-jar-ant-task.xml文件进行引入。
代码如下:
<property name="one-jar.dist.dir" value="C:/Users/Wenyang/topcoder/tools/one-jar-ant-task-0.97" />
<import file="${one-jar.dist.dir}/one-jar-ant-task.xml" optional="true" />
然后是添加one-jar task:
代码如下:
<target name="one-jar" depends="jar" description="one-jar">
<manifest file="${manifest-one-jar.mf}">
<attribute name="Main-Class" value="com.simontuffs.onejar.Boot" />
<attribute name="One-Jar-Main-Class" value="com.xx.xx.demo.Demo" />
</manifest>
<one-jar destfile="one.jar" manifest="${manifest-one-jar.mf}">
<main>
<!-- Construct main.jar from classes and source code -->
<fileset dir="${build.class.product}" excludes="*test.class" />
</main>
<lib>
<fileset file="${wytools.dir}" />
</lib>
</one-jar>
</target>
这里有几个注意的地方:
关于manifest.mf文件中
- main-class: 必须为com.simontuffs.onejar.Boot
- one-jar-main-class:为你程序的启动类
关于one-jar task
- <main> 属性中应该使用fileset的方式指到编译完的class的位置,千万不要使用已经生成的jar文件。因为,在one-jar中会将我们的代码再次打包到main.jar中,这样就形成了3层的jar,程序运行时会报找不到主类的错误。
step5. 构建工程,运行jar
运行jar
后记:
最初了解到one-jar是在over-stack网站上看到的,调试这个工具花了1.5天的时间,就把遇到的问题记录下来。我个人还觉得使用one-jar-ant-task的方式更灵活一些吧。