SpringXD 无法在 Uber Jar 的库中找到 类

SpringXD not able to find classes present in Uber Jar's lib

我在 Spring XD 中创建了一个自定义模块,其中我正在使用 ehcache.Other 访问 Oracle DB 并缓存结果,而不是我正在使用的 xd/lib 中存在的罐子"ehcache-2.9.0.jar and ojdbc6-11.1.0.7.0.jar" 在我的 module.I 中为我的自定义模块创建了 UBER jar。 Uber Jar/lib 包含额外的 jar 我 added.Module 当我在 XD env.How 中上传 uberjar 时,上传命令运行良好,当我创建流时,我得到 java.lang.NoClassDefFoundError: net/sf/ehcache/CacheManager。给出了堆栈跟踪 below.If 我将 ehcache-2.9.0.jar 放在 xd/lib 文件夹中并重新启动 xd 我能够创建流但是它违背了 uber jar 的目的。任何 suggestions/solution?

2015-10-05T21:52:37-0400 1.2.0.RELEASE INFO DeploymentSupervisor-0 zk.ZKStreamDeploymentHandler - Deployment status for stream 'reconPublicationDev': DeploymentStatus{state=failed,error(s)=org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'integrationEvaluationContext': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: net/sf/ehcache/CacheManager
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:303)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:736)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
        at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:139)
        at org.springframework.xd.module.core.SimpleModule.initialize(SimpleModule.java:213)
        at org.springframework.xd.dirt.module.ModuleDeployer.doDeploy(ModuleDeployer.java:217)
        at org.springframework.xd.dirt.module.ModuleDeployer.deploy(ModuleDeployer.java:200)
        at org.springframework.xd.dirt.server.container.DeploymentListener.deployModule(DeploymentListener.java:365)
        at org.springframework.xd.dirt.server.container.DeploymentListener.deployStreamModule(DeploymentListener.java:334)
        at org.springframework.xd.dirt.server.container.DeploymentListener.onChildAdded(DeploymentListener.java:181)
        at org.springframework.xd.dirt.server.container.DeploymentListener.childEvent(DeploymentListener.java:149)
        at org.apache.curator.framework.recipes.cache.PathChildrenCache.apply(PathChildrenCache.java:509)
        at org.apache.curator.framework.recipes.cache.PathChildrenCache.apply(PathChildrenCache.java:503)
        at org.apache.curator.framework.listen.ListenerContainer.run(ListenerContainer.java:92)
        at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:297)
        at org.apache.curator.framework.listen.ListenerContainer.forEach(ListenerContainer.java:83)
        at org.apache.curator.framework.recipes.cache.PathChildrenCache.callListeners(PathChildrenCache.java:500)
        at org.apache.curator.framework.recipes.cache.EventOperation.invoke(EventOperation.java:35)
        at org.apache.curator.framework.recipes.cache.PathChildrenCache.run(PathChildrenCache.java:762)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoClassDefFoundError: net/sf/ehcache/CacheManager
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.getDeclaredMethods(Class.java:1975)
        at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:571)
        at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:488)
        at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:474)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:241)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1065)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1038)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:860)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:790)
        at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:542)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:436)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:412)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:519)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:512)
        at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1052)
        at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:227)
        at org.springframework.integration.config.IntegrationEvaluationContextFactoryBean.afterPropertiesSet(IntegrationEvaluationContextFactoryBean.java:129)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
        ... 34 more
Caused by: java.lang.ClassNotFoundException: net.sf.ehcache.CacheManager
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 55 more

我的建议是使用 Maven Shaded Plugin 在 uber jar 中创建一个分解的依赖项。在您的情况下,ehcache 在模块类加载器中,Spring-Context & Spring-context-support 在父类加载器中。这将导致 bean(type) 注入失败。使用阴影插件创建具有必要依赖关系的 Uber jar 以及 Spring-Context 和 Spring-context-support。这个uber jar版本可以解决你的问题。

我会调查以下事项

1) 如果自定义模块已正确上传,即如果 uber jar 可用,请检查您的自定义模块文件夹。

2) 我会做一个 jar -vft <jar file name> 来查看包含违规 class 的 jar 是否确实在 Uber jar 中。

3) 如果我是 运行 分布式模式,那么我必须确保 custom-modules 文件夹在管理员和容器之间共享,并且容器节点 custom-modules 文件夹具有 jar 文件.了解必须共享 custom-modules 文件夹或通过外部方式使 admin 和容器之间的目录内容保持同步非常重要 - 如果您尚未设置,XD 将不会同步自定义模块文件夹作为共享文件夹。