Spring - 从依赖 JAR 文件加载服务和存储库
Posted
技术标签:
【中文标题】Spring - 从依赖 JAR 文件加载服务和存储库【英文标题】:Spring - Loading Services and Repositories from dependant JAR file 【发布时间】:2018-10-26 20:15:30 【问题描述】:我正在开发一个使用相同数据库(使用休眠)的 Web 项目和独立应用程序项目。两者都基于 Spring 并使用服务和存储库。由于这两个项目经常与相同的实体进行交互,因此我曾经在每个项目中拥有几乎每个存储库和服务的副本,这很难维护。我决定创建第三个项目并将所有通用代码放入其中。然后,我将生成的 jar 文件添加为本地 maven 依赖项,但是当代码为“本地”时,我在编译过去可以正常工作的东西时遇到错误。这是我的旧组件扫描注释:
@ComponentScan(basePackages = "com.mdenis.mdhis_webclient")
新类(jar 文件中不同包中的相同代码)位于不同的包中,所以我现在正在尝试这个:
@ComponentScan(basePackages = "com.mdenis.mdhis_common")
我仍然需要从旧的本地包中加载本地 bean,因此我最终需要进行组件扫描以检查 2 个不同的包,但现在我只是想通过它找到我的服务和存储库在他们新的“外部”位置。运行网络应用程序时出现此异常:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:740)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:716)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:619)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:491)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1641)
at sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1557)
at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:978)
at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:344)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
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.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:619)
at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:348)
at org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:52)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:417)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: Lcom/mdenis/mdhis_common/service/UserService;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
at java.lang.Class.getDeclaredFields(Class.java:1916)
at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:110)
at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:262)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationFilterAnnotations(WebAnnotationSet.java:108)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:65)
at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:328)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:778)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5003)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
... 41 more
Caused by: java.lang.ClassNotFoundException: com.mdenis.mdhis_common.service.UserService
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1275)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1104)
... 54 more
它只是在抱怨 UserService,但我在这个应用程序中有大约 30 项服务,我很确定在查找所有这些服务时遇到问题。我做错了什么来完成这项工作吗? Netbeans中jar文件加载正确,包结构正确。
* 编辑 *
这是我的 POM.xml 的一部分,用于加载我在第三个项目中编译的 jar。它被正确添加到项目中,依赖这些类的数百个类没有错误:
<dependency>
<groupId>com.mdenis</groupId>
<artifactId>MDHIS_Common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>$project.basedir/src/main/resources/MDHIS_Common.jar</systemPath>
</dependency>
问候
【问题讨论】:
你有 ClassNotFoundException。您的 jar 未正确加载 我将它添加为本地依赖项,它确实显示在 Netbeans 中的依赖项下,具有正确的包结构。 【参考方案1】:如果您只是将组件扫描更改为
@ComponentScan(basePackages = "com.mdenis")
或
@ComponentScan("com.mdenis.mdhis_webclient","com.mdenis.mdhis_common")
然后将扫描两个包。
【讨论】:
好主意,不幸的是完全相同的堆栈跟踪。由于执行没有达到我设置的任何断点,我没有找到调试方法。 赞成您的回答,因为它确实解决了我的多组件扫描问题!【参考方案2】:我发现了问题。 Maven 的系统范围假定您将自己提供这些类。我将我的 jar 安装到本地 Maven 存储库中并删除了范围和 systemPath 属性。现在一切都完美编译了。
【讨论】:
以上是关于Spring - 从依赖 JAR 文件加载服务和存储库的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot,无法从依赖项 jar 中读取 application.properties
[使用由IntelliJ从PropertiesLoader加载的Spring Boot模块时,NoClassDefFoundError