问题
这两天在写一个小东西。这个小东西是一个大东西的一部分。其实也就是其中的一两个类。而这个大东西需要部署到一个特定的环境中去运行。所以有一堆的限制条
件,比如什么配置文件啊,包名,版本之类的什么东西。稍微有点差错就没有办法运行。需要正确得到这些东西需要一个很庞大且冗长的构建过程。而我写的也就是
两三个类,所以最直接的方式就是把我写的java
文件编译或的class
文件直接复制到jar文件中。
完成这样工作有好几中方式,最直接的方式就是纯手工打造
PS:
这种方式费时费力,需要在不同的窗体间进行切换。例如我现在就在Eclipse、WinRaR和Windows资源管理器间切换。
解决过程
如何避免这个过程呢,尽量不用人来参与其中。这个肯定就是让一个小程序来把这几个动作连接起来。而且还要能够方便变动。比如我现在不想往a.jar
里面copy了。我想向b.jar
中复制了。所以就想到了脚本。对让脚本来完成这样的事情。第一反应想到的是ant
Ant 我的主角
Ant
是
何须人,就不用我多说了。其实我了解也不多,只是知道这个小蚂蚁蛮力超大。下面就着手解决问题。第一反应就是找到一个直接copy的任务,把
fileset中的文件复制到jar文件中。但是遗憾的是我没有能够找到这样一个Task.这个时候我的思维陷入了困境。下面该怎么办?
困境
没有现成的东西,没有现成的能一步完成的东西?如何是好?
我是程序员,所以我我自己可以写一个task来满足这样的需求啊。对啊,我可以自己写的!正当我为这个想法兴奋不已时,正卷起袖子准备“大干”的时候。突然想起某人说过 不要重新造轮子!
。所以就追问了我自己一句:拐
角处会有什么呢?
我的拐角
既然Ant有蛮力,我可否利用一下他的蛮力呢?通过如下的这么一个流程来达到我的目的。
这里用了一个temp文件夹作为中转,先解压,copy需要的文件,最后jar一下获得最后的更新好的jar。
最终获得了如下的build.xml
<target name="prepare">
<mkdir dir="${temp_dir}"/>
</target>
<target name="build" depends="prepare">
<echo message="unzip">Uzip Jar file</echo>
<unjar dest="${temp_dir}" src="${comp_plugin}/${contain_plugin}">
</unjar>
<copy todir="${temp_dir}">
<fileset dir="./bin">
</fileset>
</copy>
<jar update="true"
destfile="c:/${contain_plugin}"
basedir="${temp_dir}" >
</jar>
</target>
调整的过程
看上去,所有问题都解决了。但是偏偏在使用的时候遇到了小问题。我的jar包是要在osgi环境下工作的。所以特别依赖MANIFEST.MF文件。偏偏jar
这个任务默认情况下会生成一个默认的MANIFEST.MF文件。如果任由他胡来的话,就全虾米了。所以要稍微调整一下。
<jar update="true"
destfile="c:/${contain_plugin}"
basedir="${temp_dir}"
manifest="${temp_dir}/META-INF/MANIFEST.MF">
</jar>
<jar update="true"
destfile="c:/${contain_plugin}"
basedir="${temp_dir}"
manifest="${temp_dir}/META-INF/MANIFEST.MF">
</jar>
这样就可以了。大功告成!!