解決maven打入本地jar包遇到的問題


項目中集成自己寫的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

問題解決!!!

 

這是一篇很無聊的博客!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM