zoukankan      html  css  js  c++  java
  • 通过idea 打包 spring maven项目打包为可执行jar包

    用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

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

  • 相关阅读:
    Ubuntu 12.04 gedit编辑器 中文乱码
    ubuntu设置vim语法高亮显示和自动缩进
    Linux学习小结(转)
    指向常量的指针和常量指针
    Android之EditText
    android之TextView
    Android存储机制之Preference
    android实现可拖动按钮
    用turtle画图
    torchvision里densenet代码分析
  • 原文地址:https://www.cnblogs.com/guazi/p/6789679.html
Copyright © 2011-2022 走看看