想将写出来的java程序打包成.jar方式
以操作HDFS的程序来做示例, 一般情况下,使用idea方式打包出来的jar文件里只有程序本身 .class文件,没有依赖包,
所以单独的jar包不能独立运行.
第一种方式
可以使用命令
hadoop jar demo-1.0-SNAPSHOT.jar com.hdfs.demo
的方式运行, hadoop命令运行时,所有的依赖包都被加载.
这种方式有弊端,
1.当有配置文件在jar包中时, 配置文件会读取失败.
读取方式 InputStream corexml = ClassLoader.getSystemResourceAsStream("etc/core-site.xml");
2. 依赖hadoop包
第二种方式
通过jinfo命令查看第一种方式 hadoop jar 进程, 加载的jar包都是 hadoop-2.9.2/share/hadoop/common/ hadoop-2.9.2/share/hadoop/hdfs/ hadoop-2.9.2/share/hadoop/yarn/ hadoop-2.9.2/share/hadoop/mapreduce/
可以使用命令
java -cp demo-1.0-SNAPSHOT.jar:hadoop-2.9.2/share/hadoop/common/lib/*:hadoop-2.9.2/share/hadoop/hdfs/lib/*:hadoop-2.9.2/share/hadoop/hdfs/*:hadoop-2.9.2/share/hadoop/common/* com.hdfs.demo
执行成功
说白了,就是加载指定目录下的依赖包. 也可以将这些依赖包拷到本地(./libs) 执行命令
java -cp demo-1.0-SNAPSHOT.jar:libs/* com.hdfs.demo
这里需要注意 加载一个目录下的jar包时 不可以写 :libs/*.jar 这种方式错误的
第三种方式
使用 jar 命令,将依赖包打成一个jar文件
命令: jar -cf demo.jar com etc libs
打出来的jar包没有指定 META-INF/MANIFEST.MF, 运行报错
java -jar demo.jar com.hdfs.demo
demo.jar中没有主清单属性
MANIFEST.MF没有指定 Class-Path: 所以会找不到依赖包
指定 META-INF/MANIFEST.MF 文件 编辑内容
Manifest-Version: 1.0 ##该文件格式非常严格
Main-Class: com.hdfs.demo ##可以不写
Class-Path: libs/activation-1.1.jar #每个 libs/activation-1.1.jar 前后必须有一个空格
libs/apacheds-i18n-2.0.0-M15.jar #所有的依赖都要有, 不能缺少, 不能使用 libs/* 代替
libs/apacheds-kerberos-codec-2.0.0-M15.jar
libs/api-asn1-api-1.0.0-M20.jar
libs/api-util-1.0.0-M20.jar
libs/asm-3.2.jar
libs/avro-1.7.7.jar
libs/commons-beanutils-1.7.0.jar
libs/commons-beanutils-core-1.8.0.jar
libs/commons-cli-1.2.jar
libs/commons-codec-1.4.jar
libs/commons-collections-3.2.2.jar
libs/commons-compress-1.4.1.jar
libs/commons-configuration-1.6.jar
libs/commons-daemon-1.0.13.jar
libs/commons-digester-1.8.jar
libs/commons-io-2.4.jar
libs/commons-lang-2.6.jar
libs/commons-lang3-3.4.jar
libs/commons-logging-1.1.3.jar
libs/commons-math3-3.1.1.jar
libs/commons-net-3.1.jar
libs/curator-client-2.7.1.jar
libs/curator-framework-2.7.1.jar
libs/curator-recipes-2.7.1.jar
libs/gson-2.2.4.jar
libs/guava-11.0.2.jar
libs/hadoop-annotations-2.9.2.jar
libs/hadoop-auth-2.9.2.jar
libs/hadoop-common-2.9.2.jar
libs/hadoop-hdfs-2.9.2.jar
libs/hadoop-hdfs-client-2.9.2.jar
libs/hadoop-hdfs-native-client-2.9.2.jar
libs/hadoop-hdfs-nfs-2.9.2.jar
libs/hadoop-hdfs-rbf-2.9.2.jar
libs/hadoop-nfs-2.9.2.jar
libs/hamcrest-core-1.3.jar
libs/htrace-core4-4.1.0-incubating.jar
libs/httpclient-4.5.2.jar
libs/httpcore-4.4.4.jar
libs/jackson-annotations-2.7.8.jar
libs/jackson-core-2.7.8.jar
libs/jackson-core-asl-1.9.13.jar
libs/jackson-databind-2.7.8.jar
libs/jackson-jaxrs-1.9.13.jar
libs/jackson-mapper-asl-1.9.13.jar
libs/jackson-xc-1.9.13.jar
libs/java-xmlbuilder-0.4.jar
libs/jaxb-api-2.2.2.jar
libs/jaxb-impl-2.2.3-1.jar
libs/jcip-annotations-1.0-1.jar
libs/jersey-core-1.9.jar
libs/jersey-json-1.9.jar
libs/jersey-server-1.9.jar
libs/jets3t-0.9.0.jar
libs/jettison-1.1.jar
libs/jetty-6.1.26.jar
libs/jetty-sslengine-6.1.26.jar
libs/jetty-util-6.1.26.jar
libs/jsch-0.1.54.jar
libs/json-smart-1.3.1.jar
libs/jsp-api-2.1.jar
libs/jsr305-3.0.0.jar
libs/junit-4.11.jar
libs/leveldbjni-all-1.8.jar
libs/log4j-1.2.17.jar
libs/mockito-all-1.8.5.jar
libs/netty-3.6.2.Final.jar
libs/netty-all-4.0.23.Final.jar
libs/nimbus-jose-jwt-4.41.1.jar
libs/okhttp-2.7.5.jar
libs/okio-1.6.0.jar
libs/paranamer-2.3.jar
libs/protobuf-java-2.5.0.jar
libs/servlet-api-2.5.jar
libs/slf4j-api-1.7.25.jar
libs/slf4j-log4j12-1.7.25.jar
libs/snappy-java-1.0.5.jar
libs/stax2-api-3.1.4.jar
libs/stax-api-1.0-2.jar
libs/woodstox-core-5.0.3.jar
libs/xercesImpl-2.9.1.jar
libs/xml-apis-1.3.04.jar
libs/xmlenc-0.52.jar
libs/xz-1.0.jar
libs/zookeeper-3.4.6.jar
#最后必须有一个空行
然后执行命令
jar -cvmf MANIFEST.MF demo.jar com etc libs
打出来的jar文件可以直接运行 java -jar demo.jar
由于指定了Main-Class: com.hdfs.demo 可以直接使用 java -jar
Main-Class: 可以不指定
更通用的方式是 java -cp demo.jar com.hdfs.demo 或者 java -cp demo.jar com.hdfs.demo5 最后指定执行的不同类名