java 打包与运行
问题1:java -jar xxx.jar,运行jar包没有主属性清单
解决:打开压缩包打开文件夹META-INF,找到MANIFEST.MF文件,增加:
Main-Class: hadoop.HdfsTest(注意:冒号后面要有个空格,不然会提示invalid or corrupt jarfile,没有META-INF也会出现这个错误,而提示没有主属性清单一般是有META-INF文件夹但下面没有MANIFEST.MF文件 )
其中hadoop.HdfsTest为包名.类名
问题2:intelllij idea打包不含有META-INF
解决:选择“Main Class”后,选择“copy to the output and link via manifest”,打包时Directory for META-INF/MAINFEST.MF,此项默认为D:\workshop\DbUtil\src\main\java,需要改成:D:\workshop\DbUtil\src\main\resources,如果不这样修改,打成的jar包里没有包含META-INF/MAINFEST.MF文件。
若要将所有包放在一个目录里,则可新建个目录lib,将包拖动进去,然后注意改下面的classPath,前面加上目录:lib\
问题3:怎样运行有依赖的jar程序?
解决1:没有依赖时,java -jar xxx.jar, 要求jar 包含所依赖的所有东西,并且含有META-INF及其MANIFEST.MF, 否则会提示没有主属性清单
解决2:运行 eg:java -cp hbase_handles.jar; myhadoop.HdfsTest
其中-cp:classpath
hbase_handles.jar 指类路径下的jar文件,就是-cp指定的文件,不同的jar文件在windows中用";"隔开,在linux中用":"隔开
myhadoop.HdfsTest 这是一个类名,指主入口的类,myhadoop是一个包名,HdfsTest是这个包下的类名。
理解:如果hbase_handles.jar中包含所有依赖的jar,或者在MANIFEST.MF中已经指定了主属性入口即Main-Class及所有依赖的jar,即classpath,那么
java -jar hbase_handles.jar与
java -cp hbase_handles.jar; myhadoop.HdfsTest效果是一样的
本例:
Manifest-Version: 1.0
Class-Path: lib\xz-1.0.jar lib\asm-3.1.jar lib\guice-3.0.jar lib\avro-
1.7.4.jar lib\joni-2.1.2.jar lib\junit-4.12.jar lib\jsch-0.1.42.jar l
ib\xmlenc-0.52.jar lib\guava-12.0.1.jar lib\jets3t-0.9.0.jar lib\jett
y-6.1.26.jar lib\jsr305-1.3.9.jar lib\paranamer-2.3.jar lib\activatio
n-1.1.jar lib\commons-el-1.0.jar lib\commons-io-2.4.jar lib\hbase-it-
1.1.3.jar lib\httpcore-4.1.3.jar lib\javax.inject-1.jar lib\jaxb-api-
2.2.2.jar lib\jcodings-1.0.8.jar lib\jettison-1.3.3.jar lib\jsp-2.1-6
.1.14.jar lib\aopalliance-1.0.jar lib\commons-cli-1.2.jar lib\commons
-net-3.1.jar lib\disruptor-3.3.0.jar lib\jersey-core-1.9.jar lib\jers
ey-json-1.9.jar lib\libthrift-0.9.0.jar lib\servlet-api-2.5.jar lib\s
lf4j-api-1.7.7.jar lib\zookeeper-3.4.6.jar lib\commons-lang-2.6.jar l
ib\commons-math-2.2.jar lib\hbase-rest-1.1.3.jar lib\httpclient-4.2.5
.jar lib\jersey-guice-1.9.jar lib\commons-codec-1.9.jar lib\guice-ser
vlet-3.0.jar lib\hadoop-auth-2.5.1.jar lib\hadoop-hdfs-2.5.1.jar lib\
hbase-shell-1.1.3.jar lib\jackson-xc-1.9.13.jar lib\jackson-xc-1.9.13
.jar lib\jaxb-impl-2.2.3-1.jar lib\jersey-client-1.9.jar lib\jersey-s
erver-1.9.jar lib\jetty-util-6.1.26.jar lib\netty-3.2.4.Final.jar lib
\api-util-1.0.0-M20.jar lib\hbase-client-1.1.3.jar lib\hbase-common-1
.1.3.jar lib\hbase-server-1.1.3.jar lib\hbase-thrift-1.1.3.jar lib\js
p-api-2.1-6.1.14.jar lib\leveldbjni-all-1.8.jar lib\metrics-core-2.2.
0.jar lib\commons-logging-1.2.jar lib\commons-math3-3.1.1.jar lib\had
oop-client-2.5.1.jar lib\hadoop-common-2.5.1.jar lib\jamon-runtime-2.
3.1.jar lib\java-xmlbuilder-0.4.jar lib\protobuf-java-2.5.0.jar lib\s
nappy-java-1.0.4.1.jar lib\spymemcached-2.11.6.jar lib\commons-digest
er-1.8.jar lib\hbase-examples-1.1.3.jar lib\hbase-it-1.1.3-tests.jar
lib\hbase-protocol-1.1.3.jar lib\jackson-jaxrs-1.9.13.jar lib\jruby-c
omplete-1.6.8.jar lib\commons-daemon-1.0.13.jar lib\hadoop-yarn-api-2
.5.1.jar lib\hbase-procedure-1.1.3.jar lib\jasper-runtime-5.5.23.jar
lib\api-asn1-api-1.0.0-M20.jar lib\commons-compress-1.4.1.jar lib\com
mons-httpclient-3.1.jar lib\jasper-compiler-5.5.23.jar lib\jetty-ssle
ngine-6.1.26.jar lib\netty-all-4.0.23.Final.jar lib\servlet-api-2.5-6
.1.14.jar lib\apacheds-i18n-2.0.0-M15.jar lib\commons-beanutils-1.7.0
.jar lib\hbase-annotations-1.1.3.jar lib\hbase-prefix-tree-1.1.3.jar
lib\jackson-core-asl-1.9.13.jar lib\hadoop-annotations-2.5.1.jar lib\
hadoop-yarn-client-2.5.1.jar lib\hadoop-yarn-common-2.5.1.jar lib\hba
se-common-1.1.3-tests.jar lib\hbase-server-1.1.3-tests.jar lib\common
s-collections-3.2.2.jar lib\commons-configuration-1.6.jar lib\hbase-h
adoop-compat-1.1.3.jar lib\jackson-mapper-asl-1.9.13.jar lib\hbase-ha
doop2-compat-1.1.3.jar lib\hbase-resource-bundle-1.1.3.jar lib\common
s-beanutils-core-1.8.0.jar lib\findbugs-annotations-1.3.9-1.jar lib\h
trace-core-3.1.0-incubating.jar lib\hbase-annotations-1.1.3-tests.jar
lib\hadoop-yarn-server-common-2.5.1.jar lib\apacheds-kerberos-codec-
2.0.0-M15.jar lib\hadoop-mapreduce-client-app-2.5.1.jar lib\hadoop-ma
preduce-client-core-2.5.1.jar lib\hadoop-mapreduce-client-common-2.5.
1.jar lib\hadoop-mapreduce-client-shuffle-2.5.1.jar lib\hadoop-mapred
uce-client-jobclient-2.5.1.jar lib\spark-1.6.1-yarn-shuffle.jar lib\m
ysql-connector-java-5.1.39-bin.jar lib\spark-assembly-1.6.1-hadoop2.7
.1.jar
Main-Class: myhadoop.HdfsTest
可以看到hbase_handles.jar中如此多的依赖,当然我们可以删除其中的依赖,然后在运行的时候手动的增加依赖。如下:
Manifest-Version: 1.0
Class-Path:
Main-Class: myhadoop.HdfsTest
可以看到,当我们去除MANIFEST.MF中的依赖时,运行出现了错误,NoClassDefFoundError,说明依赖包的类没有找到。
当下面加上我们所依赖路径下的全部包时
java -cp D:\***\workspace\hbase_handles\out\artifacts\hbase_handles_jar\lib\*;hbase_handles.jar; myhadoop.HdfsTest
运行正常。
jar包依赖的添加我们可以用fatjar的形式也可以用这种一个个添加的形式,至于intellij idea中打包类似fatjar的还不是太了解。