Intellij IDEA打包文件manifest文件信息有误

Intellij IDEA 版本:ideaIC-2017.2.5

错误现象:

Intellij IDEA 中可以执行

提交到spark(standalone 本地master方式)中无法执行,报错信息如下:

SQLContextAPP是我要运行的主类(Main CLass),解压jar包发现SQLContextAPP是存在的,不知道为什么会报找不到类的错误

于是试了下本地采用scala(非spark)直接运行jar包,是可以找到SQLContextAPP类并执行的


即,错误现象总结为:

Intellij IDEA:可执行

本地启动Scala:可执行

提交至Spark:找不到执行主类





错误原因:

项目目录里manifest文件的内容在打包Bulid之后变掉了:

打包前:

Manifest-Version: 1.0
Main-Class: com.imooc.spark.SQLContextApp

打包后:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: pwendell
Build-Jdk: 1.6.0_65
Created-By: Apache Maven 3.2.2


不仅没了Main-CLass信息,还多出一些其他信息(jdk maven和我需要的版本还不一致)

原因众说纷纭,说是打包过程中无法读取manifest文件啦之类,其实这是Intellij IDEA的一个bug下面会说


解决方法:

以下是正确的打包过程:

1.进入Project Structure页面


2.左边树形区域选择Artifacts,点击+号,选择JAR--->From moudles with depenencies


3.会弹出【Create JAR from Moudles】对话框,点击Main Class栏后的【...】省略号,选择jar包要执行的主类,双击类名




4.可以看到主类已选中



