Spring xd SpringXD无法在Uber Jar';s库

Spring xd SpringXD无法在Uber Jar';s库,spring-xd,uberjar,Spring Xd,Uberjar,我在Spring XD中创建了一个自定义模块,其中我使用了Oracle DB并使用ehcache缓存结果。除了XD/lib中存在的jar之外,我在模块中使用了“ehcache-2.9.0.jar和ojdbc6-11.1.0.7.0.jar”。我为自定义模块创建了UBER jar。Uber Jar/lib包含我添加的两个附加Jar。当我在XD env中上载Uber Jar时,模块上载命令运行良好。但是,当我创建流时,我得到java.lang.NoClassDefFoundError:net/sf/

我在Spring XD中创建了一个自定义模块,其中我使用了Oracle DB并使用ehcache缓存结果。除了XD/lib中存在的jar之外,我在模块中使用了“ehcache-2.9.0.jar和ojdbc6-11.1.0.7.0.jar”。我为自定义模块创建了UBER jar。Uber Jar/lib包含我添加的两个附加Jar。当我在XD env中上载Uber Jar时,模块上载命令运行良好。但是,当我创建流时,我得到java.lang.NoClassDefFoundError:net/sf/ehcache/CacheManager。下面给出了堆栈跟踪。如果我将ehcache-2.9.0.jar放在xd/lib文件夹中并重新启动xd,我就能够创建流,但它无法实现uber jar的目的。有什么建议/解决方案吗

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$1.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$5.apply(PathChildrenCache.java:509)
        at org.apache.curator.framework.recipes.cache.PathChildrenCache$5.apply(PathChildrenCache.java:503)
        at org.apache.curator.framework.listen.ListenerContainer$1.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$10.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插件在uber jar中创建一个分解的依赖项。在您的例子中,ehcache位于模块Classloader中,而Spring上下文&Spring上下文支持位于父类加载器上。这将导致bean(类型)注入失败。使用着色插件创建Uber jar,它具有必要的依赖项以及Spring上下文和Spring上下文支持。这个uber jar版本将解决您的问题。

我的建议是使用Maven Shaded插件在uber jar中创建一个分解的依赖项。在您的例子中,ehcache位于模块Classloader中,而Spring上下文&Spring上下文支持位于父类加载器上。这将导致bean(类型)注入失败。使用着色插件创建Uber jar,它具有必要的依赖项以及Spring上下文和Spring上下文支持。这个uber jar版本将解决您的问题。

我将研究以下事项

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

2) 我会做一个
jar-vft
,看看包含违规类的jar是否确实在Uber jar中


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

我将研究以下事项

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

2) 我会做一个
jar-vft
,看看包含违规类的jar是否确实在Uber jar中

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