java引用外部大批量jar包

    背景:前段时间一直在开发一个基于phoenix的hbase查询接口,由于依赖的hdfs及hbase原生jar包过多,并且之前很少做java开发,不知道 java -cp 的具体使用方法,导致每次打包比较臃肿,且开发完成后大部分时间都是在等待jar包上传。 ps:由于公司网络安全规定,本地计算机不能与生产网络相连,必须通过跳板机,所以一般是本地开发代码->上传jar->调试->修改->上传 直到功能测试通过。

    先说下自己爬的坑吧,之前使用eclipse打包方式都是打包成可执行jar。由于我依赖的jar包大概有100多个,合计100M左右,导致每次打包出来的jar包都是100M+。并且每次有新的需求我就要重新下载jar包,在本地编译,打包然后再上传。之前也尝试过java -cp 命令,我是这样使用的(如下图),估计很多新手犯同样的错。

155728_DpmQ_2270245.png

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 只需将;替换成: 

 

 

转载于:https://my.oschina.net/cdsc/blog/690016

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值