zoukankan      html  css  js  c++  java
  • 解决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

    问题解决!!!

    这是一篇很无聊的博客!!!

  • 相关阅读:
    HashMap 的实现原理(1.8)
    HashMap 的实现原理(1.7)
    Java面试总结 -2018(补录)
    在java中写出完美的单例模式
    ArrayList实现原理分析
    Ngigx+Tomcat配置动静分离,负载均衡
    微信小程序——常用快捷键【四】
    Linux服务器下安装vmware虚拟机
    微信小程序——部署云函数【三】
    微信小程序——安装开发工具和环境【二】
  • 原文地址:https://www.cnblogs.com/superJF/p/12522165.html
Copyright © 2011-2022 走看看