項目中集成自己寫的jar包時發現了一些問題:
1、集成本地jar包本身比較簡單,但是考慮到團隊合作的問題,如果我只在maven本地私服導入jar包的話,其他團隊成員都要做相關操作,成本略高。
2、用依賴本地jar包+maven-install-plugin的方式集成,項目本地運行、打包都沒有問題,但是部署在服務器上,訪問到相關方法時,會有org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class的報錯。
當前的pom如下:
<dependency>
<groupId>*.*</groupId>
<artifactId>*</artifactId>
<version>*</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/taskqueue-1.0-SNAPSHOT.jar</systemPath>
</dependency>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> <executions> <execution> <id>install-external</id> <phase>clean</phase> <configuration> <file>${basedir}/src/main/resources/lib/taskqueue-1.0-SNAPSHOT.jar</file> <repositoryLayout>default</repositoryLayout> <groupId>*.*</groupId> <artifactId>*</artifactId> <version>*</version> <packaging>jar</packaging> <generatePom>true</generatePom> </configuration> <goals> <goal>install-file</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
報錯信息:
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class com.*.taskqueue.utils.RedisUt ils at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1053) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:998) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:901) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:875) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
可以看到報錯是NoClassDefFoundError,大概可以判斷可能是由於兩種問題導致
1、沒有引入相應的jar包
2、兩個jar包中都有這個class,無法確認是引用的哪一個,就是jar沖突
打開編譯完成的jar包
發現確實有兩個,手動刪除一個再發布運行,錯誤沒變,然而又確實存在jar包,包的大小也一樣,心態有點炸。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
回來了
小問題處理了一天,時間都花在maven打包上了,后來才發現是因為集成的jar包里面的配置文件沒有讀到,錯誤又被catch了所以啟動沒有停止,日志太多沒注意看,中間的報錯信息如下:
2020-03-19 15:54:00.405 * [async-service-1] ERROR o.s.a.i.SimpleAsyncUncaughtExceptionHandler - Unexpected exception occurred invoking async method: public void com.*.framework.task.AsyncServiceImpl.executeAsync() java.lang.ExceptionInInitializerError: null at com.*.taskqueue.plan.RedisDelayPlan.<init>(RedisDelayPlan.java:19) at com.*.framework.task.AsyncServiceImpl.executeAsync(AsyncServiceImpl.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NullPointerException: null at java.util.Properties$LineReader.readLine(Unknown Source) at java.util.Properties.load0(Unknown Source) at java.util.Properties.load(Unknown Source) at com.*.taskqueue.utils.RedisUtils.<clinit>(RedisUtils.java:27) ... 14 common frames omitted
處理方向轉移為配置的讀取問題,當前的情況是配置文件在jar包里都有,本地執行正常,部署的jar包執行不正常。
為了節省寶貴的時間,將配置讀取方式改為調用時傳入,再初始化連接,使用雙檢鎖方式確保單例,參考
https://blog.csdn.net/absolute_chen/article/details/93380566
問題解決!!!
這是一篇很無聊的博客!!!