用assembly打包一直報錯:
shangyanshuodeMacBook-Pro:target shangyanshuo$ java -jar jobscrawler-1.0-SNAPSHOT-jar-with-dependencies.jar 17-04-30 15:52:43,337 INFO org.springframework.context.support.ClassPathXmlApplicationContext(AbstractApplicationContext.java:495) ## Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@22927a81: startup date [Sun Apr 30 15:52:43 CST 2017]; root of context hierarchy 17-04-30 15:52:43,489 INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader(XmlBeanDefinitionReader.java:315) ## Loading XML bean definitions from class path resource [spring/applicationContext-myBatis.xml] 17-04-30 15:52:47,269 INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader(XmlBeanDefinitionReader.java:315) ## Loading XML bean definitions from class path resource [spring/applicationContext.xml] Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context] Offending resource: class path resource [spring/applicationContext.xml] at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68) at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85) at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:80) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:316) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1416) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1409) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:140) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:111) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:522) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:436) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.jobscrawler.crawlers.ShhCrawler.main(ShhCrawler.java:48)
網上看了一篇文章介紹說這是assembly打包spring項目的一個bug。
據說原因是spring的多個jar包中都含有spring.handlers和spring.schemas文件,而assembly只會把第一次遇到的文件打入jar包,后面遇到的都會skip掉。
總之就是打包的時候會漏掉你的配置文件。所以我們只能放棄這中打包方式,還有用shade打包的,經過我的實際使用也是不適用於我的情況。
最終我通過idea自帶的打包方式成功講spring+maven的項目打包成可執行的jar包,並運行成功。
我參考的就是這篇文章(http://www.jb51.net/article/101964.htm)寫的非常詳細。
用IDEA自帶的打包方式:
打開IDEA的file -> Project Structure,進入項目配置頁面。如下圖:

點擊Artifacts,進入Artifacts配置頁面,點擊 + ,選擇如下圖的選項。
進入Create JAR from Modules頁面,按照如下圖配置。
- 第一步選擇Main函數執行的類。
- 第二步選擇如圖的選項,目的是對第三方Jar包打包時做額外的配置,如果不做額外的配置可不選這個選項(但不保證打包成功)
- 第三步需要在src/main目錄下,新建一個resources目錄,將MANIFEST.MF文件保存在這里面,因為如果用默認缺省值的話,在IDEA12版本下會有bug。
點擊OK之后,出現如下圖界面,右鍵點擊<output root>,點擊Create Directory,創建一個libs,將所有的第三方JAR放進libs目錄下。
我是一個個的把下面的jar包拖進libs的,貌似都不可以批量拖進去。
成功之后,如下圖所示:
放入之后,點擊我們要打成的jar的名字,這里面是kafka-cps.jar,選擇classpath進行配置。
點擊右下角的...
編輯的結果如下:
在每一行的jar包前面添加我們剛剛新建的文件夾路徑,其實就是為了一個簡潔清晰。
這里將所有的jar都寫在libs/里面。點擊OK,回到配置頁面。
同時還注意在配置頁面,勾選build on make

最后點擊配置頁面的OK,完成配置。回到IDEA,點擊Build->Build Artifacts,選擇build

就會生成我們需要的jar包。其位置在項目目錄的out目錄下/out/artifacts/kafka_cps_jar。
下面放一個正確配置的清單文件內容
可能因為idea版本不一樣吧,我的jar包生成位置不一樣,我的位置在:

執行jar包:
我們在命令行進入到JobsCrawler_jar文件夾下,執行:java -jar JobsCrawler.jar
就看到執行成功的效果了。







