通过idea 打包 spring maven项目打包为可执行jar包

时间:2022-05-18 12:34:18

用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,进入项目配置页面。如下图:

通过idea 打包 spring maven项目打包为可执行jar包

 

点击Artifacts,进入Artifacts配置页面,点击 + ,选择如下图的选项。

通过idea 打包 spring maven项目打包为可执行jar包

 

进入Create JAR from Modules页面,按照如下图配置。

通过idea 打包 spring maven项目打包为可执行jar包

 

  • 第一步选择Main函数执行的类。
  • 第二步选择如图的选项,目的是对第三方Jar包打包时做额外的配置,如果不做额外的配置可不选这个选项(但不保证打包成功)
  • 第三步需要在src/main目录下,新建一个resources目录,将MANIFEST.MF文件保存在这里面,因为如果用默认缺省值的话,在IDEA12版本下会有bug。

点击OK之后,出现如下图界面,右键点击<output root>,点击Create Directory,创建一个libs,将所有的第三方JAR放进libs目录下。

通过idea 打包 spring maven项目打包为可执行jar包

 我是一个个的把下面的jar包拖进libs的,貌似都不可以批量拖进去。

成功之后,如下图所示:

通过idea 打包 spring maven项目打包为可执行jar包

 

放入之后,点击我们要打成的jar的名字,这里面是kafka-cps.jar,选择classpath进行配置。

通过idea 打包 spring maven项目打包为可执行jar包

 点击右下角的...

编辑的结果如下:

通过idea 打包 spring maven项目打包为可执行jar包

 

 在每一行的jar包前面添加我们刚刚新建的文件夹路径,其实就是为了一个简洁清晰。

这里将所有的jar都写在libs/里面。点击OK,回到配置页面。

同时还注意在配置页面,勾选build on make

通过idea 打包 spring maven项目打包为可执行jar包

 

最后点击配置页面的OK,完成配置。回到IDEA,点击Build->Build Artifacts,选择build

通过idea 打包 spring maven项目打包为可执行jar包

 

就会生成我们需要的jar包。其位置在项目目录的out目录下/out/artifacts/kafka_cps_jar

下面放一个正确配置的清单文件内容

通过idea 打包 spring maven项目打包为可执行jar包

 

可能因为idea版本不一样吧,我的jar包生成位置不一样,我的位置在:

通过idea 打包 spring maven项目打包为可执行jar包

 

执行jar包:

我们在命令行进入到JobsCrawler_jar文件夹下,执行:java -jar JobsCrawler.jar

就看到执行成功的效果了。