设为首页收藏本站

小牛社区-大数据学习交流社区|大数据免费学习资源

 找回密码
 立即注册!

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 322|回复: 0

记一次SpringMaven打包的坑

[复制链接]

175

主题

0

帖子

33

积分

吃土小白

Rank: 1

积分
33
发表于 2017-10-24 16:17:01 | 显示全部楼层 |阅读模式
原文出处: Hosee
 背景: 
  一个将kafka数据入库的项目,由于偷懒,直接想改动现成的Spring-ibait项目。
  做完dao层后,要将项目打成一个jar包,然后部署到服务器上运行。
  项目使用Maven来管理依赖。
 问题: 
  在网上查了相关Maven配置如下:
    
   
   
  org.apache.maven.plugins 
  maven-assembly-plugin 
  2.5.5 
   
   
   
  com.xxg.Main 
   
   
   
  jar-with-dependencies 
   
   
   
   
  make-assembly 
  package 
   
  single 
   
   
   
   
   

  使用mvn package打包,抛出如下错误:
 org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/aop]  
Offending resource: class path resource [beans.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:284) 
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1335) 
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1328) 
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135) 
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93) 
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:143) 
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178) 
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149) 
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212) 
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126) 
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92) 
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) 
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397) 
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139)  
at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83)  
at cn.com.ckx.service.UserServiceTest.testAdd(UserServiceTest.java:11)  
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
at java.lang.reflect.Method.invoke(Method.java:597)  
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)  
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)  
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)  
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)  
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)  
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)  
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)  
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)  
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)  
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)  
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)  
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)  
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
  查了网上的资料,发现是对应jar包没有添加。可是查了半天发现pom中的依赖都是全的。
 解决: 
  如果项目中用到了Spring Framework,将依赖打到一个jar包中,运行时会出现读取XML schema文件出错。原因是Spring Framework的多个jar包中包含相同的文件spring.handlers和spring.schemas,如果生成一个jar包会互相覆盖。为了避免互相影响,可以使用AppendingTransformer来对文件内容追加合并:
    
   
   
  org.apache.maven.plugins 
  maven-shade-plugin 
  2.4.1 
   
   
  package 
   
  shade 
   
   
   
   
  com.xxg.Main 
   
   
  META-INF/spring.handlers 
   
   
  META-INF/spring.schemas 
   
   
   
   
   
   
   

  再次报错:
 java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
  这是由于一些包重复引用,打包后的 META-INF 目录多出了一些 *.SF 等文件所致。
  pom中添加:
  
   
   
  *:* 
   
  META-INF/*.SF 
  META-INF/*.DSA 
  META-INF/*.RSA 
   
   
   

  最终的pom:
  
   
   
  org.apache.maven.plugins 
  maven-shade-plugin 
  1.4 
   
   
  package 
   
  shade 
   
   
   
   
  *:* 
   
  META-INF/*.SF 
  META-INF/*.DSA 
  META-INF/*.RSA 
   
   
   
   
   
  com.defonds.RsaEncryptor 
   
   
  META-INF/spring.handlers 
   
   
  META-INF/spring.schemas 
   
   
   
   
   
   
   
   
Reference: 
 http://blog.csdn.net/xiao__gui/article/details/47341385
http://www.mamicode.com/info-detail-447722.html 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册!

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册!

本版积分规则

快速回复 返回顶部 返回列表