昨天在修改原先的dkrs的时候,遇到了几个问题:
1,内部类问题,原先是用三个数组来实现的,改成用一个object的list,一开始采用普通的内部类,一直显示new 这个类的时候,会报错,需要将父亲实例化了之后才能使用内部类,说明内部类是依赖于实例存在的。后来听同事说明,将其改成静态的类,就可以直接new了。
public class dkrs extends UDF {
private static ArrayList<IdEntity> pub_entity_list=new ArrayList<IdEntity>();
private static class IdEntity {
public Long minId;
public Long maxId;
public String dateStr;
IdEntity(){
}
public IdEntity(Long minId, Long maxId, String dateStr) {
this.minId = minId;
this.maxId = maxId;
this.dateStr = dateStr;
}
}
2,由于我机器上的环境和线上的环境不太一样,所以每次都是脚本写好后,传到相关的机器上,进行现场编译的。所以遇到了个内部类not found的问题。困扰了很久,后来才发现,及时内部类也会生成一个class文件,打包的时候需要将这个文件给包进来的,否则会一直提示class不存在。
dkrs$IdEntity.class
dkrs$1.class
dkrs.class
jar 的时候需要将这三个类都打包进去,尤其是前面两个带$符号的。一开始的时候忘记了,导致报错很长时间。
加进去之后就ok了。
过几天要写个自动化编译的脚本,麻烦死了。。。初步思想是:先scp源文件过来,然后进行本地编译,然后将编译好的文件打包,最后进行测试,测试用例可以用户自己输入。