上周钟哥要我写一个从国泰君安发送数据到资讯后台的程序。因为接口和数据发送的部分我已经做过很多次,在熟悉了oracle的数据库结构和sql语法之后,很快完成任务。但是由于这次程序是给公司外面的人用,程序的打包发布要求有所不同,需要更灵活的配置和安全的反编译机制。以前写的程序都是做成war包的形式放在自己的服务器上运行,而myeclipse拥有完善的war包发布功能,所以对java项目的打包原理并没有太多了解。这次自己打jar包和加密碰到了不少问题,不过最终还是顺利解决,收获不小。决定做些记录,以备后用。
java项目的打包其实比较简单,将项目的java文件编译以后,编写一个MANIFEST.MF文件,若需要打包后的jar文件可以直接运行,需要在MANIFEST.MF中加入maniclass: 包名.类名,表明项目运行的主类
本项目内容如下:Manifest-Version: 1.0
Created-By: Fat Jar Eclipse Plug-In
Main-Class: com.gw.sec.DecryptStart
如果引用到外部包,需要将外部包的class解压与项目class一同打包,myeclipse的fatjar插件实现了上述功能,在解压sqljdbc驱动的过程中,因为sqljdbc.jar是签名过的jar包,解压之后破坏了签名无法使用其中的class文件,后来找到解决方法如下,先解压原版sqljdbc.jar,重写一个MANIFEST.MF,内容如下:
Manifest-Version: 1.0
Main-Class:
Class-path: sqljdbc.jar
将MANIFEST文件与解压后的com文件夹放于同级目录下,然后在命令行下重新打包得到新的sqljdbc.jar,命令如下:jar -cvmf MANIFEST.MF sqljdbc.jar com
程序打包后,读取配置文件的路径与jar包在同级目录,并将jre放置与jar包同级目录下,编写bat文件:
set path=程序目录绝对路径\jre\bin
jar启动命令:java -jar .....
这样运行bat文件,系统就会调用程序目录jre下的java.exe,用户便无需自行安装jre也能运行程序,jre目录占空间比较大,90mb左右,可以视情况对目录进行精简,不必要的jar包,licence等可以删掉,只要保证程序能正常运行便可。
由于java的反编译十分方便,所以程序发布打包前应当对class文件进行加密,避免被他人反编译获取一些不希望被获取的信息。这里用到了java的jce框架,具体思路如下,通过一个keyGenerator类根据DES算法生成一个密钥文件key.data,
String keyFilename = "key.data";
String algorithm = "DES";
// 生成密匙
SecureRandom sr = new SecureRandom();
KeyGenerator kg = KeyGenerator.getInstance( algorithm );
kg.init( sr );
SecretKey key = kg.generateKey();
// 把密匙数据保存到文件
Util.writeFile( keyFilename, key.getEncoded()
然后运行加密类EncryptClass读取密钥对指定class文件进行加密,一般加密项目class文件便可,
将解密类DecryptStart与项目class一同打包,每次要运行程序时先启动DecryptStart类,读取密钥,通过反射机制解密主类class,并调用其main方法,然后解密所调用的其他类,运行程序。
转载此处:http://www.cnblogs.com/sfmjp/articles/2864908.html