Dare To Think, Strive To Execute

Sbt打包时一些包找不到的问题

背景

  一直对于java打jar包一直半解,也从来没深究在idea 这个IDE中如何打jar包这个问题,为此自己在这个上面跳了很多坑。
  最近使用一个第三方包,本来在打包的时候一股脑都加进去了,但是在跑程序的时候总是会出现jar包找不到。我将打好的jar包解压缩以后,确实能找到我想要的那几个包名,可是程序就是找不到。当我采用外部加jar包的形式,程序就能顺利跑起来了。
error

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
input=/user/liping/ETL/test
output=/user/liping/ETL/result-after-transform
function run()
{
hadoop fs -rmr $output
${SPARK_HOME}/bin/spark-submit \
--master "spark://bda07:7077" \
--class "sparksql.reader.FormatTransform" \
--conf "spark.cores.max=10" \
--jars "./etl/spark-csv_2.10-1.5.0.jar:./etl/common-csv-1.1.jar" \
spark-sql.jar \
--input_pt $input \
--output_pt $output \
--input_format "json" \
--output_format "tsv"
}
run

  如此看来,我用idea打的jar包还确实没有将spark-csv_2.10-1.5.0.jar以及common-csv-1.1.jar这两个包打进去。为此我专门请请教了一个擅长java的同学,之后恍然大悟,原来打jar包里面是不能有其他的jar包的,如果需要某个类,应该先将该jar包解压后再跟源程序编译好的class文件一起打包,这也是为什么需要打extracted jar。因为extracted jar先将该jar包解压后再一起打包。同时解压两种方式打的jar包就可以明显看出二者的区别。同时我也意识到平时自己打的上百M的jar包,除了自己写的源文件编译后的class文件,其他一点用都没用。
下图是正确打包方式:
error
下图是我之前的打包方式:
error
下面是原本的jar解压后跟正确的jar解压后的对照图:
error