背景:前段时间一直在开发一个基于phoenix的hbase查询接口,由于依赖的hdfs及hbase原生jar包过多,并且之前很少做java开发,不知道 java -cp 的具体使用方法,导致每次打包比较臃肿,且开发完成后大部分时间都是在等待jar包上传。 ps:由于公司网络安全规定,本地计算机不能与生产网络相连,必须通过跳板机,所以一般是本地开发代码->上传jar->调试->修改->上传 直到功能测试通过。
先说下自己爬的坑吧,之前使用eclipse打包方式都是打包成可执行jar。由于我依赖的jar包大概有100多个,合计100M左右,导致每次打包出来的jar包都是100M+。并且每次有新的需求我就要重新下载jar包,在本地编译,打包然后再上传。之前也尝试过java -cp 命令,我是这样使用的(如下图),估计很多新手犯同样的错。
WTF,我在eclipse里面编译完全没问题,怎么拿出来就报错了呢?关键开始classNotFound报错,我TM不是java -cp 引用的hbase所有的jar包(lib包下),怎么会报找不到类呢?由于当时项目催的比较急,几次尝试失败后,我妥协了。
后面依次又接到了几个这样的需求开发,我想都没想,把原来的逻辑代码一改,打包,上传,OK,工作完成。效率还挺高。
但是后面的事情犹如一个晴天霹雳,我差点就GG了,平台升级,所有依赖jar包都升级了,然后业务这边的所有代码得重新用新的jar包编译。想想当初开发了这么多,现在要一个个改,蛋疼啊。为了避免再发生类似事情,我决定还是要找到好的解决办法。经过长时间的搜索和尝试,找到了两种方式解决。下面将依次说明。
(1)使用java -Djava.ext.dirs
这个命令是偶然看到的,后面发现挺好用的,并且可以和-cp参数并用。例如:
java -Djava.ext.dirs=D:\WorkSpace\lib -cp .;.\query.jar com.huawei.hbase.del.action.YunMain "select * from test limit 1"
将依赖的jar包放到D:\WorkSpace\lib目录即可,本地测试代码没有classNotFound报错,放到主机也能完美运行。
(2)java -cp
这个坑是搜了很久才搜索到的。具体用法如下:
java -cp .;D:\WorkSpace\lib\*;.\query.jar com.huawei.hbase.del.action.YunMain "select * from test limit 1"
注意的是lib\*而不是lib\*.jar。jaca -cp 引入jar包不支持*.jar这种通配,会无法匹配,但是*却可以。
这个真是个坑爹的地方啊。
PS:linux下使用-cp 只需将;替换成: