tomcat在呼叫shared lib遇到的問題--gradle

qq_36821448發表於2018-03-28

    eclipse 在本地啟動tomcat跑專案,完全沒有問題,當打包部署伺服器時,發現報錯。

    當時我們遇到的問題直接顯示是

org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [DispatcherServlet] in context with path [/robot] threw exception [Request processing failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined] with root cause
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:371)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:370)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:271)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
        at com.sun.proxy.$Proxy61.findOneDebtorNameAudio(Unknown Source)
        at com.squ.robot.service.impl.NameCutServiceImpl.dealWavFile(NameCutServiceImpl.java:127)
        at com.squ.robot.controller.WavCheckController.uploadFile(WavCheckController.java:34)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

    各種找問題,查資料,網上大部分都是說JPA的使用問題,矛頭指向@Transactional 的使用上,這裡也mark一下吧,@Transactional 在jpa的使用中,對於update和delete必須宣告;

    後面不管怎麼除錯都不成功,然後發現本地可以,但是部署到測試的包上就不行,於是我就只能用最笨的方法,對比通過gradle命令打出來的war包和本地部署的tomcat下的webapps下的war是否有區別;

    對比發現gradle打包的war中缺少很大部分的jar,然後發現這部分缺少的jar放在來伺服器的tomcat的shared中,通過tomcat的conf中catalina.properties 載入,這裡包含了tomcat的jar和class的載入順序,省略1000字,mark一下;

    然後發現shared裡面的jar和部署war中有jar包的重疊,這就是產生問題的根本所在,於是就將所有重複的jar刪除後,重新打包就ok了。

    後續研究發現,報錯的重複的jar主要是spring-jms引起的,也就是gradle打包的時候將

providedCompile('org.springframework:spring-jms:4.1.4.RELEASE')

錯誤的寫成了

compile('org.springframework:spring-jms:4.1.4.RELEASE')

這樣就導致了war包重複打了這些包,一步步導致了上面的問題。

知識點三:gradle中:compile,providedCompile,runtime 的區別:

    僅在執行的時候需要,但是在編譯時不需要依賴,就用runtime ;前提:apply plugin: 'java';

    如果你的jar包/依賴程式碼 僅在編譯的時候需要,但是在執行時不需要依賴,就用providedCompile ;前提:apply plugin: 'war';

如果你的jar包/依賴程式碼 在編譯的時候需要依賴,在執行的時候也需要,那麼就用compile ;前提:apply plugin: 'war'或者apply plugin: 'java'

mark 一下。




相關文章