5.接下来对后面两项进行选择(重要

1、【JAR files from libraries】

选择 copy to the output and link via manifest

(需要选择这个选项来配置MANIFEST.MF的路径

关于这两个选项的解释:

extract to the target JAR:将项目中所有依赖的jar包都打在一起

 copy to the output and link via manifest:仅将项目打包

(由于我们是提交到spark集群上运行,不需要将所有依赖的jar包都打在一起,所以选择copy to the output and link via manifest就好


2、【Directory for META-INF/MANIFEST.MF】

如图所示,红线部分是我project的路径,但按这个路径,在你接下来的Build过程中是找不到MANIFEST.MF文件的

这时就会自动生成一个,内容就会不对,我之前打包后MANIFEST信息变化就是因为这个原因引起的,这是Intellij IDEA的一个BUG

(http://stackoverflow.com/questions/15724091/how-to-run-a-jar-file-created-using-intellij-12
http://bglmmz.iteye.com/blog/2058785)


所以我们需要修改下MANIFEST.MF路径,前面部分不变,将路径中的scala改为resources

修改前:C:\Users\Administrator.PC-201709301524\IdeaProjects\ImoocSparkSQLProject\src\main\scala

修改后:C:\Users\Administrator.PC-201709301524\IdeaProjects\ImoocSparkSQLProject\src\main\resources







我的项目路径




上面信息配置好,点击OK后进入如下页面,

type上的other不用管它,也不用改成JAR,不然你又会陷入没有MANIFEST文件的循环中

勾选Include in project build

选好后点击OK

另外,这个Output directory路径就是一会儿jar包的存放路径,要记住哦,我的是:

C:\Users\Administrator.PC-201709301524\IdeaProjects\ImoocSparkSQLProject\out\artifacts\ImoocSparkSQLProject_jar



可以看到resources目录和MANIFEST文件都被创建;

双击MANIFEST.MF可确认文件内容,信息正确,可以看到Class-Path和Main CLass(在最下面,往下拖)都被创建


菜单栏选择Bulid---Artifact Build,会生成一个小面板,选择Build





可以在IDE的下方看到Building的进度



build完成之后可以在IDE左边的树形区域看到生成用于打包的target的目录和jar包的输出目录out都被创建

(我的是在out文件夹下,前面编辑的时候output directory中有写到,各位还请根据自己的实际情况找到输出路径)


 

展开ImoocSparkSQLProject_jar,可以看到项目的jar包


按照当时配置的output directory的路径下去找到jar包

解压确认下MANIFEST文件内容,内容正常,可以看到主类信息

Manifest-Version: 1.0

Main-Class: com.imooc.spark.SQLContextApp

Class-Path: oro-2.0.8.jar maven-settings-builder-3.0.jar slf4j-api-1.7
 .16.jar objenesis-2.1.jar jackson-mapper-asl-1.9.11.jar asm-5.1.jar s
 isu-guice-2.1.7-noaop.jar minlog-1.3.0.jar commons-net-2.2.jar jul-to
 -slf4j-1.7.16.jar commons-collections-3.2.2.jar leveldbjni-all-1.8.ja
 r stream-2.7.0.jar curator-client-2.6.0.jar spark-unsafe_2.11-2.2.0.j
 ar spark-tags_2.11-2.2.0.jar plexus-interpolation-1.14.jar scalap-2.1
 1.0.jar commons-httpclient-3.1.jar jackson-core-2.6.5.jar commons-cli
 -1.2.jar commons-crypto-1.0.0.jar antlr4-runtime-4.5.3.jar univocity-
 parsers-2.2.1.jar metrics-json-3.1.2.jar jcl-over-slf4j-1.7.16.jar js
 r305-1.3.9.jar avro-ipc-1.7.7-tests.jar jersey-container-servlet-2.22
 .2.jar hadoop-yarn-common-2.6.5.jar jersey-common-2.22.2.jar jackson-
 annotations-2.6.0.jar guava-19.0.jar maven-model-3.0.jar jaxb-api-2.2
 .2.jar commons-digester-1.8.jar spark-network-common_2.11-2.2.0.jar j
 son4s-jackson_2.11-3.2.11.jar aether-util-1.7.jar hadoop-mapreduce-cl
 ient-jobclient-2.6.5.jar bcprov-jdk15on-1.51.jar hadoop-hdfs-2.6.5.ja
 r asm-commons-5.1.jar activation-1.1.1.jar aether-api-1.7.jar scala-x
 ml_2.11-1.0.1.jar maven-plugin-api-3.0.jar hk2-api-2.4.0-b34.jar gson
 -2.2.4.jar commons-lang3-3.5.jar spark-network-shuffle_2.11-2.2.0.jar
  py4j-0.10.4.jar hadoop-client-2.6.5.jar maven-artifact-transfer-0.9.
 0.jar maven-settings-3.0.jar metrics-graphite-3.1.2.jar spark-sketch_
 2.11-2.2.0.jar maven-artifact-3.0.jar htrace-core-3.0.4.jar aether-ut
 il-0.9.0.M2.jar avro-ipc-1.7.7.jar hadoop-common-2.6.5.jar apacheds-i
 18n-2.0.0-M15.jar commons-beanutils-core-1.8.0.jar apacheds-kerberos-
 codec-2.0.0-M15.jar maven-shade-plugin-3.0.0.jar kryo-shaded-3.0.3.ja
 r ivy-2.4.0.jar jdom-1.1.3.jar parquet-hadoop-1.8.2.jar lz4-1.3.0.jar
  snappy-java-1.1.2.6.jar spark-catalyst_2.11-2.2.0.jar jackson-databi
 nd-2.6.5.jar api-asn1-api-1.0.0-M20.jar curator-framework-2.6.0.jar x
 ercesImpl-2.9.1.jar java-xmlbuilder-1.0.jar hadoop-mapreduce-client-s
 huffle-2.6.5.jar httpclient-4.3.6.jar jdependency-1.1.jar avro-mapred
 -1.7.7-hadoop2.jar scala-library-2.11.8.jar commons-math3-3.4.1.jar a
 sm-tree-5.1.jar asm-util-5.0.4.jar plexus-component-annotations-1.5.5
 .jar commons-io-2.5.jar commons-compiler-3.0.0.jar scala-compiler-2.1
 1.0.jar maven-aether-provider-3.0.jar plexus-utils-3.0.24.jar jersey-
 guava-2.22.2.jar json4s-ast_2.11-3.2.11.jar hadoop-yarn-server-common
 -2.6.5.jar javax.inject-2.4.0-b34.jar parquet-common-1.8.2.jar curato
 r-recipes-2.6.0.jar api-util-1.0.0-M20.jar parquet-encoding-1.8.2.jar
  log4j-1.2.17.jar hadoop-mapreduce-client-app-2.6.5.jar jackson-modul
 e-paranamer-2.6.5.jar jetty-util-6.1.26.jar javax.ws.rs-api-2.0.1.jar
  commons-beanutils-1.7.0.jar plexus-sec-dispatcher-1.3.jar xml-apis-1
 .3.04.jar hadoop-yarn-client-2.6.5.jar commons-codec-1.10.jar maven-d
 ependency-tree-2.2.jar zookeeper-3.4.6.jar mail-1.4.7.jar hadoop-mapr
 educe-client-common-2.6.5.jar jersey-container-servlet-core-2.22.2.ja
 r scala-parser-combinators_2.11-1.0.1.jar parquet-column-1.8.2.jar ha
 doop-mapreduce-client-core-2.6.5.jar paranamer-2.3.jar spark-sql_2.11
 -2.2.0.jar mx4j-3.0.2.jar chill-java-0.8.0.jar sisu-inject-plexus-1.4
 .2.jar parquet-jackson-1.8.2.jar jersey-server-2.22.2.jar commons-con
 figuration-1.6.jar commons-lang-2.6.jar protobuf-java-2.5.0.jar pyrol
 ite-4.13.jar jackson-module-scala_2.11-2.6.5.jar xbean-asm5-shaded-4.
 4.jar maven-common-artifact-filters-3.0.0.jar hadoop-annotations-2.6.
 5.jar maven-model-builder-3.0.jar spark-launcher_2.11-2.2.0.jar netty
 -3.9.9.Final.jar osgi-resource-locator-1.0.1.jar json4s-core_2.11-3.2
 .11.jar jackson-jaxrs-1.9.13.jar javax.annotation-api-1.2.jar hk2-loc
 ator-2.4.0-b34.jar compress-lzf-1.0.3.jar aether-spi-1.7.jar stax-api
 -1.0-2.jar plexus-classworlds-2.2.3.jar maven-shared-utils-3.0.0.jar 
 plexus-cipher-1.4.jar maven-core-3.0.jar metrics-core-3.1.2.jar jacks
 on-xc-1.9.13.jar base64-2.3.8.jar aopalliance-repackaged-2.4.0-b34.ja
 r validation-api-1.1.0.Final.jar hk2-utils-2.4.0-b34.jar aether-impl-
 1.7.jar jackson-core-asl-1.9.11.jar scala-reflect-2.11.8.jar xmlenc-0
 .52.jar hadoop-yarn-api-2.6.5.jar spark-core_2.11-2.2.0.jar xz-1.0.ja
 r metrics-jvm-3.1.2.jar javax.servlet-api-3.1.0.jar hadoop-auth-2.6.5
 .jar avro-1.7.7.jar httpcore-4.3.3.jar sisu-inject-bean-1.4.2.jar chi
 ll_2.11-0.8.0.jar slf4j-log4j12-1.7.16.jar janino-3.0.0.jar asm-analy
 sis-5.0.4.jar unused-1.0.0.jar javassist-3.18.1-GA.jar jersey-client-
 2.22.2.jar RoaringBitmap-0.5.11.jar parquet-format-2.3.1.jar maven-re
 pository-metadata-3.0.jar jets3t-0.9.3.jar jersey-media-jaxb-2.22.2.j
 ar commons-compress-1.4.1.jar netty-all-4.0.43.Final.jar



#.打包过程中的其他问题:manifest.mf already exists in vfs


这是因为你之前已经打过包了,那时已经生成一份MAMIFEST.MF文件了,需要到project的相应路径(就是你打包的时候选择生成META-INF/MANIFEST.MF的那个路径)下将其删除

比如我的是在项目的scr\main\resources中,果然有一份MAMIFEST.MF,是上次打包生成的,把这个文件删除再重新打包即可




如图所示,红线部分是我project的路径,但按这个路径打包是找不到MANIFEST.MF文件的

打包时就会自动生成一个,内容就会不对,我之前打包后MANIFEST信息变化就是因为这个原因引起的,由于找不到项目的MANIFEST文件,自动生成


所以我们需要修改下MANIFEST.MF路径,前面部分不变,将路径中的scala改为resources

修改前:C:\Users\Administrator.PC-201709301524\IdeaProjects\ImoocSparkSQLProject\src\main\scala

修改后:C:\Users\Administrator.PC-201709301524\IdeaProjects\ImoocSparkSQLProject\src\main\resources


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值